From: DAN LI <li.dan@cn.fujitsu.com>
To: LTP list <ltp-list@lists.sourceforge.net>
Subject: [LTP] [PATCH 2/2] quotactl/quotactl02.c: create a case to test basic flags of quotactl(2)
Date: Wed, 17 Jul 2013 13:17:10 +0800 [thread overview]
Message-ID: <51E628D6.4030002@cn.fujitsu.com> (raw)
In-Reply-To: <51E6272B.3020509@cn.fujitsu.com>
Test basic xqm-related flags of quotactl() syscall.
Signed-off-by: DAN LI <li.dan@cn.fujitsu.com>
---
runtest/syscalls | 1 +
testcases/kernel/syscalls/.gitignore | 1 +
testcases/kernel/syscalls/quotactl/quotactl02.c | 258 ++++++++++++++++++++++++
3 files changed, 260 insertions(+)
create mode 100644 testcases/kernel/syscalls/quotactl/quotactl02.c
diff --git a/runtest/syscalls b/runtest/syscalls
index 0ce3679..bf5da76 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -769,6 +769,7 @@ pwrite03_64 pwrite03_64
pwrite04_64 pwrite04_64
quotactl01 quotactl01
+quotactl02 quotactl02 -D XFS_DEVICE
read01 read01
read02 read02
diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
index f7e4ce0..7bf341f 100644
--- a/testcases/kernel/syscalls/.gitignore
+++ b/testcases/kernel/syscalls/.gitignore
@@ -633,6 +633,7 @@
/pwrite/pwrite04
/pwrite/pwrite04_64
/quotactl/quotactl01
+/quotactl/quotactl02
/read/read01
/read/read02
/read/read03
diff --git a/testcases/kernel/syscalls/quotactl/quotactl02.c b/testcases/kernel/syscalls/quotactl/quotactl02.c
new file mode 100644
index 0000000..bd21c37
--- /dev/null
+++ b/testcases/kernel/syscalls/quotactl/quotactl02.c
@@ -0,0 +1,258 @@
+/*
+ * Copyright (c) 2013 Fujitsu Ltd.
+ * Author: DAN LI <li.dan@cn.fujitsu.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/*
+ * Description:
+ * This tests basic flags of quotactl() syscall:
+ * 1) Q_XQUOTAOFF - Turn off quotas for an XFS file system.
+ * 2) Q_XQUOTAON - Turn on quotas for an XFS file system.
+ * 3) Q_XGETQUOTA - Get disk quota limits and current usage for user id.
+ * 4) Q_XSETQLIM - Set disk quota limits for user id.
+ * 5) Q_XGETQSTAT - Get XFS file system specific quota information.
+ */
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#include "config.h"
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+#include <stdio.h>
+#include <errno.h>
+#include <sys/mount.h>
+#include <linux/fs.h>
+#include <sys/types.h>
+
+#if defined(HAVE_XFS_QUOTA)
+#include <xfs/xqm.h>
+#else
+#define BROKEN_XFS_QUOTA 1
+#endif
+
+#include "test.h"
+#include "usctest.h"
+#include "linux_syscall_numbers.h"
+#include "safe_macros.h"
+
+#define USRQCMD(cmd) ((cmd) << 8)
+#define RTBLIMIT 2000
+
+char *TCID = "quotactl02";
+int TST_TOTAL = 5;
+
+#ifndef BROKEN_XFS_QUOTA
+static void func_test(int i);
+static void setup(void);
+static void cleanup(void);
+static void help(void);
+
+static int dflag;
+static int uid = -1;
+static char dev[PATH_MAX];
+static char *block_dev;
+static struct fs_disk_quota dquota;
+static struct fs_quota_stat qstat;
+static unsigned int qflag = XFS_QUOTA_UDQ_ENFD;
+static const char mntpoint[] = "mnt_point";
+
+static option_t options[] = {
+ {"D:", &dflag, &block_dev},
+ {NULL, NULL, NULL},
+};
+
+static struct test_case_t {
+ int cmd;
+ const char *dev;
+ int *id;
+ void *addr;
+} TC[] = {
+ {Q_XQUOTAOFF, dev, &uid, &qflag},
+ {Q_XQUOTAON, dev, &uid, &qflag},
+ {Q_XGETQUOTA, dev, &uid, &dquota},
+ {Q_XSETQLIM, dev, &uid, &dquota},
+ {Q_XGETQSTAT, dev, &uid, &qstat},
+};
+
+int main(int argc, char *argv[])
+{
+ int i;
+ int lc;
+ char *msg;
+
+ msg = parse_opts(argc, argv, options, &help);
+ if (msg != NULL)
+ tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
+
+ if (!dflag)
+ tst_brkm(TBROK, NULL,
+ "you must specify the device used for mounting with "
+ "the -D option");
+
+ setup();
+
+ for (lc = 0; TEST_LOOPING(lc); ++lc) {
+
+ tst_count = 0;
+
+ for (i = 0; i < TST_TOTAL; i++) {
+
+ TEST(ltp_syscall(__NR_quotactl,
+ USRQCMD(TC[i].cmd), TC[i].dev,
+ *TC[i].id, TC[i].addr));
+
+ if (TEST_RETURN != 0)
+ tst_resm(TFAIL | TERRNO,
+ "cmd=0x%x failed", TC[i].cmd);
+
+ if (STD_FUNCTIONAL_TEST)
+ func_test(i);
+ else
+ tst_resm(TPASS,
+ "quotactl call succeeded");
+
+ }
+ }
+
+ cleanup();
+
+ tst_exit();
+
+}
+
+void func_test(int i)
+{
+ int ret;
+
+ switch (i) {
+ case 0:
+ /* Validate Q_XQUOTAOFF flag of quotactl call */
+ ret = ltp_syscall(__NR_quotactl, USRQCMD(Q_XGETQSTAT),
+ TC[i].dev, *TC[i].id, &qstat);
+ if (ret != 0)
+ tst_brkm(TBROK | TERRNO, cleanup,
+ "fail to get quota stat");
+
+ if (qstat.qs_flags & XFS_QUOTA_UDQ_ENFD) {
+ tst_resm(TFAIL, "enforcement is not off");
+ return;
+ }
+
+ tst_resm(TPASS, "enforcement is off");
+ break;
+
+ case 1:
+ /* Validate Q_XQUOTAON flag of quotactl call */
+ ret = ltp_syscall(__NR_quotactl, USRQCMD(Q_XGETQSTAT),
+ TC[i].dev, *TC[i].id, &qstat);
+ if (ret != 0)
+ tst_brkm(TBROK | TERRNO, cleanup,
+ "fail to get quota stat");
+
+ if (!(qstat.qs_flags & XFS_QUOTA_UDQ_ENFD)) {
+ tst_resm(TFAIL, "enforcement is off");
+ return;
+ }
+
+ tst_resm(TPASS, "enforcement is on");
+ break;
+
+ case 2:
+ /* Validate Q_XGETQUOTA flag of quotactl call */
+ if (!(dquota.d_flags & XFS_USER_QUOTA)) {
+ tst_resm(TFAIL, "get incorrect quota type");
+ return;
+ }
+
+ /* for case3 */
+ dquota.d_rtb_hardlimit = RTBLIMIT;
+ dquota.d_fieldmask = FS_DQ_LIMIT_MASK;
+
+ tst_resm(TPASS, "get the right quota type");
+ break;
+
+ case 3:
+ /* Validate Q_XSETQLIM flag of quotactl call */
+ ret = ltp_syscall(__NR_quotactl, USRQCMD(Q_XGETQUOTA),
+ TC[i].dev, *TC[i].id, &dquota);
+ if (ret != 0)
+ tst_brkm(TFAIL | TERRNO, NULL,
+ "fail to get quota information");
+
+ if (dquota.d_rtb_hardlimit != RTBLIMIT) {
+ tst_resm(TFAIL, "limit on RTB, except %lu get %lu",
+ (uint64_t)RTBLIMIT,
+ (uint64_t)dquota.d_rtb_hardlimit);
+ return;
+ }
+
+ tst_resm(TPASS, "quotactl works fine with Q_XSETQLIM");
+ break;
+
+ case 4:
+ /* Validate Q_XGETQSTAT flag of quotactl call */
+ if (qstat.qs_version != FS_QSTAT_VERSION) {
+ tst_resm(TFAIL, "get incorrect qstat version");
+ return;
+ }
+
+ tst_resm(TPASS, "get correct qstat version");
+ break;
+
+ default:
+ tst_brkm(TBROK, cleanup, "Got unexpected index");
+ }
+
+}
+
+void setup()
+{
+
+ tst_require_root(NULL);
+
+ TEST_PAUSE;
+
+ tst_tmpdir();
+
+ SAFE_MKDIR(cleanup, mntpoint, 0755);
+
+ uid = 0;
+ strncpy(dev, block_dev, PATH_MAX);
+
+ if (mount(dev, mntpoint, "xfs", 0, "uquota") < 0)
+ tst_brkm(TFAIL | TERRNO, NULL, "mount(2) fail");
+
+}
+
+void cleanup()
+{
+ if (umount(mntpoint) < 0)
+ tst_resm(TFAIL | TERRNO, "umount(2) fail");
+
+ TEST_CLEANUP;
+ tst_rmdir();
+}
+
+void help(void)
+{
+ printf("-D device : device used for mounting.\n");
+}
+#else
+int main(void)
+{
+ tst_brkm(TCONF, NULL, "This system doesn't support xfs quota");
+}
+#endif
--
1.8.1
------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
next prev parent reply other threads:[~2013-07-17 5:18 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-17 5:10 [LTP] [PATCH 1/2] Add support for xfs quota tests DAN LI
2013-07-17 5:17 ` DAN LI [this message]
2013-07-17 12:22 ` [LTP] [PATCH 2/2] quotactl/quotactl02.c: create a case to test basic flags of quotactl(2) chrubis
2013-07-17 12:05 ` [LTP] [PATCH 1/2] Add support for xfs quota tests chrubis
[not found] ` <51FA290E.1040804@cn.fujitsu.com>
2013-08-01 11:41 ` chrubis
2013-08-12 11:53 ` chrubis
[not found] ` <52158F02.9000105@cn.fujitsu.com>
2013-08-22 9:22 ` chrubis
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=51E628D6.4030002@cn.fujitsu.com \
--to=li.dan@cn.fujitsu.com \
--cc=ltp-list@lists.sourceforge.net \
/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.