166 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
| // SPDX-License-Identifier: GPL-2.0-or-later
 | |
| /*
 | |
|  * Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
 | |
|  * Author: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
 | |
|  */
 | |
| 
 | |
| #ifndef QUOTACTL02_H
 | |
| #define QUOTACTL02_H
 | |
| 
 | |
| #define _GNU_SOURCE
 | |
| #include "config.h"
 | |
| #include <errno.h>
 | |
| #include <unistd.h>
 | |
| #include <stdio.h>
 | |
| #include "tst_test.h"
 | |
| #include "lapi/quotactl.h"
 | |
| 
 | |
| #ifdef HAVE_XFS_XQM_H
 | |
| # include <xfs/xqm.h>
 | |
| 
 | |
| static struct fs_disk_quota set_dquota = {
 | |
| 	.d_rtb_softlimit = 1000,
 | |
| 	.d_fieldmask = FS_DQ_RTBSOFT
 | |
| };
 | |
| static uint32_t test_id;
 | |
| static int x_getnextquota_nsup;
 | |
| static int x_getstatv_nsup;
 | |
| static const char mntpoint[] = "mnt_point";
 | |
| 
 | |
| void check_support_cmd(int quotatype)
 | |
| {
 | |
| 	struct fs_disk_quota resfs_dquota;
 | |
| 	struct fs_quota_statv resfs_qstatv = {
 | |
| 		.qs_version = FS_QSTATV_VERSION1
 | |
| 	};
 | |
| 
 | |
| 	x_getnextquota_nsup = 0;
 | |
| 	x_getstatv_nsup = 0;
 | |
| 
 | |
| 	TEST(quotactl(QCMD(Q_XGETNEXTQUOTA, quotatype), tst_device->dev,
 | |
| 		      test_id, (void *) &resfs_dquota));
 | |
| 	if (TST_ERR == EINVAL || TST_ERR == ENOSYS)
 | |
| 		x_getnextquota_nsup = 1;
 | |
| 
 | |
| 	TEST(quotactl(QCMD(Q_XGETQSTATV, quotatype), tst_device->dev, test_id,
 | |
| 		      (void *) &resfs_qstatv));
 | |
| 	if (TST_ERR == EINVAL || TST_ERR == ENOSYS)
 | |
| 		x_getstatv_nsup = 1;
 | |
| 
 | |
| }
 | |
| void check_qoff(int subcmd, char *desp, int flag)
 | |
| {
 | |
| 	int res;
 | |
| 	struct fs_quota_stat res_qstat;
 | |
| 
 | |
| 	res = quotactl(subcmd, tst_device->dev, test_id, (void *) &res_qstat);
 | |
| 	if (res == -1) {
 | |
| 		tst_res(TFAIL | TERRNO,
 | |
| 			"quotactl() failed to get xfs quota off status");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if (res_qstat.qs_flags & flag) {
 | |
| 		tst_res(TFAIL, "xfs quota enforcement was on unexpectedly");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	tst_res(TPASS, "quotactl() succeeded to %s", desp);
 | |
| }
 | |
| 
 | |
| void check_qon(int subcmd, char *desp, int flag)
 | |
| {
 | |
| 	int res;
 | |
| 	struct fs_quota_stat res_qstat;
 | |
| 
 | |
| 	res = quotactl(subcmd, tst_device->dev, test_id, (void *) &res_qstat);
 | |
| 	if (res == -1) {
 | |
| 		tst_res(TFAIL | TERRNO,
 | |
| 			"quotactl() failed to get xfs quota on status");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if (!(res_qstat.qs_flags & flag)) {
 | |
| 		tst_res(TFAIL, "xfs quota enforcement was off unexpectedly");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	tst_res(TPASS, "quotactl() succeeded to %s", desp);
 | |
| }
 | |
| 
 | |
| void check_qoffv(int subcmd, char *desp, int flag)
 | |
| {
 | |
| 	int res;
 | |
| 	struct fs_quota_statv res_qstatv = {
 | |
| 		.qs_version = FS_QSTATV_VERSION1,
 | |
| 	};
 | |
| 
 | |
| 	res = quotactl(subcmd, tst_device->dev, test_id, (void *) &res_qstatv);
 | |
| 	if (res == -1) {
 | |
| 		tst_res(TFAIL | TERRNO,
 | |
| 			"quotactl() failed to get xfs quota off stav");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if (res_qstatv.qs_flags & flag) {
 | |
| 		tst_res(TFAIL, "xfs quota enforcement was on unexpectedly");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	tst_res(TPASS, "quotactl() succeeded to %s", desp);
 | |
| }
 | |
| 
 | |
| void check_qonv(int subcmd, char *desp, int flag)
 | |
| {
 | |
| 	int res;
 | |
| 	struct fs_quota_statv res_qstatv = {
 | |
| 		.qs_version = FS_QSTATV_VERSION1
 | |
| 	};
 | |
| 
 | |
| 	res = quotactl(subcmd, tst_device->dev, test_id, (void *) &res_qstatv);
 | |
| 	if (res == -1) {
 | |
| 		tst_res(TFAIL | TERRNO,
 | |
| 			"quotactl() failed to get xfs quota on statv");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if (!(res_qstatv.qs_flags & flag)) {
 | |
| 		tst_res(TFAIL, "xfs quota enforcement was off unexpectedly");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	tst_res(TPASS, "quotactl() succeeded to %s", desp);
 | |
| }
 | |
| 
 | |
| void check_qlim(int subcmd, char *desp)
 | |
| {
 | |
| 	int res;
 | |
| 	static struct fs_disk_quota res_dquota;
 | |
| 
 | |
| 	res_dquota.d_rtb_softlimit = 0;
 | |
| 
 | |
| 	res = quotactl(subcmd, tst_device->dev, test_id, (void *) &res_dquota);
 | |
| 	if (res == -1) {
 | |
| 		tst_res(TFAIL | TERRNO,
 | |
| 			"quotactl() failed to get xfs disk quota limits");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if (res_dquota.d_id != test_id) {
 | |
| 		tst_res(TFAIL, "quotactl() got unexpected user id %u, expected %u",
 | |
| 			res_dquota.d_id, test_id);
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if (res_dquota.d_rtb_hardlimit != set_dquota.d_rtb_hardlimit) {
 | |
| 		tst_res(TFAIL, "quotactl() got unexpected rtb soft limit %llu, expected %llu",
 | |
| 				res_dquota.d_rtb_hardlimit, set_dquota.d_rtb_hardlimit);
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	tst_res(TPASS, "quotactl() succeeded to set and use %s to get xfs disk quota limits",
 | |
| 			desp);
 | |
| }
 | |
| #endif /* HAVE_XFS_XQM_H */
 | |
| #endif /* QUOTACTL02_H */
 |