Home | History | Annotate | Line # | Download | only in ffs
t_update_log.c revision 1.1
      1  1.1  jdolecek /*	$NetBSD: t_update_log.c,v 1.1 2017/03/22 21:33:53 jdolecek Exp $	*/
      2  1.1  jdolecek 
      3  1.1  jdolecek /*
      4  1.1  jdolecek  * Check log behaviour on mount updates
      5  1.1  jdolecek  */
      6  1.1  jdolecek 
      7  1.1  jdolecek #include <atf-c.h>
      8  1.1  jdolecek 
      9  1.1  jdolecek #define FSTEST_IMGSIZE (96 * 512)
     10  1.1  jdolecek #include "../common/h_fsmacros.h"
     11  1.1  jdolecek 
     12  1.1  jdolecek #include <sys/types.h>
     13  1.1  jdolecek #include <sys/mount.h>
     14  1.1  jdolecek 
     15  1.1  jdolecek #include <stdlib.h>
     16  1.1  jdolecek 
     17  1.1  jdolecek #include <ufs/ufs/ufsmount.h>
     18  1.1  jdolecek 
     19  1.1  jdolecek #include <rump/rump.h>
     20  1.1  jdolecek #include <rump/rump_syscalls.h>
     21  1.1  jdolecek 
     22  1.1  jdolecek #include "h_macros.h"
     23  1.1  jdolecek 
     24  1.1  jdolecek ATF_TC(updaterwtolog);
     25  1.1  jdolecek ATF_TC_HEAD(updaterwtolog, tc)
     26  1.1  jdolecek {
     27  1.1  jdolecek 
     28  1.1  jdolecek 	atf_tc_set_md_var(tc, "descr", "mounts file system with "
     29  1.1  jdolecek 	    "rw, then rw+log");
     30  1.1  jdolecek }
     31  1.1  jdolecek 
     32  1.1  jdolecek /*
     33  1.1  jdolecek  * PR kern/52056
     34  1.1  jdolecek  * This doesn't trigger panic with old, despite same operations triggering
     35  1.1  jdolecek  * it with live kernel.
     36  1.1  jdolecek  * Steps:
     37  1.1  jdolecek  * 1. boot singleuser
     38  1.1  jdolecek  * 2. mount -u /
     39  1.1  jdolecek  * 3. echo abc > abc
     40  1.1  jdolecek  * 4. mount -u -o log /
     41  1.1  jdolecek  * 5. echo abc >> abc
     42  1.1  jdolecek  *
     43  1.1  jdolecek  * Keeping around just in case.
     44  1.1  jdolecek  */
     45  1.1  jdolecek ATF_TC_BODY(updaterwtolog, tc)
     46  1.1  jdolecek {
     47  1.1  jdolecek 	char buf[1024];
     48  1.1  jdolecek 	struct ufs_args args;
     49  1.1  jdolecek 	int n = 10, fd;
     50  1.1  jdolecek 	const char *newfs_args = "-O2";
     51  1.1  jdolecek 	const char teststring[] = "6c894efc21094525ca1f974c0189b3b0c4e1f28d";
     52  1.1  jdolecek 
     53  1.1  jdolecek         snprintf(buf, sizeof(buf), "newfs -q user -q group -F -s 4000 -n %d "
     54  1.1  jdolecek             "%s %s", (n + 3), newfs_args, FSTEST_IMGNAME);
     55  1.1  jdolecek         if (system(buf) == -1)
     56  1.1  jdolecek                 atf_tc_fail_errno("cannot create file system");
     57  1.1  jdolecek 
     58  1.1  jdolecek         rump_init();
     59  1.1  jdolecek         if (rump_sys_mkdir(FSTEST_MNTNAME, 0777) == -1)
     60  1.1  jdolecek                 atf_tc_fail_errno("mount point create");
     61  1.1  jdolecek 
     62  1.1  jdolecek         rump_pub_etfs_register("/diskdev", FSTEST_IMGNAME, RUMP_ETFS_BLK);
     63  1.1  jdolecek 
     64  1.1  jdolecek         args.fspec = __UNCONST("/diskdev");
     65  1.1  jdolecek 
     66  1.1  jdolecek         if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, MNT_RDONLY,
     67  1.1  jdolecek             &args, sizeof(args)) == -1)
     68  1.1  jdolecek                 atf_tc_fail_errno("mount ffs rw %s", FSTEST_MNTNAME);
     69  1.1  jdolecek 
     70  1.1  jdolecek 	if (rump_sys_chdir(FSTEST_MNTNAME) == 1)
     71  1.1  jdolecek 		atf_tc_fail_errno("chdir");
     72  1.1  jdolecek 
     73  1.1  jdolecek         if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, MNT_UPDATE,
     74  1.1  jdolecek             &args, sizeof(args)) == -1)
     75  1.1  jdolecek                 atf_tc_fail_errno("mount ffs rw %s", FSTEST_MNTNAME);
     76  1.1  jdolecek 
     77  1.1  jdolecek 	RL(fd = rump_sys_open("dummy", O_CREAT | O_RDWR, 0755));
     78  1.1  jdolecek 	RL(rump_sys_write(fd, teststring, strlen(teststring)));
     79  1.1  jdolecek 	rump_sys_close(fd);
     80  1.1  jdolecek 
     81  1.1  jdolecek         if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, MNT_LOG|MNT_UPDATE,
     82  1.1  jdolecek             &args, sizeof(args)) == -1)
     83  1.1  jdolecek                 atf_tc_fail_errno("mount ffs rw log update %s", FSTEST_MNTNAME);
     84  1.1  jdolecek 
     85  1.1  jdolecek 	RL(fd = rump_sys_open("dummy", O_APPEND | O_RDWR, 0755));
     86  1.1  jdolecek 	RL(rump_sys_write(fd, teststring, strlen(teststring)));
     87  1.1  jdolecek 	rump_sys_close(fd);
     88  1.1  jdolecek 
     89  1.1  jdolecek 	/* otherwise we're do-ne */
     90  1.1  jdolecek }
     91  1.1  jdolecek 
     92  1.1  jdolecek ATF_TC(updaterwtolog_async);
     93  1.1  jdolecek ATF_TC_HEAD(updaterwtolog_async, tc)
     94  1.1  jdolecek {
     95  1.1  jdolecek 
     96  1.1  jdolecek 	atf_tc_set_md_var(tc, "descr", "mounts file system with "
     97  1.1  jdolecek 	    "rw+async, then rw+async+log");
     98  1.1  jdolecek }
     99  1.1  jdolecek 
    100  1.1  jdolecek /*
    101  1.1  jdolecek  * PR kern/52056
    102  1.1  jdolecek  */
    103  1.1  jdolecek ATF_TC_BODY(updaterwtolog_async, tc)
    104  1.1  jdolecek {
    105  1.1  jdolecek 	char buf[1024];
    106  1.1  jdolecek 	struct ufs_args args;
    107  1.1  jdolecek 	int n = 10, fd;
    108  1.1  jdolecek 	const char *newfs_args = "-O2";
    109  1.1  jdolecek 
    110  1.1  jdolecek         snprintf(buf, sizeof(buf), "newfs -q user -q group -F -s 4000 -n %d "
    111  1.1  jdolecek             "%s %s", (n + 3), newfs_args, FSTEST_IMGNAME);
    112  1.1  jdolecek         if (system(buf) == -1)
    113  1.1  jdolecek                 atf_tc_fail_errno("cannot create file system");
    114  1.1  jdolecek 
    115  1.1  jdolecek         rump_init();
    116  1.1  jdolecek         if (rump_sys_mkdir(FSTEST_MNTNAME, 0777) == -1)
    117  1.1  jdolecek                 atf_tc_fail_errno("mount point create");
    118  1.1  jdolecek 
    119  1.1  jdolecek         rump_pub_etfs_register("/diskdev", FSTEST_IMGNAME, RUMP_ETFS_BLK);
    120  1.1  jdolecek 
    121  1.1  jdolecek         args.fspec = __UNCONST("/diskdev");
    122  1.1  jdolecek 
    123  1.1  jdolecek         if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, 0,
    124  1.1  jdolecek             &args, sizeof(args)) == -1)
    125  1.1  jdolecek                 atf_tc_fail_errno("mount ffs rw %s", FSTEST_MNTNAME);
    126  1.1  jdolecek 
    127  1.1  jdolecek 	if (rump_sys_chdir(FSTEST_MNTNAME) == 1)
    128  1.1  jdolecek 		atf_tc_fail_errno("chdir");
    129  1.1  jdolecek 
    130  1.1  jdolecek 	RL(fd = rump_sys_open("dummy", O_CREAT | O_RDWR, 0755));
    131  1.1  jdolecek 	sprintf(buf, "test file");
    132  1.1  jdolecek 	RL(rump_sys_write(fd, buf, strlen(buf)));
    133  1.1  jdolecek 	rump_sys_close(fd);
    134  1.1  jdolecek 
    135  1.1  jdolecek         if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, MNT_LOG|MNT_ASYNC|MNT_UPDATE,
    136  1.1  jdolecek             &args, sizeof(args)) == -1)
    137  1.1  jdolecek                 atf_tc_fail_errno("mount ffs rw log update %s", FSTEST_MNTNAME);
    138  1.1  jdolecek 
    139  1.1  jdolecek 	/* otherwise we're do-ne */
    140  1.1  jdolecek }
    141  1.1  jdolecek 
    142  1.1  jdolecek ATF_TP_ADD_TCS(tp)
    143  1.1  jdolecek {
    144  1.1  jdolecek 	ATF_TP_ADD_TC(tp, updaterwtolog);
    145  1.1  jdolecek 	ATF_TP_ADD_TC(tp, updaterwtolog_async);
    146  1.1  jdolecek 
    147  1.1  jdolecek 	return atf_no_error();
    148  1.1  jdolecek }
    149