Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/bouyer-quota2]: src/tests/fs/ffs Add a test checking that an unlinked fi...
details: https://anonhg.NetBSD.org/src/rev/71dcb064386a
branches: bouyer-quota2
changeset: 761173:71dcb064386a
user: bouyer <bouyer%NetBSD.org@localhost>
date: Sun Feb 13 20:58:28 2011 +0000
description:
Add a test checking that an unlinked file cleaned by the log replay keeps
quotas up to date.
diffstat:
tests/fs/ffs/h_quota2_tests.c | 85 ++++++++++++++++++++++++++++++++++++++----
tests/fs/ffs/t_miscquota.sh | 46 ++++++++++++++++++++++-
2 files changed, 121 insertions(+), 10 deletions(-)
diffs (238 lines):
diff -r 14e2fd14ac5f -r 71dcb064386a tests/fs/ffs/h_quota2_tests.c
--- a/tests/fs/ffs/h_quota2_tests.c Sun Feb 13 00:11:09 2011 +0000
+++ b/tests/fs/ffs/h_quota2_tests.c Sun Feb 13 20:58:28 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: h_quota2_tests.c,v 1.1.2.4 2011/02/12 21:49:08 bouyer Exp $ */
+/* $NetBSD: h_quota2_tests.c,v 1.1.2.5 2011/02/13 20:58:28 bouyer Exp $ */
/*
* rump server for advanced quota tests
@@ -35,6 +35,7 @@
int fd;
int error;
rump_sys_chown(".", TEST_NONROOT_ID, TEST_NONROOT_ID);
+ rump_sys_chmod(".", 0777);
if (rump_sys_setegid(TEST_NONROOT_ID) != 0) {
error = errno;
perror("rump_sys_setegid");
@@ -67,6 +68,7 @@
int fd;
int error;
rump_sys_chown(".", TEST_NONROOT_ID, TEST_NONROOT_ID);
+ rump_sys_chmod(".", 0777);
if (rump_sys_setegid(TEST_NONROOT_ID) != 0) {
error = errno;
perror("rump_sys_setegid");
@@ -115,6 +117,7 @@
int error;
int i;
rump_sys_chown(".", TEST_NONROOT_ID, TEST_NONROOT_ID);
+ rump_sys_chmod(".", 0777);
if (rump_sys_setegid(TEST_NONROOT_ID) != 0) {
error = errno;
perror("rump_sys_setegid");
@@ -151,6 +154,7 @@
int error;
int i;
rump_sys_chown(".", TEST_NONROOT_ID, TEST_NONROOT_ID);
+ rump_sys_chmod(".", 0777);
if (rump_sys_setegid(TEST_NONROOT_ID) != 0) {
error = errno;
perror("rump_sys_setegid");
@@ -204,6 +208,8 @@
* take an internal snapshot of the filesystem, and create a new
* file with some data
*/
+ rump_sys_chown(".", 0, 0);
+ rump_sys_chmod(".", 0777);
for (i =0; testopts && i < strlen(testopts); i++) {
switch(testopts[i]) {
@@ -233,8 +239,10 @@
fss.fss_csize = 0;
if (rump_sys_ioctl(fssfd, FSSIOCSET, &fss) == -1)
err(1, "create snapshot");
- if (unl)
- rump_sys_unlink(FSTEST_MNTNAME "/le_snap");
+ if (unl) {
+ if (rump_sys_unlink(FSTEST_MNTNAME "/le_snap") == -1)
+ err(1, "unlink snapshot");
+ }
/* now create some extra files */
@@ -253,6 +261,63 @@
return 0;
}
+static int
+quota_test5(const char *testopts)
+{
+ static char buf[512];
+ int fd;
+ int remount = 0;
+ int unlnk = 0;
+ int log = 0;
+ unsigned int i;
+
+ for (i =0; testopts && i < strlen(testopts); i++) {
+ switch(testopts[i]) {
+ case 'L':
+ log++;
+ break;
+ case 'R':
+ remount++;
+ break;
+ case 'U':
+ unlnk++;
+ break;
+ default:
+ errx(1, "test4: unknown option %c", testopts[i]);
+ }
+ }
+ if (remount) {
+ struct ufs_args uargs;
+ uargs.fspec = __UNCONST("/diskdev");
+ /* remount the fs read/write */
+ if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME,
+ MNT_UPDATE | (log ? MNT_LOG : 0),
+ &uargs, sizeof(uargs)) == -1)
+ err(1, "mount ffs rw %s", FSTEST_MNTNAME);
+ }
+
+ if (unlnk) {
+ /*
+ * open and unlink a file
+ */
+
+ fd = rump_sys_open("unlinked_file",
+ O_EXCL| O_CREAT | O_RDWR, 0644);
+ if (fd < 0)
+ err(1, "create %s", "unlinked_file");
+ sprintf(buf, "test unlinked_file");
+ rump_sys_write(fd, buf, strlen(buf));
+ if (rump_sys_unlink("unlinked_file") == -1)
+ err(1, "unlink unlinked_file");
+ if (rump_sys_fsync(fd) == -1)
+ err(1, "fsync unlinked_file");
+ rump_sys_reboot(RUMP_RB_NOSYNC, NULL);
+ errx(1, "reboot failed");
+ return 1;
+ }
+ return 0;
+}
+
struct quota_test {
int (*func)(const char *);
const char *desc;
@@ -264,6 +329,7 @@
{ quota_test2, "create file up to hard limit"},
{ quota_test3, "create file beyond the soft limit after grace time"},
{ quota_test4, "take a snapshot and add some data"},
+ { quota_test5, "open and unlink a file"},
};
static void
@@ -307,16 +373,19 @@
const char *filename;
const char *serverurl;
const char *topts = NULL;
- int log = 0;
+ int mntopts = 0;
int ch;
- while ((ch = getopt(argc, argv, "blo:")) != -1) {
+ while ((ch = getopt(argc, argv, "blo:r")) != -1) {
switch(ch) {
case 'b':
background = 1;
break;
case 'l':
- log = 1;
+ mntopts |= MNT_LOG;
+ break;
+ case 'r':
+ mntopts |= MNT_RDONLY;
break;
case 'o':
topts = optarg;
@@ -356,14 +425,12 @@
err(1, "mount point create");
rump_pub_etfs_register("/diskdev", filename, RUMP_ETFS_BLK);
uargs.fspec = __UNCONST("/diskdev");
- if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, (log) ? MNT_LOG : 0,
+ if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, mntopts,
&uargs, sizeof(uargs)) == -1)
die("mount ffs", errno);
if (rump_sys_chdir(FSTEST_MNTNAME) == -1)
err(1, "cd %s", FSTEST_MNTNAME);
- rump_sys_chown(".", 0, 0);
- rump_sys_chmod(".", 0777);
error = quota_tests[test].func(topts);
if (error) {
fprintf(stderr, " test %lu: %s returned %d: %s\n",
diff -r 14e2fd14ac5f -r 71dcb064386a tests/fs/ffs/t_miscquota.sh
--- a/tests/fs/ffs/t_miscquota.sh Sun Feb 13 00:11:09 2011 +0000
+++ b/tests/fs/ffs/t_miscquota.sh Sun Feb 13 20:58:28 2011 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: t_miscquota.sh,v 1.1.2.3 2011/02/12 21:49:08 bouyer Exp $
+# $NetBSD: t_miscquota.sh,v 1.1.2.4 2011/02/13 20:58:28 bouyer Exp $
#
# Copyright (c) 2011 Manuel Bouyer
# All rights reserved.
@@ -44,6 +44,14 @@
"create a non-persistent shapshot of quota-enabled fs, and do some writes and unconf" \
-boLC le 1 user
+test_case log_unlink quota_log \
+ "an unlinked file cleaned by the log replay should update quota" \
+ -l le 1 user
+
+test_case log_unlink_remount quota_log \
+ "an unlinked file cleaned by the log replay after remount" \
+ -oRL le 1 user
+
quota_walk_list()
{
@@ -118,3 +126,39 @@
#shutdown and check filesystem
rump_shutdown
}
+
+quota_log()
+{
+ local srv2args=$1; shift
+ create_with_quotas $*
+ local q=$3
+ local expect
+
+ case ${q} in
+ user)
+ expect=u
+ fail=g
+ ;;
+ group)
+ expect=g
+ fail=u
+ ;;
+ *)
+ atf_fail "wrong quota type"
+ ;;
+ esac
+
+ #start our server which create a file and unlink while keeping
+ # it open. The server halts itself without flush
+ atf_check -s exit:0 -o ignore \
+ $(atf_get_srcdir)/h_quota2_tests -loU 5 ${IMG} ${RUMP_SERVER}
+ # we should have one unlinked file, but the log covers it.
+ atf_check -s exit:0 -o match:'3 files' -e ignore \
+ fsck_ffs -nf -F ${IMG}
+ # have a kernel mount the fs again; it should cleanup the
+ # unlinked file
+ atf_check -o ignore -e ignore $(atf_get_srcdir)/h_quota2_tests \
+ ${srv2args} -b 5 ${IMG} ${RUMP_SERVER}
+ #shutdown and check filesystem
+ rump_shutdown
+}
Home |
Main Index |
Thread Index |
Old Index