1272343Sngie/* $NetBSD: t_quota2_remount.c,v 1.4 2012/03/15 02:02:22 joerg Exp $ */ 2272343Sngie 3272343Sngie/* 4272343Sngie * Basic tests for quota2 5272343Sngie */ 6272343Sngie 7272343Sngie#include <atf-c.h> 8272343Sngie 9272343Sngie#include "../common/h_fsmacros.h" 10272343Sngie 11272343Sngie#include <sys/types.h> 12272343Sngie#include <sys/mount.h> 13272343Sngie#include <sys/statvfs.h> 14272343Sngie 15272343Sngie#include <stdlib.h> 16272343Sngie 17272343Sngie#include <ufs/ufs/ufsmount.h> 18272343Sngie 19272343Sngie#include <rump/rump.h> 20272343Sngie#include <rump/rump_syscalls.h> 21272343Sngie 22272343Sngie#include "../../h_macros.h" 23272343Sngie 24272343Sngiestatic void 25272343Sngiedo_quota(const atf_tc_t *tc, int n, const char *newfs_opts, int log) 26272343Sngie{ 27272343Sngie int i; 28272343Sngie char buf[1024]; 29272343Sngie int res; 30272343Sngie int fd; 31272343Sngie struct ufs_args uargs; 32272343Sngie struct statvfs fst; 33272343Sngie 34272343Sngie snprintf(buf, sizeof(buf), "newfs -q user -q group -F -s 4000 -n %d " 35272343Sngie "%s %s", (n + 3), newfs_opts, FSTEST_IMGNAME); 36272343Sngie if (system(buf) == -1) 37272343Sngie atf_tc_fail_errno("cannot create file system"); 38272343Sngie 39272343Sngie rump_init(); 40272343Sngie if (rump_sys_mkdir(FSTEST_MNTNAME, 0777) == -1) 41272343Sngie atf_tc_fail_errno("mount point create"); 42272343Sngie 43272343Sngie rump_pub_etfs_register("/diskdev", FSTEST_IMGNAME, RUMP_ETFS_BLK); 44272343Sngie 45272343Sngie uargs.fspec = __UNCONST("/diskdev"); 46272343Sngie 47272343Sngie /* read-only doens't have quota enabled */ 48272343Sngie if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, MNT_RDONLY, 49272343Sngie &uargs, sizeof(uargs)) == -1) 50272343Sngie atf_tc_fail_errno("mount ffs ro %s", FSTEST_MNTNAME); 51272343Sngie 52272343Sngie if (rump_sys_statvfs1(FSTEST_MNTNAME, &fst, 0) != 0) 53272343Sngie atf_tc_fail_errno("statbfs %s (1)", FSTEST_MNTNAME); 54272343Sngie 55272343Sngie if ((fst.f_flag & ST_QUOTA) != 0) 56272343Sngie atf_tc_fail("R/O filesystem has quota"); 57272343Sngie 58272343Sngie /* updating to read-write enables quota */ 59272343Sngie if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, 60272343Sngie MNT_UPDATE | (log ? MNT_LOG : 0), &uargs, sizeof(uargs)) == -1) 61272343Sngie atf_tc_fail_errno("mount ffs rw %s", FSTEST_MNTNAME); 62272343Sngie 63272343Sngie if (rump_sys_statvfs1(FSTEST_MNTNAME, &fst, 0) != 0) 64272343Sngie atf_tc_fail_errno("statbfs %s (2)", FSTEST_MNTNAME); 65272343Sngie 66272343Sngie if ((fst.f_flag & ST_QUOTA) == 0) 67272343Sngie atf_tc_fail("R/W filesystem has no quota"); 68272343Sngie 69272343Sngie /* we can update a second time */ 70272343Sngie if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, 71272343Sngie MNT_UPDATE | (log ? MNT_LOG : 0), &uargs, sizeof(uargs)) == -1) 72272343Sngie atf_tc_fail_errno("mount ffs rw(2) %s", FSTEST_MNTNAME); 73272343Sngie 74272343Sngie if (rump_sys_statvfs1(FSTEST_MNTNAME, &fst, 0) != 0) 75272343Sngie atf_tc_fail_errno("statbfs %s (3)", FSTEST_MNTNAME); 76272343Sngie 77272343Sngie if ((fst.f_flag & ST_QUOTA) == 0) 78272343Sngie atf_tc_fail("R/W filesystem has no quota"); 79272343Sngie 80272343Sngie /* create some files so fsck has something to check */ 81272343Sngie FSTEST_ENTER(); 82272343Sngie RL(rump_sys_chown(".", 0, 0)); 83272343Sngie for (i = 0 ; i < n; i++) { 84272343Sngie sprintf(buf, "file%d", i); 85272343Sngie RL(fd = rump_sys_open(buf, O_CREAT | O_RDWR, 0755)); 86272343Sngie sprintf(buf, "test file no %d", i); 87272343Sngie RL(rump_sys_write(fd, buf, strlen(buf))); 88272343Sngie RL(rump_sys_fchown(fd, i, i+80000)); 89272343Sngie rump_sys_close(fd); 90272343Sngie } 91272343Sngie FSTEST_EXIT(); 92272343Sngie if (rump_sys_unmount(FSTEST_MNTNAME, 0) != 0) { 93272343Sngie rump_pub_vfs_mount_print(FSTEST_MNTNAME, 1); 94272343Sngie atf_tc_fail_errno("unmount failed"); 95272343Sngie } 96272343Sngie snprintf(buf, 1024, "fsck_ffs -fn -F %s", FSTEST_IMGNAME); 97272343Sngie res = system(buf); 98272343Sngie if (res != 0) 99272343Sngie atf_tc_fail("fsck returned %d", res); 100272343Sngie} 101272343Sngie 102272343Sngie#define DECL_TEST(nent, newops, name, descr, log) \ 103272343SngieATF_TC(quota_##name); \ 104272343Sngie \ 105272343SngieATF_TC_HEAD(quota_##name, tc) \ 106272343Sngie{ \ 107272343Sngie atf_tc_set_md_var(tc, "descr", \ 108272343Sngie "test filesystem remount with quotas, %s", descr); \ 109272343Sngie} \ 110272343Sngie \ 111272343SngieATF_TC_BODY(quota_##name, tc) \ 112272343Sngie{ \ 113272343Sngie do_quota(tc, nent, newops, log); \ 114272343Sngie} 115272343Sngie 116272343SngieDECL_TEST(10, "-O1 -B le", 10_O1_le, "UFS1 little-endian", 0) 117272343SngieDECL_TEST(10, "-O1 -B be", 10_O1_be, "UFS1 big-endian", 0) 118272343Sngie 119272343Sngie#if 0 120272343Sngie/* 121272343Sngie * this cause fsck to complain about summaries at the end. 122272343Sngie * This sems to be related to -o log (reproductible on a fs with no 123272343Sngie * quota enabled). not reproductible with a real kernel ... 124272343Sngie */ 125272343SngieDECL_TEST(10, "-O1", 10_O1_log, "UFS1 log", 1) 126272343SngieDECL_TEST(10, "-O2", 10_O2_log, "UFS2 log", 1) 127272343Sngie#endif 128272343Sngie 129272343SngieATF_TP_ADD_TCS(tp) 130272343Sngie{ 131272343Sngie 132272343Sngie ATF_TP_ADD_TC(tp, quota_10_O1_le); 133272343Sngie ATF_TP_ADD_TC(tp, quota_10_O1_be); 134272343Sngie#if 0 135272343Sngie ATF_TP_ADD_TC(tp, quota_10_O1_log); 136272343Sngie ATF_TP_ADD_TC(tp, quota_10_O2_log); 137272343Sngie#endif 138272343Sngie return atf_no_error(); 139272343Sngie} 140