t_snapshot.c revision 1.1
11.1Spooka/* $NetBSD: t_snapshot.c,v 1.1 2010/04/12 22:58:53 pooka Exp $ */ 21.1Spooka 31.1Spooka#include <sys/types.h> 41.1Spooka#include <sys/ioctl.h> 51.1Spooka#include <sys/mount.h> 61.1Spooka 71.1Spooka#include <dev/fssvar.h> 81.1Spooka 91.1Spooka#include <rump/rump.h> 101.1Spooka#include <rump/rump_syscalls.h> 111.1Spooka 121.1Spooka#include <ufs/ufs/ufsmount.h> 131.1Spooka 141.1Spooka#include <atf-c.h> 151.1Spooka#include <fcntl.h> 161.1Spooka#include <stdio.h> 171.1Spooka#include <stdlib.h> 181.1Spooka#include <string.h> 191.1Spooka#include <unistd.h> 201.1Spooka 211.1Spooka#include "../../h_macros.h" 221.1Spooka 231.1Spooka#define IMGNAME "ffs.img" 241.1Spooka#define NEWFS "newfs -F -s 10000 " IMGNAME 251.1Spooka#define BAKNAME "/mnt/bak.img" 261.1Spooka 271.1SpookaATF_TC_WITH_CLEANUP(snapshot); 281.1SpookaATF_TC_HEAD(snapshot, tc) 291.1Spooka{ 301.1Spooka 311.1Spooka atf_tc_set_md_var(tc, "descr", "basic snapshot features"); 321.1Spooka} 331.1Spooka 341.1Spookastatic void 351.1Spookamakefile(const char *path) 361.1Spooka{ 371.1Spooka int fd; 381.1Spooka 391.1Spooka fd = rump_sys_open(path, O_CREAT | O_RDWR, 0777); 401.1Spooka if (fd == -1) 411.1Spooka atf_tc_fail_errno("create %s", path); 421.1Spooka rump_sys_close(fd); 431.1Spooka} 441.1Spooka 451.1SpookaATF_TC_BODY(snapshot, tc) 461.1Spooka{ 471.1Spooka char buf[1024]; 481.1Spooka struct ufs_args uargs; 491.1Spooka struct fss_set fss; 501.1Spooka int fssfd; 511.1Spooka int fd, fd2; 521.1Spooka 531.1Spooka if (system(NEWFS) == -1) 541.1Spooka atf_tc_fail_errno("cannot create file system"); 551.1Spooka 561.1Spooka rump_init(); 571.1Spooka 581.1Spooka if (rump_sys_mkdir("/mnt", 0777) == -1) 591.1Spooka atf_tc_fail_errno("mount point create"); 601.1Spooka if (rump_sys_mkdir("/snap", 0777) == -1) 611.1Spooka atf_tc_fail_errno("mount point 2 create"); 621.1Spooka 631.1Spooka rump_pub_etfs_register("./ffs.img", "./ffs.img", RUMP_ETFS_BLK); 641.1Spooka 651.1Spooka uargs.fspec = __UNCONST("./ffs.img"); 661.1Spooka 671.1Spooka if (rump_sys_mount(MOUNT_FFS, "/mnt", 0, &uargs, sizeof(uargs)) == -1) 681.1Spooka atf_tc_fail_errno("mount ffs"); 691.1Spooka 701.1Spooka#define TESTSTR1 "huihai\n" 711.1Spooka#define TESTSZ1 (sizeof(TESTSTR1)-1) 721.1Spooka#define TESTSTR2 "baana liten\n" 731.1Spooka#define TESTSZ2 (sizeof(TESTSTR2)-1) 741.1Spooka 751.1Spooka fd = rump_sys_open("/mnt/myfile", O_RDWR | O_CREAT, 0777); 761.1Spooka if (fd == -1) 771.1Spooka atf_tc_fail_errno("create file"); 781.1Spooka if (rump_sys_write(fd, TESTSTR1, TESTSZ1) != TESTSZ1) 791.1Spooka atf_tc_fail_errno("write fail"); 801.1Spooka 811.1Spooka fssfd = rump_sys_open("/dev/rfss0", O_RDWR); 821.1Spooka if (fd == -1) 831.1Spooka atf_tc_fail_errno("cannot open fss"); 841.1Spooka makefile(BAKNAME); 851.1Spooka memset(&fss, 0, sizeof(fss)); 861.1Spooka fss.fss_mount = __UNCONST("/mnt"); 871.1Spooka fss.fss_bstore = __UNCONST(BAKNAME); 881.1Spooka fss.fss_csize = 0; 891.1Spooka if (rump_sys_ioctl(fssfd, FSSIOCSET, &fss) == -1) 901.1Spooka atf_tc_fail_errno("create snapshot"); 911.1Spooka 921.1Spooka if (rump_sys_pwrite(fd, TESTSTR2, TESTSZ2, 0) != TESTSZ2) 931.1Spooka atf_tc_fail_errno("write fail"); 941.1Spooka rump_sys_sync(); 951.1Spooka 961.1Spooka uargs.fspec = __UNCONST("/dev/fss0"); 971.1Spooka 981.1Spooka /* technically we should fsck it first? */ 991.1Spooka if (rump_sys_mount(MOUNT_FFS, "/snap", 0, &uargs, sizeof(uargs)) == -1) 1001.1Spooka atf_tc_fail_errno("mount snapshot"); 1011.1Spooka 1021.1Spooka /* check for old contents */ 1031.1Spooka fd2 = rump_sys_open("/snap/myfile", O_RDONLY); 1041.1Spooka if (fd2 == -1) 1051.1Spooka atf_tc_fail_errno("fail"); 1061.1Spooka memset(buf, 0, sizeof(buf)); 1071.1Spooka if (rump_sys_read(fd2, buf, sizeof(buf)) == -1) 1081.1Spooka atf_tc_fail_errno("read snap"); 1091.1Spooka 1101.1Spooka /* check that new files are invisible in the snapshot */ 1111.1Spooka makefile("/mnt/newfile"); 1121.1Spooka if (rump_sys_open("/snap/newfile", O_RDONLY) != -1) 1131.1Spooka atf_tc_fail("newfile exists in snapshot"); 1141.1Spooka if (errno != ENOENT) 1151.1Spooka atf_tc_fail_errno("newfile open should fail with ENOENT"); 1161.1Spooka 1171.1Spooka /* check that removed files are still visible in the snapshot */ 1181.1Spooka rump_sys_unlink("/mnt/myfile"); 1191.1Spooka 1201.1Spooka if (rump_sys_open("/snap/myfile", O_RDONLY) == -1) 1211.1Spooka atf_tc_fail_errno("unlinked file no longer in snapshot"); 1221.1Spooka 1231.1Spooka ATF_CHECK(strcmp(buf, TESTSTR1) == 0); 1241.1Spooka} 1251.1Spooka 1261.1SpookaATF_TC_CLEANUP(snapshot, tc) 1271.1Spooka{ 1281.1Spooka 1291.1Spooka unlink(IMGNAME); 1301.1Spooka} 1311.1Spooka 1321.1SpookaATF_TP_ADD_TCS(tp) 1331.1Spooka{ 1341.1Spooka ATF_TP_ADD_TC(tp, snapshot); 1351.1Spooka return 0; 1361.1Spooka} 137