[LTP] [PATCH v1 02/11] syscalls/quotactl06:Also test with vfsv1 format
Yang Xu
xuyang2018.jy@fujitsu.com
Mon Oct 18 15:09:42 CEST 2021
Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com>
---
.../kernel/syscalls/quotactl/quotactl06.c | 59 +++++++++++++++----
1 file changed, 46 insertions(+), 13 deletions(-)
diff --git a/testcases/kernel/syscalls/quotactl/quotactl06.c b/testcases/kernel/syscalls/quotactl/quotactl06.c
index a10d1ca07..f53f088d8 100644
--- a/testcases/kernel/syscalls/quotactl/quotactl06.c
+++ b/testcases/kernel/syscalls/quotactl/quotactl06.c
@@ -1,26 +1,42 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
- * Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
+ * Copyright (c) 2019-2021 FUJITSU LIMITED. All rights reserved.
* Author: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
+ */
+
+/*\
+ * [Description]
+ *
+ * Tests basic error handling of the quotactl syscall with visible quota files
+ * (cover two formats, vfsv0 and vfsv1):
*
- * Tests basic error handling of the quotactl syscall.
* 1) quotactl fails with EACCES when cmd is Q_QUOTAON and addr
* existed but not a regular file.
+ *
* 2) quotaclt fails with ENOENT when the file specified by special
* or addr does not exist.
+ *
* 3) quotactl fails with EBUSTY when cmd is Q_QUOTAON and another
* Q_QUOTAON had already been performed.
+ *
* 4) quotactl fails with EFAULT when addr or special is invalid.
+ *
* 5) quotactl fails with EINVAL when cmd or type is invalid.
+ *
* 6) quotactl fails with ENOTBLK when special is not a block device.
+ *
* 7) quotactl fails with ESRCH when no disk quota is found for the
* indicated user and quotas have not been turned on for this fs.
+ *
* 8) quotactl fails with ESRCH when cmd is Q_QUOTAON, but the quota
* format was not found.
+ *
* 9) quotactl fails with ESRCH when cmd is Q_GETNEXTQUOTA, but there
* is no ID greater than or equal to id that has an active quota.
+ *
* 10) quotactl fails with ERANGE when cmd is Q_SETQUOTA, but the
* specified limits are out of the range allowed by the quota format.
+ *
* 11) quotactl fails with EPERM when the caller lacked the required
* privilege (CAP_SYS_ADMIN) for the specified operation.
*/
@@ -32,10 +48,7 @@
#include "tst_capability.h"
#define OPTION_INVALID 999
-#define QFMT_VFS_V0 2
#define USRPATH MNTPOINT "/aquota.user"
-#define FMTID QFMT_VFS_V0
-
#define MNTPOINT "mntpoint"
#define TESTDIR1 MNTPOINT "/testdir1"
#define TESTDIR2 MNTPOINT "/testdir2"
@@ -43,10 +56,10 @@
static char usrpath[] = USRPATH;
static char testdir1[] = TESTDIR1;
static char testdir2[] = TESTDIR2;
-static int32_t fmt_id = FMTID;
+static int32_t fmt_id;
static int32_t fmt_invalid = 999;
static int test_invalid;
-static int test_id;
+static int test_id, mount_flag;
static int getnextquota_nsup;
static struct if_nextdqblk res_ndq;
@@ -105,7 +118,7 @@ static void verify_quotactl(unsigned int n)
if (tc->on_flag) {
TEST(quotactl(QCMD(Q_QUOTAON, USRQUOTA), tst_device->dev,
- FMTID, usrpath));
+ fmt_id, usrpath));
if (TST_RET == -1)
tst_brk(TBROK,
"quotactl with Q_QUOTAON returned %ld", TST_RET);
@@ -135,7 +148,7 @@ static void verify_quotactl(unsigned int n)
if (quota_on) {
TEST(quotactl(QCMD(Q_QUOTAOFF, USRQUOTA), tst_device->dev,
- FMTID, usrpath));
+ fmt_id, usrpath));
if (TST_RET == -1)
tst_brk(TBROK,
"quotactl with Q_QUOTAOFF returned %ld", TST_RET);
@@ -150,10 +163,23 @@ static void verify_quotactl(unsigned int n)
static void setup(void)
{
- const char *const cmd[] = {"quotacheck", "-uF", "vfsv0", MNTPOINT, NULL};
+ const char *const vfsv0_cmd[] = {"quotacheck", "-uF", "vfsv0", MNTPOINT, NULL};
+ const char *const vfsv1_cmd[] = {"quotacheck", "-uF", "vfsv1", MNTPOINT, NULL};
unsigned int i;
- SAFE_CMD(cmd, NULL, NULL);
+ SAFE_MKFS(tst_device->dev, tst_device->fs_type, NULL, NULL);
+ SAFE_MOUNT(tst_device->dev, MNTPOINT, tst_device->fs_type, 0, "usrquota");
+ mount_flag = 1;
+
+ if (tst_variant) {
+ tst_res(TINFO, "quotactl() with vfsv1 format");
+ SAFE_CMD(vfsv1_cmd, NULL, NULL);
+ fmt_id = QFMT_VFS_V1;
+ } else {
+ tst_res(TINFO, "quotactl() with vfsv0 format");
+ SAFE_CMD(vfsv0_cmd, NULL, NULL);
+ fmt_id = QFMT_VFS_V0;
+ }
if (access(USRPATH, F_OK) == -1)
tst_brk(TFAIL | TERRNO, "user quotafile didn't exist");
@@ -175,8 +201,15 @@ static void setup(void)
}
}
+static void cleanup(void)
+{
+ if (mount_flag && tst_umount(MNTPOINT))
+ tst_res(TWARN | TERRNO, "umount(%s)", MNTPOINT);
+}
+
static struct tst_test test = {
.setup = setup,
+ .cleanup = cleanup,
.needs_kconfigs = (const char *[]) {
"CONFIG_QFMT_V2",
NULL
@@ -185,11 +218,11 @@ static struct tst_test test = {
.test = verify_quotactl,
.dev_fs_type = "ext4",
.mntpoint = MNTPOINT,
- .mount_device = 1,
- .mnt_data = "usrquota",
+ .needs_device = 1,
.needs_cmds = (const char *const []) {
"quotacheck",
NULL
},
.needs_root = 1,
+ .test_variants = 2,
};
--
2.23.0
More information about the ltp
mailing list