From: "xuyang2018.jy@fujitsu.com" <xuyang2018.jy@fujitsu.com>
To: Cyril Hrubis <chrubis@suse.cz>
Cc: "ltp@lists.linux.it" <ltp@lists.linux.it>
Subject: Re: [LTP] [PATCH v1 07/11] syscalls/quotactl08: Test quoatctl01 but quota info hidden in filesystem
Date: Wed, 27 Oct 2021 03:04:27 +0000 [thread overview]
Message-ID: <6178C1BF.8030101@fujitsu.com> (raw)
In-Reply-To: <YXgO9rqcXS5dh1us@yuki>
Hi Cyril
> On Mon, Oct 18, 2021 at 09:14:44PM +0800, Yang Xu wrote:
>> It uses two variants(quotactl and quotactl_fd). The difference for quotactl01
>> is that we don't use quotacheck command and quota info hidden in filesystem.
>>
>> Signed-off-by: Yang Xu<xuyang2018.jy@fujitsu.com>
>> ---
>> runtest/syscalls | 1 +
>> testcases/kernel/syscalls/quotactl/.gitignore | 1 +
>> .../kernel/syscalls/quotactl/quotactl08.c | 246 ++++++++++++++++++
>> .../kernel/syscalls/quotactl/quotactl_var.h | 29 +++
>> 4 files changed, 277 insertions(+)
>> create mode 100644 testcases/kernel/syscalls/quotactl/quotactl08.c
>> create mode 100644 testcases/kernel/syscalls/quotactl/quotactl_var.h
>>
>> diff --git a/runtest/syscalls b/runtest/syscalls
>> index b19316805..cdeb3e142 100644
>> --- a/runtest/syscalls
>> +++ b/runtest/syscalls
>> @@ -1073,6 +1073,7 @@ quotactl04 quotactl04
>> quotactl05 quotactl05
>> quotactl06 quotactl06
>> quotactl07 quotactl07
>> +quotactl08 quotactl08
>>
>> read01 read01
>> read02 read02
>> diff --git a/testcases/kernel/syscalls/quotactl/.gitignore b/testcases/kernel/syscalls/quotactl/.gitignore
>> index 8d2ef94d9..dab9b3420 100644
>> --- a/testcases/kernel/syscalls/quotactl/.gitignore
>> +++ b/testcases/kernel/syscalls/quotactl/.gitignore
>> @@ -5,3 +5,4 @@
>> /quotactl05
>> /quotactl06
>> /quotactl07
>> +/quotactl08
>> diff --git a/testcases/kernel/syscalls/quotactl/quotactl08.c b/testcases/kernel/syscalls/quotactl/quotactl08.c
>> new file mode 100644
>> index 000000000..554a204b1
>> --- /dev/null
>> +++ b/testcases/kernel/syscalls/quotactl/quotactl08.c
>> @@ -0,0 +1,246 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> +/*
>> + * Copyright (c) 2021 FUJITSU LIMITED. All rights reserved
>> + * Author: Yang Xu<xuyang2018.jy@fujitsu.com>
>> + */
>> +
>> +/*\
>> + * [Description]
>> + * This testcase checks the basic flag of quotactl(2) for non-XFS filesystems
>> + * without visible quota files(quota information is stored in hidden system inodes):
>> + *
>> + * 1) quotactl(2) succeeds to turn on quota with Q_QUOTAON flag for user.
>> + *
>> + * 2 quotactl(2) succeeds to set disk quota limits with Q_SETQUOTA flag
>> + * for user.
>> + *
>> + * 3) quotactl(2) succeeds to get disk quota limits with Q_GETQUOTA flag
>> + * for user.
>> + *
>> + * 4) quotactl(2) succeeds to set information about quotafile with Q_SETINFO
>> + * flag for user.
>> + *
>> + * 5) quotactl(2) succeeds to get information about quotafile with Q_GETINFO
>> + * flag for user.
>> + *
>> + * 6) quotactl(2) succeeds to get quota format with Q_GETFMT flag for user.
>> + *
>> + * 7) quotactl(2) succeeds to update quota usages with Q_SYNC flag for user.
>> + *
>> + * 8) quotactl(2) succeeds to get disk quota limit greater than or equal to
>> + * ID with Q_GETNEXTQUOTA flag for user.
>> + *
>> + * 9) quotactl(2) succeeds to turn off quota with Q_QUOTAOFF flag for user.
>> + *
>> + * 10) quotactl(2) succeeds to turn on quota with Q_QUOTAON flag for group.
>> + *
>> + * 11) quotactl(2) succeeds to set disk quota limits with Q_SETQUOTA flag
>> + * for group.
>> + *
>> + * 12) quotactl(2) succeeds to get disk quota limits with Q_GETQUOTA flag
>> + * for group.
>> + *
>> + * 13) quotactl(2) succeeds to set information about quotafile with Q_SETINFO
>> + * flag for group.
>> + *
>> + * 14) quotactl(2) succeeds to get information about quotafile with Q_GETINFO
>> + * flag for group.
>> + *
>> + * 15) quotactl(2) succeeds to get quota format with Q_GETFMT flag for group.
>> + *
>> + * 16) quotactl(2) succeeds to update quota usages with Q_SYNC flag for group.
>> + *
>> + * 17) quotactl(2) succeeds to get disk quota limit greater than or equal to
>> + * ID with Q_GETNEXTQUOTA flag for group.
>> + *
>> + * 18) quotactl(2) succeeds to turn off quota with Q_QUOTAOFF flag for group.
>> + */
>
> The same comments apply for this comment as well.
Ok.
>
>> +#include "config.h"
>
> The config.h should ideally be included in the lapi/quotactl.h instead.
Will move.
>
>> +#include<errno.h>
>> +#include<string.h>
>> +#include<unistd.h>
>> +#include<stdio.h>
>> +#include "tst_test.h"
>> +#include "lapi/quotactl.h"
>
> And this is included in the quotactl_var.h so no need to include it here
> as well.
OK.
>
>> +#include "quotactl_var.h"
>> +
>> +#define MNTPOINT "mntpoint"
>> +#define TESTFILE MNTPOINT "/testfile"
>> +
>> +static int32_t fmt_id = QFMT_VFS_V1;
>> +static int test_id, fd = -1;
>> +static struct dqblk set_dq = {
>> + .dqb_bsoftlimit = 100,
>> + .dqb_valid = QIF_BLIMITS
>> +};
>> +static struct dqblk res_dq;
>> +
>> +static struct dqinfo set_qf = {
>> + .dqi_bgrace = 80,
>> + .dqi_valid = IIF_BGRACE
>> +};
>> +static struct dqinfo res_qf;
>> +static int32_t fmt_buf;
>> +static int getnextquota_nsup;
>> +
>> +static struct if_nextdqblk res_ndq;
>> +
>> +static struct tcase {
>> + int cmd;
>> + int *id;
>> + void *addr;
>> + void *set_data;
>> + void *res_data;
>> + int sz;
>> + char *des;
>> + char *tname;
>> +} tcases[] = {
>> + {QCMD(Q_QUOTAON, USRQUOTA),&fmt_id, NULL,
>> + NULL, NULL, 0, "turn on quota for user",
>> + "QCMD(Q_QUOTAON, USRQUOTA)"},
>> +
>> + {QCMD(Q_SETQUOTA, USRQUOTA),&test_id,&set_dq,
>> + NULL, NULL, 0, "set disk quota limit for user",
>> + "QCMD(Q_SETQUOTA, USRQUOTA)"},
>> +
>> + {QCMD(Q_GETQUOTA, USRQUOTA),&test_id,&res_dq,
>> + &set_dq.dqb_bsoftlimit,&res_dq.dqb_bsoftlimit,
>> + sizeof(res_dq.dqb_bsoftlimit), "get disk quota limit for user",
>> + "QCMD(Q_GETQUOTA, USRQUOTA)"},
>> +
>> + {QCMD(Q_SETINFO, USRQUOTA),&test_id,&set_qf,
>> + NULL, NULL, 0, "set information about quotafile for user",
>> + "QCMD(Q_SETINFO, USRQUOTA)"},
>> +
>> + {QCMD(Q_GETINFO, USRQUOTA),&test_id,&res_qf,
>> + &set_qf.dqi_bgrace,&res_qf.dqi_bgrace, sizeof(res_qf.dqi_bgrace),
>> + "get information about quotafile for user",
>> + "QCMD(Q_GETINFO, USRQUOTA)"},
>> +
>> + {QCMD(Q_GETFMT, USRQUOTA),&test_id,&fmt_buf,
>> + &fmt_id,&fmt_buf, sizeof(fmt_buf),
>> + "get quota format for user",
>> + "QCMD(Q_GETFMT, USRQUOTA)"},
>> +
>> + {QCMD(Q_SYNC, USRQUOTA),&test_id,&res_dq,
>> + NULL, NULL, 0, "update quota usages for user",
>> + "QCMD(Q_SYNC, USRQUOTA)"},
>> +
>> + {QCMD(Q_GETNEXTQUOTA, USRQUOTA),&test_id,&res_ndq,
>> + &test_id,&res_ndq.dqb_id, sizeof(res_ndq.dqb_id),
>> + "get next disk quota limit for user",
>> + "QCMD(Q_GETNEXTQUOTA, USRQUOTA)"},
>> +
>> + {QCMD(Q_QUOTAOFF, USRQUOTA),&test_id, NULL,
>> + NULL, NULL, 0, "turn off quota for user",
>> + "QCMD(Q_QUOTAOFF, USRQUOTA)"},
>> +
>> + {QCMD(Q_QUOTAON, GRPQUOTA),&fmt_id, NULL,
>> + NULL, NULL, 0, "turn on quota for group",
>> + "QCMD(Q_QUOTAON, GRPQUOTA)"},
>> +
>> + {QCMD(Q_SETQUOTA, GRPQUOTA),&test_id,&set_dq,
>> + NULL, NULL, 0, "set disk quota limit for group",
>> + "QCMD(Q_SETQUOTA, GRPQUOTA)"},
>> +
>> + {QCMD(Q_GETQUOTA, GRPQUOTA),&test_id,&res_dq,&set_dq.dqb_bsoftlimit,
>> + &res_dq.dqb_bsoftlimit, sizeof(res_dq.dqb_bsoftlimit),
>> + "set disk quota limit for group",
>> + "QCMD(Q_GETQUOTA, GRPQUOTA)"},
>> +
>> + {QCMD(Q_SETINFO, GRPQUOTA),&test_id,&set_qf,
>> + NULL, NULL, 0, "set information about quotafile for group",
>> + "QCMD(Q_SETINFO, GRPQUOTA)"},
>> +
>> + {QCMD(Q_GETINFO, GRPQUOTA),&test_id,&res_qf,&set_qf.dqi_bgrace,
>> + &res_qf.dqi_bgrace, sizeof(res_qf.dqi_bgrace),
>> + "get information about quotafile for group",
>> + "QCMD(Q_GETINFO, GRPQUOTA)"},
>> +
>> + {QCMD(Q_GETFMT, GRPQUOTA),&test_id,&fmt_buf,
>> + &fmt_id,&fmt_buf, sizeof(fmt_buf), "get quota format for group",
>> + "QCMD(Q_GETFMT, GRPQUOTA)"},
>> +
>> + {QCMD(Q_SYNC, GRPQUOTA),&test_id,&res_dq,
>> + NULL, NULL, 0, "update quota usages for group",
>> + "QCMD(Q_SYNC, GRPQUOTA)"},
>> +
>> + {QCMD(Q_GETNEXTQUOTA, GRPQUOTA),&test_id,&res_ndq,
>> + &test_id,&res_ndq.dqb_id, sizeof(res_ndq.dqb_id),
>> + "get next disk quota limit for group",
>> + "QCMD(Q_GETNEXTQUOTA, GRPQUOTA)"},
>> +
>> + {QCMD(Q_QUOTAOFF, GRPQUOTA),&test_id, NULL,
>> + NULL, NULL, 0, "turn off quota for group",
>> + "QCMD(Q_QUOTAOFF, GRPQUOTA)"},
>> +};
>> +
>> +static void setup(void)
>> +{
>> + quotactl_info();
>> +
>> + test_id = geteuid();
>
> The test has .needs_root flag set, so as far as I can tell this will
> always return 0, or do I miss something?
Will remove.
>
>> + fd = SAFE_OPEN(TESTFILE, O_RDWR | O_CREAT, 0666);
> ^
> Trailing
> whitespace
OK.
>> + //tst_require_quota_support(tst_device->dev, fmt_id, NULL);
>
> Why do we have this here?
Will remove comment.
Best Regards
Yang Xu
>
>> + 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;
>> +}
>> +
>> +static void cleanup(void)
>> +{
>> + if (fd> -1)
>> + SAFE_CLOSE(fd);
>> +}
>> +
>> +static void verify_quota(unsigned int n)
>> +{
>> + struct tcase *tc =&tcases[n];
>> +
>> + res_dq.dqb_bsoftlimit = 0;
>> + res_qf.dqi_igrace = 0;
>> + fmt_buf = 0;
>> + res_ndq.dqb_id = -1;
>> +
>> + tst_res(TINFO, "Test #%d: %s", n, tc->tname);
>> + if ((tc->cmd == QCMD(Q_GETNEXTQUOTA, USRQUOTA) ||
>> + tc->cmd == QCMD(Q_GETNEXTQUOTA, GRPQUOTA))&&
>> + getnextquota_nsup) {
>> + tst_res(TCONF, "current system doesn't support this cmd");
>> + return;
>> + }
>> + TEST(do_quotactl(fd, tc->cmd, tst_device->dev, *tc->id, tc->addr));
>> + if (TST_RET == -1) {
>> + tst_res(TFAIL | TTERRNO, "quotactl failed to %s", tc->des);
>> + return;
>> + }
>> +
>> + if (memcmp(tc->res_data, tc->set_data, tc->sz)) {
>> + tst_res(TFAIL, "quotactl failed to %s", tc->des);
>> + tst_res_hexd(TINFO, tc->res_data, tc->sz, "retval: ");
>> + tst_res_hexd(TINFO, tc->set_data, tc->sz, "expected: ");
>> + return;
>> + }
>> +
>> + tst_res(TPASS, "quotactl succeeded to %s", tc->des);
>> +}
>> +
>> +static struct tst_test test = {
>> + .needs_root = 1,
>> + .needs_kconfigs = (const char *[]) {
>> + "CONFIG_QFMT_V2",
>> + NULL
>> + },
>> + .test = verify_quota,
>> + .tcnt = ARRAY_SIZE(tcases),
>> + .mount_device = 1,
>> + .dev_fs_type = "ext4",
>> + .dev_fs_opts = (const char *const []){"-O", "quota", NULL},
>> + .mntpoint = MNTPOINT,
>> + .setup = setup,
>> + .cleanup = cleanup,
>> + .test_variants = 2,
>> +};
>> diff --git a/testcases/kernel/syscalls/quotactl/quotactl_var.h b/testcases/kernel/syscalls/quotactl/quotactl_var.h
>> new file mode 100644
>> index 000000000..27d57294c
>> --- /dev/null
>> +++ b/testcases/kernel/syscalls/quotactl/quotactl_var.h
>> @@ -0,0 +1,29 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> +/*
>> + * Copyright (c) 2021 FUJITSU LIMITED. All rights reserved.
>> + * Author: Yang Xu<xuyang2018.jy@fujitsu.com>
>> + */
>> +
>> +#ifndef LTP_QUOTACTL_VAR_H
>> +#define LTP_QUOTACTL_VAR_H
>> +
>> +#include "lapi/quotactl.h"
>> +
>> +#define TEST_VARIANTS 2
>> +
>> +static int do_quotactl(int fd, int cmd, const char *special, int id, caddr_t addr)
>> +{
>> + if (tst_variant == 0)
>> + return quotactl(cmd, special, id, addr);
>> + return quotactl_fd(fd, cmd, id, addr);
>> +}
>> +
>> +static void quotactl_info(void)
>> +{
>> + if (tst_variant == 0)
>> + tst_res(TINFO, "Test quotactl()");
>> + else
>> + tst_res(TINFO, "Test quotactl_fd()");
>> +}
>> +#endif /* LTP_QUOTACTL_VAR_H */
>> --
>> 2.23.0
>>
>>
>> --
>> Mailing list info: https://lists.linux.it/listinfo/ltp
>
--
Mailing list info: https://lists.linux.it/listinfo/ltp
next prev parent reply other threads:[~2021-10-27 3:04 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-18 13:14 [LTP] [PATCH v1 06/11] lapi/quotactl.h: Add fallback for quotactl_fd Yang Xu
2021-10-18 13:14 ` [LTP] [PATCH v1 07/11] syscalls/quotactl08: Test quoatctl01 but quota info hidden in filesystem Yang Xu
2021-10-26 14:21 ` Cyril Hrubis
2021-10-27 3:04 ` xuyang2018.jy [this message]
2021-10-18 13:14 ` [LTP] [PATCH v1 08/11] syscalls/quotaclt02, 5: Add quotactl_fd test variant Yang Xu
2021-10-26 14:23 ` Cyril Hrubis
2021-10-18 13:14 ` [LTP] [PATCH v1 09/11] syscalls/quotactl03: " Yang Xu
2021-10-26 14:25 ` Cyril Hrubis
2021-10-18 13:14 ` [LTP] [PATCH v1 10/11] syscalls/quotactl04: " Yang Xu
2021-10-26 14:26 ` Cyril Hrubis
2021-10-26 14:13 ` [LTP] [PATCH v1 06/11] lapi/quotactl.h: Add fallback for quotactl_fd Cyril Hrubis
2021-10-27 2:58 ` xuyang2018.jy
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=6178C1BF.8030101@fujitsu.com \
--to=xuyang2018.jy@fujitsu.com \
--cc=chrubis@suse.cz \
--cc=ltp@lists.linux.it \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.