From: Cyril Hrubis <chrubis@suse.cz>
To: Yang Xu <xuyang2018.jy@fujitsu.com>
Cc: ltp@lists.linux.it
Subject: Re: [LTP] [PATCH v4 5/6] syscalls/quotactl09: Test error when quota info hidden in filesystem
Date: Fri, 7 Jan 2022 16:50:37 +0100 [thread overview]
Message-ID: <YdhhTeot7Z9861B0@yuki> (raw)
In-Reply-To: <1639380414-24390-5-git-send-email-xuyang2018.jy@fujitsu.com>
Hi!
> diff --git a/testcases/kernel/syscalls/quotactl/quotactl09.c b/testcases/kernel/syscalls/quotactl/quotactl09.c
> new file mode 100644
> index 000000000..c7c485077
> --- /dev/null
> +++ b/testcases/kernel/syscalls/quotactl/quotactl09.c
> @@ -0,0 +1,180 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2021 FUJITSU LIMITED. All rights reserved.
> + * Author: Yang Xu <xuyang2018.jy@fujitsu.com>
> + */
> +
> +/*\
> + * [Description]
> + *
> + * Tests basic error handling of the quotactl syscall without visible quota files
> + * (use quotactl and quotactl_fd syscall):
> + *
> + * - EFAULT when addr or special is invalid
> + * - EINVAL when cmd or type is invalid
> + * - ENOTBLK when special is not a block device
> + * - ERANGE when cmd is Q_SETQUOTA, but the specified limits are out of the range
> + * allowed by the quota format
> + * - EPERM when the caller lacked the required privilege (CAP_SYS_ADMIN) for the
> + * specified operation
> + *
> + * Minimum e2fsprogs version required is 1.43.
> + */
> +
> +#include <errno.h>
> +#include <sys/quota.h>
> +#include "tst_test.h"
> +#include "tst_capability.h"
> +#include "quotactl_syscall_var.h"
> +
> +#define OPTION_INVALID 999
> +
> +static int32_t fmt_id = QFMT_VFS_V1;
> +static int test_id, mount_flag;
> +static int getnextquota_nsup;
> +
> +static struct if_nextdqblk res_ndq;
> +
> +static struct dqblk set_dqmax = {
> + .dqb_bsoftlimit = 0x7fffffffffffffffLL, /* 2^63-1 */
> + .dqb_valid = QIF_BLIMITS
> +};
> +
> +static struct tst_cap dropadmin = {
> + .action = TST_CAP_DROP,
> + .id = CAP_SYS_ADMIN,
> + .name = "CAP_SYS_ADMIN",
> +};
> +
> +static struct tst_cap needadmin = {
> + .action = TST_CAP_REQ,
> + .id = CAP_SYS_ADMIN,
> + .name = "CAP_SYS_ADMIN",
> +};
> +
> +static struct tcase {
> + int cmd;
> + int *id;
> + void *addr;
> + int exp_err;
> + int on_flag;
> +} tcases[] = {
> + {QCMD(Q_SETQUOTA, USRQUOTA), &fmt_id, NULL, EFAULT, 1},
> + {QCMD(OPTION_INVALID, USRQUOTA), &fmt_id, NULL, EINVAL, 0},
> + {QCMD(Q_QUOTAON, USRQUOTA), &fmt_id, NULL, ENOTBLK, 0},
> + {QCMD(Q_SETQUOTA, USRQUOTA), &test_id, &set_dqmax, ERANGE, 1},
> + {QCMD(Q_QUOTAON, USRQUOTA), &fmt_id, NULL, EPERM, 0},
> +};
> +
> +static void verify_quotactl(unsigned int n)
> +{
> + struct tcase *tc = &tcases[n];
> + int quota_on = 0;
> + int drop_flag = 0;
> +
> + if (tc->cmd == QCMD(Q_GETNEXTQUOTA, USRQUOTA) && getnextquota_nsup) {
> + tst_res(TCONF, "current system doesn't support Q_GETNEXTQUOTA");
> + return;
> + }
> +
> + if (tc->on_flag) {
> + TEST(do_quotactl(fd, QCMD(Q_QUOTAON, USRQUOTA), tst_device->dev,
> + fmt_id, NULL));
> + if (TST_RET == -1)
> + tst_brk(TBROK,
> + "quotactl with Q_QUOTAON returned %ld", TST_RET);
> + quota_on = 1;
> + }
> +
> + if (tc->exp_err == EPERM) {
> + tst_cap_action(&dropadmin);
> + drop_flag = 1;
> + }
> +
> + if (tst_variant) {
> + if (tc->exp_err == ENOTBLK) {
> + tst_res(TCONF, "quotactl_fd() doesn't have this error, skip");
> + return;
> + }
> + }
> + if (tc->exp_err == ENOTBLK)
> + TEST(do_quotactl(fd, tc->cmd, "/dev/null", *tc->id, tc->addr));
> + else
> + TEST(do_quotactl(fd, tc->cmd, tst_device->dev, *tc->id, tc->addr));
How does this work for the tst_variant == 1? We still do pass the fd
pointing to device right?
Actually one way to simplify the whole patchset would be to open() and
close() the device in each do_quotactl() call in the case that
tst_variant == 1. We wouldn't have to pass the file descriptor to the
function and everything will just work fine.
> + if (TST_RET == -1) {
> + if (tc->exp_err == TST_ERR) {
> + tst_res(TPASS | TTERRNO, "quotactl failed as expected");
> + } else {
> + tst_res(TFAIL | TTERRNO,
> + "quotactl failed unexpectedly; expected %s, but got",
> + tst_strerrno(tc->exp_err));
> + }
> + } else {
> + tst_res(TFAIL, "quotactl returned wrong value: %ld", TST_RET);
> + }
Use TST_EXP_FAIL() in new testcases please.
> + if (quota_on) {
> + TEST(do_quotactl(fd, QCMD(Q_QUOTAOFF, USRQUOTA), tst_device->dev,
> + fmt_id, NULL));
> + if (TST_RET == -1)
> + tst_brk(TBROK,
> + "quotactl with Q_QUOTAOFF returned %ld", TST_RET);
> + quota_on = 0;
> + }
> +
> + if (drop_flag) {
> + tst_cap_action(&needadmin);
> + drop_flag = 0;
> + }
> +}
> +
> +static void setup(void)
> +{
> + unsigned int i;
> + const char *const fs_opts[] = { "-O quota", NULL};
> +
> + quotactl_info();
> + SAFE_MKFS(tst_device->dev, tst_device->fs_type, fs_opts, NULL);
> + SAFE_MOUNT(tst_device->dev, MNTPOINT, tst_device->fs_type, 0, NULL);
> + mount_flag = 1;
> +
> + fd = SAFE_OPEN(MNTPOINT, O_RDONLY);
> + TEST(do_quotactl(fd, QCMD(Q_GETNEXTQUOTA, USRQUOTA), tst_device->dev,
> + test_id, (void *) &res_ndq));
> + if (TST_ERR == EINVAL || TST_ERR == ENOSYS)
> + getnextquota_nsup = 1;
> +
> + for (i = 0; i < ARRAY_SIZE(tcases); i++) {
> + if (!tcases[i].addr)
> + tcases[i].addr = tst_get_bad_addr(NULL);
> + }
> +}
> +
> +static void cleanup(void)
> +{
> + if (fd > -1)
> + SAFE_CLOSE(fd);
> + 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
> + },
> + .tcnt = ARRAY_SIZE(tcases),
> + .test = verify_quotactl,
> + .dev_fs_type = "ext4",
> + .mntpoint = MNTPOINT,
> + .needs_device = 1,
> + .needs_root = 1,
> + .test_variants = QUOTACTL_SYSCALL_VARIANTS,
> + .needs_cmds = (const char *[]) {
> + "mkfs.ext4 >= 1.43.0",
> + NULL
> + }
> +};
> --
> 2.23.0
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
next prev parent reply other threads:[~2022-01-07 15:49 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-09 10:54 [LTP] [PATCH v3 06/12] lapi/quotactl.h: Add fallback for quotactl_fd Yang Xu
2021-11-09 10:54 ` [LTP] [PATCH v3 07/12] syscalls/quotactl08: Test quoatctl01 but quota info hidden in filesystem Yang Xu
2021-11-10 16:32 ` Cyril Hrubis
2021-11-11 8:48 ` xuyang2018.jy
2021-11-11 14:30 ` Cyril Hrubis
2021-11-26 9:32 ` xuyang2018.jy
2021-12-13 7:26 ` [LTP] [PATCH v4 1/6] " Yang Xu
2021-12-13 7:26 ` [LTP] [PATCH v4 2/6] syscalls/quotactl02, 5: Add quotactl_fd test variant Yang Xu
2022-01-07 14:30 ` Cyril Hrubis
2021-12-13 7:26 ` [LTP] [PATCH v4 3/6] syscalls/quotactl03: " Yang Xu
2022-01-07 14:59 ` Cyril Hrubis
2021-12-13 7:26 ` [LTP] [PATCH v4 4/6] syscalls/quotactl04: " Yang Xu
2022-01-07 15:35 ` Cyril Hrubis
2022-01-10 10:09 ` xuyang2018.jy
2021-12-13 7:26 ` [LTP] [PATCH v4 5/6] syscalls/quotactl09: Test error when quota info hidden in filesystem Yang Xu
2022-01-07 15:50 ` Cyril Hrubis [this message]
2022-01-10 6:48 ` xuyang2018.jy
2022-01-10 14:46 ` Cyril Hrubis
2022-01-11 6:51 ` xuyang2018.jy
2022-01-11 10:55 ` Cyril Hrubis
2022-01-12 1:52 ` xuyang2018.jy
2022-01-12 8:31 ` Cyril Hrubis
2022-01-12 9:24 ` xuyang2018.jy
2021-12-13 7:26 ` [LTP] [PATCH v4 6/6] syscalls/quotactl07: Add quotactl_fd test variant Yang Xu
2022-01-07 16:03 ` Cyril Hrubis
2022-01-10 9:03 ` xuyang2018.jy
2021-12-23 8:03 ` [LTP] [PATCH v4 1/6] syscalls/quotactl08: Test quoatctl01 but quota info hidden in filesystem xuyang2018.jy
2022-01-07 14:09 ` Cyril Hrubis
2022-01-10 6:37 ` xuyang2018.jy
2022-01-10 14:46 ` Cyril Hrubis
2021-11-09 10:54 ` [LTP] [PATCH v3 08/12] syscalls/quotactl02, 5: Add quotactl_fd test variant Yang Xu
2021-11-09 10:54 ` [LTP] [PATCH v3 09/12] syscalls/quotactl03: " Yang Xu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YdhhTeot7Z9861B0@yuki \
--to=chrubis@suse.cz \
--cc=ltp@lists.linux.it \
--cc=xuyang2018.jy@fujitsu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox