mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-18 00:58:31 +00:00
zdtm: Add unlink_regular00 test
Test checks that a deleted file content in a deleted parent directory restores right. Initially directory is created in a separate mount, to check the ghost file is created in right mount and link() in rfi_remap() is working. Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
This commit is contained in:
parent
e62f1aea52
commit
afe361f053
3 changed files with 111 additions and 0 deletions
|
|
@ -225,6 +225,7 @@ TST_DIR = \
|
|||
mnt_ext_master \
|
||||
mntns_deleted \
|
||||
binfmt_misc \
|
||||
unlink_regular00 \
|
||||
|
||||
TST_DIR_FILE = \
|
||||
chroot \
|
||||
|
|
|
|||
109
test/zdtm/live/static/unlink_regular00.c
Normal file
109
test/zdtm/live/static/unlink_regular00.c
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mount.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include "zdtmtst.h"
|
||||
|
||||
const char *test_doc = "Checkpointing/restore of unlinked file inside unlinked directory";
|
||||
const char *test_author = "Kirill Tkhai <ktkhai@virtuozzo.com>";
|
||||
|
||||
char *dirname;
|
||||
TEST_OPTION(dirname, string, "directory name", 1);
|
||||
|
||||
#define SUBDIR "subdir"
|
||||
#define FNAME "testfile"
|
||||
#define MSG "Hello!!!111"
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
char subdir[PATH_MAX], fname[PATH_MAX], lname[PATH_MAX];
|
||||
char buf[sizeof(MSG) + 1];
|
||||
int fd, ret = -1;
|
||||
|
||||
test_init(argc, argv);
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
|
||||
if (mkdir(dirname, 0777)) {
|
||||
fail("can't create %s", dirname);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (mount("none", dirname, "tmpfs", 0, "") < 0) {
|
||||
fail("can't mount tmpfs to %s", dirname);
|
||||
goto rm_topdir;
|
||||
}
|
||||
|
||||
sprintf(subdir, "%s/" SUBDIR, dirname);
|
||||
|
||||
if (mkdir(subdir, 0777)) {
|
||||
fail("can't create %s", subdir);
|
||||
goto umount;
|
||||
}
|
||||
|
||||
sprintf(fname, "%s/" SUBDIR "/" FNAME, dirname);
|
||||
sprintf(lname, "%s/" FNAME, dirname);
|
||||
|
||||
fd = open(fname, O_RDWR | O_CREAT, 0644);
|
||||
if (fd < 0) {
|
||||
fail("can't open %s", fname);
|
||||
rmdir(subdir);
|
||||
goto umount;
|
||||
}
|
||||
|
||||
if (link(fname, lname) < 0) {
|
||||
fail("can't link %s to %s", fname, lname);
|
||||
unlink(fname);
|
||||
rmdir(subdir);
|
||||
goto umount;
|
||||
}
|
||||
|
||||
if (unlink(fname) || rmdir(subdir)) {
|
||||
fail("can't unlink %s or %s", fname, subdir);
|
||||
goto close_file;
|
||||
}
|
||||
|
||||
if (write(fd, MSG, sizeof(MSG)) != sizeof(MSG)) {
|
||||
fail("can't write %s", fname);
|
||||
goto close_file;
|
||||
}
|
||||
|
||||
test_daemon();
|
||||
test_waitsig();
|
||||
|
||||
if (lseek(fd, 0, SEEK_SET) != 0) {
|
||||
fail("can't lseek %s", fname);
|
||||
goto close_file;
|
||||
}
|
||||
|
||||
if (read(fd, buf, sizeof(MSG)) != sizeof(MSG)) {
|
||||
fail("can't read %s", fname);
|
||||
goto close_file;
|
||||
}
|
||||
|
||||
if (strcmp(buf, MSG)) {
|
||||
fail("content differs: %s, %s, sizeof=%d", buf, MSG, sizeof(MSG));
|
||||
goto close_file;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
pass();
|
||||
|
||||
close_file:
|
||||
close(fd);
|
||||
unlink(lname);
|
||||
umount:
|
||||
if (umount(dirname) < 0)
|
||||
pr_err("Can't umount\n");
|
||||
rm_topdir:
|
||||
if (rmdir(dirname) < 0)
|
||||
pr_err("Can't rmdir()\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
1
test/zdtm/live/static/unlink_regular00.desc
Normal file
1
test/zdtm/live/static/unlink_regular00.desc
Normal file
|
|
@ -0,0 +1 @@
|
|||
{'flavor': 'ns', 'flags': 'suid'}
|
||||
Loading…
Add table
Add a link
Reference in a new issue