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