All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] generic/395: test GETNEXTQUOTA near INT_MAX
@ 2016-12-19 15:23 Eric Sandeen
  2016-12-20  6:25 ` Eryu Guan
  2016-12-22  1:11 ` [PATCH V2] " Eric Sandeen
  0 siblings, 2 replies; 7+ messages in thread
From: Eric Sandeen @ 2016-12-19 15:23 UTC (permalink / raw)
  To: fstests

XFS kernel code had a bug where GETNEXTQUOTA-type
quotactls requesting an ID near UINT_MAX could overflow
and return 0 as the "next" active ID.

This test checks that by creating an active quota near
UINT_MAX, then asking for the next one after it.

The proper answer is ENOENT, but if we wrap we'll return
ID 0.

This also changes test-nextquota.c so that it checks
both GETNEXTQUOTA and XGETNEXTQUOTA even if one fails;
it stores the failure conditions and returns 1 if either
of them fails.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

diff --git a/src/test-nextquota.c b/src/test-nextquota.c
index ba4de27..73c63d8 100644
--- a/src/test-nextquota.c
+++ b/src/test-nextquota.c
@@ -73,6 +73,7 @@ int main(int argc, char *argv[])
 	int cmd;
 	int type = -1, typeflag = 0;
 	int verbose = 0;
+	int retval = 0;
 	uint id = 0, idflag = 0;
 	char *device = NULL;
 	char *tmp;
@@ -140,30 +141,32 @@ int main(int argc, char *argv[])
 	cmd = QCMD(Q_GETNEXTQUOTA, type);
 	if (quotactl(cmd, device, id, (void *)&dqb) < 0) {
 		perror("Q_GETNEXTQUOTA");
-		return 1;
+		retval = 1;
+	} else {
+		/*
+		 * We only print id and inode limits because
+		 * block count varies depending on fs block size, etc;
+		 * this is just a sanity test that we can retrieve the quota,
+		 * and inode limits have the same units across both calls.
+		 */
+		printf("id        %u\n", dqb.dqb_id);
+		printf("ihard     %llu\n",
+				  (unsigned long long)dqb.dqb_ihardlimit);
+		printf("isoft     %llu\n",
+				  (unsigned long long)dqb.dqb_isoftlimit);
 	}
 
-	/*
-	 * We only print id and inode limits because
-	 * block count varies depending on fs block size, etc;
-	 * this is just a sanity test that we can retrieve the quota,
-	 * and inode limits have the same units across both calls.
-	 */
-	printf("id        %u\n", dqb.dqb_id);
-	printf("ihard     %llu\n", (unsigned long long)dqb.dqb_ihardlimit);
-	printf("isoft     %llu\n", (unsigned long long)dqb.dqb_isoftlimit);
-
 	if (verbose)
 		printf("====Q_XGETNEXTQUOTA====\n");
 	cmd = QCMD(Q_XGETNEXTQUOTA, USRQUOTA);
 	if (quotactl(cmd, device, id, (void *)&xqb) < 0) {
 		perror("Q_XGETNEXTQUOTA");
-		return 1;
+		retval = 1;
+	} else {
+		printf("id        %u\n", xqb.d_id);
+		printf("ihard     %llu\n", xqb.d_ino_hardlimit);
+		printf("isoft     %llu\n", xqb.d_ino_softlimit);
 	}
 
-	printf("id        %u\n", xqb.d_id);
-	printf("ihard     %llu\n", xqb.d_ino_hardlimit);
-	printf("isoft     %llu\n", xqb.d_ino_softlimit);
-
-	return 0;
+	return retval;
 }
diff --git a/tests/generic/395 b/tests/generic/395
new file mode 100755
index 0000000..c0cfc31
--- /dev/null
+++ b/tests/generic/395
@@ -0,0 +1,99 @@
+#! /bin/bash
+# FS QA Test 394
+#
+# test out high quota ids retrieved by Q_GETNEXTQUOTA
+# Request for next ID near 2^32 should not wrap to 0
+#
+# Designed to use the new Q_GETNEXTQUOTA quotactl
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2016 Red Hat, Inc.  All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms 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.  See the
+# GNU General Public License for more details.
+#
+# 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+#
+
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+	cd /
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/quota
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+_supported_fs generic
+_supported_os Linux
+_require_quota
+_require_scratch
+
+scratch_unmount 2>/dev/null
+_scratch_mkfs >> $seqres.full 2>&1
+_scratch_mount "-o usrquota,grpquota"
+quotacheck -u -g $SCRATCH_MNT 2>/dev/null
+quotaon $SCRATCH_MNT 2>/dev/null
+_scratch_unmount
+
+TYPES="u g"
+MOUNT_OPTIONS="-o usrquota,grpquota"
+
+_qmount
+quotaon $SCRATCH_MNT 2>/dev/null
+
+# Ok, do we even have GETNEXTQUOTA?  Querying ID 0 should work.
+$here/src/test-nextquota -i 0 -u -d $SCRATCH_DEV &> $seqres.full || \
+	_notrun "No GETNEXTQUOTA support"
+
+echo "Launch all quotas"
+
+# We want to create a block of quotas for an id very near
+# 2^32, then ask for the next quota after it.  The returned
+# ID should not overflow to 0.
+
+# Populate  with 2^32-4
+ID=4294967292
+setquota -u $ID $ID $ID $ID $ID $SCRATCH_MNT
+touch ${SCRATCH_MNT}/${ID}
+chown ${ID} ${SCRATCH_MNT}/${ID}
+
+# remount just for kicks, make sure we get it off disk
+_scratch_unmount
+_qmount
+quotaon $SCRATCH_MNT 2>/dev/null
+
+# Ask for the next quota after $ID; should get nothing back
+# If kernelspace wraps, we'll get 0 back.
+for TYPE in u g; do
+	let NEXT=ID+1
+	echo "Ask for ID after $NEXT expecting nothing"
+	$here/src/test-nextquota -i $NEXT -${TYPE} -d $SCRATCH_DEV
+done
+
+# success, all done
+status=0
+exit
diff --git a/tests/generic/395.out b/tests/generic/395.out
new file mode 100644
index 0000000..bcd87ec
--- /dev/null
+++ b/tests/generic/395.out
@@ -0,0 +1,8 @@
+QA output created by 395
+Launch all quotas
+Ask for ID after 4294967293 expecting nothing
+Q_GETNEXTQUOTA: No such file or directory
+Q_XGETNEXTQUOTA: No such file or directory
+Ask for ID after 4294967293 expecting nothing
+Q_GETNEXTQUOTA: No such file or directory
+Q_XGETNEXTQUOTA: No such file or directory
diff --git a/tests/generic/group b/tests/generic/group
index 20b31ef..e9d3e4a 100644
--- a/tests/generic/group
+++ b/tests/generic/group
@@ -397,3 +397,4 @@
 392 auto quick metadata
 393 auto quick rw
 394 auto quick
+395 auto quick quota



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] generic/395: test GETNEXTQUOTA near INT_MAX
  2016-12-19 15:23 [PATCH] generic/395: test GETNEXTQUOTA near INT_MAX Eric Sandeen
@ 2016-12-20  6:25 ` Eryu Guan
  2016-12-20 13:57   ` Eric Sandeen
  2016-12-22  1:11 ` [PATCH V2] " Eric Sandeen
  1 sibling, 1 reply; 7+ messages in thread
From: Eryu Guan @ 2016-12-20  6:25 UTC (permalink / raw)
  To: Eric Sandeen; +Cc: fstests

On Mon, Dec 19, 2016 at 09:23:54AM -0600, Eric Sandeen wrote:
> XFS kernel code had a bug where GETNEXTQUOTA-type
> quotactls requesting an ID near UINT_MAX could overflow
> and return 0 as the "next" active ID.
> 
> This test checks that by creating an active quota near
> UINT_MAX, then asking for the next one after it.
> 
> The proper answer is ENOENT, but if we wrap we'll return
> ID 0.
> 
> This also changes test-nextquota.c so that it checks
> both GETNEXTQUOTA and XGETNEXTQUOTA even if one fails;
> it stores the failure conditions and returns 1 if either
> of them fails.
> 
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
> 
> diff --git a/src/test-nextquota.c b/src/test-nextquota.c
> index ba4de27..73c63d8 100644
> --- a/src/test-nextquota.c
> +++ b/src/test-nextquota.c
> @@ -73,6 +73,7 @@ int main(int argc, char *argv[])
>  	int cmd;
>  	int type = -1, typeflag = 0;
>  	int verbose = 0;
> +	int retval = 0;
>  	uint id = 0, idflag = 0;
>  	char *device = NULL;
>  	char *tmp;
> @@ -140,30 +141,32 @@ int main(int argc, char *argv[])
>  	cmd = QCMD(Q_GETNEXTQUOTA, type);
>  	if (quotactl(cmd, device, id, (void *)&dqb) < 0) {
>  		perror("Q_GETNEXTQUOTA");
> -		return 1;
> +		retval = 1;
> +	} else {
> +		/*
> +		 * We only print id and inode limits because
> +		 * block count varies depending on fs block size, etc;
> +		 * this is just a sanity test that we can retrieve the quota,
> +		 * and inode limits have the same units across both calls.
> +		 */
> +		printf("id        %u\n", dqb.dqb_id);
> +		printf("ihard     %llu\n",
> +				  (unsigned long long)dqb.dqb_ihardlimit);
> +		printf("isoft     %llu\n",
> +				  (unsigned long long)dqb.dqb_isoftlimit);
>  	}
>  
> -	/*
> -	 * We only print id and inode limits because
> -	 * block count varies depending on fs block size, etc;
> -	 * this is just a sanity test that we can retrieve the quota,
> -	 * and inode limits have the same units across both calls.
> -	 */
> -	printf("id        %u\n", dqb.dqb_id);
> -	printf("ihard     %llu\n", (unsigned long long)dqb.dqb_ihardlimit);
> -	printf("isoft     %llu\n", (unsigned long long)dqb.dqb_isoftlimit);
> -
>  	if (verbose)
>  		printf("====Q_XGETNEXTQUOTA====\n");
>  	cmd = QCMD(Q_XGETNEXTQUOTA, USRQUOTA);
>  	if (quotactl(cmd, device, id, (void *)&xqb) < 0) {
>  		perror("Q_XGETNEXTQUOTA");
> -		return 1;
> +		retval = 1;
> +	} else {
> +		printf("id        %u\n", xqb.d_id);
> +		printf("ihard     %llu\n", xqb.d_ino_hardlimit);
> +		printf("isoft     %llu\n", xqb.d_ino_softlimit);
>  	}
>  
> -	printf("id        %u\n", xqb.d_id);
> -	printf("ihard     %llu\n", xqb.d_ino_hardlimit);
> -	printf("isoft     %llu\n", xqb.d_ino_softlimit);
> -
> -	return 0;
> +	return retval;
>  }
> diff --git a/tests/generic/395 b/tests/generic/395
> new file mode 100755
> index 0000000..c0cfc31
> --- /dev/null
> +++ b/tests/generic/395
> @@ -0,0 +1,99 @@
> +#! /bin/bash
> +# FS QA Test 394
> +#
> +# test out high quota ids retrieved by Q_GETNEXTQUOTA
> +# Request for next ID near 2^32 should not wrap to 0
> +#
> +# Designed to use the new Q_GETNEXTQUOTA quotactl
> +#
> +#-----------------------------------------------------------------------
> +# Copyright (c) 2016 Red Hat, Inc.  All Rights Reserved.
> +#
> +# This program is free software; you can redistribute it and/or
> +# modify it under the terms 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.  See the
> +# GNU General Public License for more details.
> +#
> +# 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 St, Fifth Floor, Boston, MA  02110-1301  USA
> +#-----------------------------------------------------------------------
> +#
> +
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +status=1	# failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> +	cd /
> +}

We still need to define and cleanup $tmp even if it's not used
explicitly in the test, it might be used by helper functions.

> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +. ./common/quota
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +
> +_supported_fs generic
> +_supported_os Linux
> +_require_quota
> +_require_scratch
> +
> +scratch_unmount 2>/dev/null

_require_scratch has done this for you :)

> +_scratch_mkfs >> $seqres.full 2>&1
> +_scratch_mount "-o usrquota,grpquota"
> +quotacheck -u -g $SCRATCH_MNT 2>/dev/null
> +quotaon $SCRATCH_MNT 2>/dev/null
> +_scratch_unmount

I don't see why above steps are necessary (mount, quotacheck and
umount), we override MOUNT_OPTIONS and do _qmount anyway. Did I miss
anything?

> +
> +TYPES="u g"

Defined but not used.

> +MOUNT_OPTIONS="-o usrquota,grpquota"
> +
> +_qmount
> +quotaon $SCRATCH_MNT 2>/dev/null

_qmount does quotacheck & quotaon for non-XFS already, seems we don't
need it too.

> +
> +# Ok, do we even have GETNEXTQUOTA?  Querying ID 0 should work.
> +$here/src/test-nextquota -i 0 -u -d $SCRATCH_DEV &> $seqres.full || \
> +	_notrun "No GETNEXTQUOTA support"

Introduce a new _require rule? And generic/244 could use it too. Perhaps
we need to put '_require_test_program "test-nextquota"' in the new
require rule too.

Thanks,
Eryu

> +
> +echo "Launch all quotas"
> +
> +# We want to create a block of quotas for an id very near
> +# 2^32, then ask for the next quota after it.  The returned
> +# ID should not overflow to 0.
> +
> +# Populate  with 2^32-4
> +ID=4294967292
> +setquota -u $ID $ID $ID $ID $ID $SCRATCH_MNT
> +touch ${SCRATCH_MNT}/${ID}
> +chown ${ID} ${SCRATCH_MNT}/${ID}
> +
> +# remount just for kicks, make sure we get it off disk
> +_scratch_unmount
> +_qmount
> +quotaon $SCRATCH_MNT 2>/dev/null
> +
> +# Ask for the next quota after $ID; should get nothing back
> +# If kernelspace wraps, we'll get 0 back.
> +for TYPE in u g; do
> +	let NEXT=ID+1
> +	echo "Ask for ID after $NEXT expecting nothing"
> +	$here/src/test-nextquota -i $NEXT -${TYPE} -d $SCRATCH_DEV
> +done
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/generic/395.out b/tests/generic/395.out
> new file mode 100644
> index 0000000..bcd87ec
> --- /dev/null
> +++ b/tests/generic/395.out
> @@ -0,0 +1,8 @@
> +QA output created by 395
> +Launch all quotas
> +Ask for ID after 4294967293 expecting nothing
> +Q_GETNEXTQUOTA: No such file or directory
> +Q_XGETNEXTQUOTA: No such file or directory
> +Ask for ID after 4294967293 expecting nothing
> +Q_GETNEXTQUOTA: No such file or directory
> +Q_XGETNEXTQUOTA: No such file or directory
> diff --git a/tests/generic/group b/tests/generic/group
> index 20b31ef..e9d3e4a 100644
> --- a/tests/generic/group
> +++ b/tests/generic/group
> @@ -397,3 +397,4 @@
>  392 auto quick metadata
>  393 auto quick rw
>  394 auto quick
> +395 auto quick quota
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe fstests" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] generic/395: test GETNEXTQUOTA near INT_MAX
  2016-12-20  6:25 ` Eryu Guan
@ 2016-12-20 13:57   ` Eric Sandeen
  0 siblings, 0 replies; 7+ messages in thread
From: Eric Sandeen @ 2016-12-20 13:57 UTC (permalink / raw)
  To: Eryu Guan, Eric Sandeen; +Cc: fstests



On 12/20/16 12:25 AM, Eryu Guan wrote:
>> +
>> +# Ok, do we even have GETNEXTQUOTA?  Querying ID 0 should work.
>> +$here/src/test-nextquota -i 0 -u -d $SCRATCH_DEV &> $seqres.full || \
>> +	_notrun "No GETNEXTQUOTA support"
> Introduce a new _require rule? And generic/244 could use it too. Perhaps
> we need to put '_require_test_program "test-nextquota"' in the new
> require rule too.

Good point.

And the other stuff is just leftovers from 344 - sorry about that.

-Eric

> Thanks,
> Eryu
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH V2] generic/395: test GETNEXTQUOTA near INT_MAX
  2016-12-19 15:23 [PATCH] generic/395: test GETNEXTQUOTA near INT_MAX Eric Sandeen
  2016-12-20  6:25 ` Eryu Guan
@ 2016-12-22  1:11 ` Eric Sandeen
  2016-12-22  1:23   ` [PATCH 1/2] generic/244: remove extra junk Eric Sandeen
                     ` (2 more replies)
  1 sibling, 3 replies; 7+ messages in thread
From: Eric Sandeen @ 2016-12-22  1:11 UTC (permalink / raw)
  To: Eric Sandeen, fstests

XFS kernel code had a bug where GETNEXTQUOTA-type
quotactls requesting an ID near UINT_MAX could overflow
and return 0 as the "next" active ID.

This test checks that by creating an active quota near
UINT_MAX, then asking for the next one after it.

The proper answer is ENOENT, but if we wrap we'll return
ID 0.

This also changes test-nextquota.c so that it checks
both GETNEXTQUOTA and XGETNEXTQUOTA even if one fails;
it stores the failure conditions and returns 1 if either
of them fails.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

V2: cleanups from Eryu's review.

Eryu - I need to send a _require_getnextquota patch, and some
other cleanups to 244, similar to your review of this test
(I copied this test from 244).

I'll do that in reply to this patch, hopfully tonight, yet.

diff --git a/src/test-nextquota.c b/src/test-nextquota.c
index ba4de27..73c63d8 100644
--- a/src/test-nextquota.c
+++ b/src/test-nextquota.c
@@ -73,6 +73,7 @@ int main(int argc, char *argv[])
 	int cmd;
 	int type = -1, typeflag = 0;
 	int verbose = 0;
+	int retval = 0;
 	uint id = 0, idflag = 0;
 	char *device = NULL;
 	char *tmp;
@@ -140,30 +141,32 @@ int main(int argc, char *argv[])
 	cmd = QCMD(Q_GETNEXTQUOTA, type);
 	if (quotactl(cmd, device, id, (void *)&dqb) < 0) {
 		perror("Q_GETNEXTQUOTA");
-		return 1;
+		retval = 1;
+	} else {
+		/*
+		 * We only print id and inode limits because
+		 * block count varies depending on fs block size, etc;
+		 * this is just a sanity test that we can retrieve the quota,
+		 * and inode limits have the same units across both calls.
+		 */
+		printf("id        %u\n", dqb.dqb_id);
+		printf("ihard     %llu\n",
+				  (unsigned long long)dqb.dqb_ihardlimit);
+		printf("isoft     %llu\n",
+				  (unsigned long long)dqb.dqb_isoftlimit);
 	}
 
-	/*
-	 * We only print id and inode limits because
-	 * block count varies depending on fs block size, etc;
-	 * this is just a sanity test that we can retrieve the quota,
-	 * and inode limits have the same units across both calls.
-	 */
-	printf("id        %u\n", dqb.dqb_id);
-	printf("ihard     %llu\n", (unsigned long long)dqb.dqb_ihardlimit);
-	printf("isoft     %llu\n", (unsigned long long)dqb.dqb_isoftlimit);
-
 	if (verbose)
 		printf("====Q_XGETNEXTQUOTA====\n");
 	cmd = QCMD(Q_XGETNEXTQUOTA, USRQUOTA);
 	if (quotactl(cmd, device, id, (void *)&xqb) < 0) {
 		perror("Q_XGETNEXTQUOTA");
-		return 1;
+		retval = 1;
+	} else {
+		printf("id        %u\n", xqb.d_id);
+		printf("ihard     %llu\n", xqb.d_ino_hardlimit);
+		printf("isoft     %llu\n", xqb.d_ino_softlimit);
 	}
 
-	printf("id        %u\n", xqb.d_id);
-	printf("ihard     %llu\n", xqb.d_ino_hardlimit);
-	printf("isoft     %llu\n", xqb.d_ino_softlimit);
-
-	return 0;
+	return retval;
 }

diff --git a/tests/generic/395 b/tests/generic/395
new file mode 100755
index 0000000..cc4a93e
--- /dev/null
+++ b/tests/generic/395
@@ -0,0 +1,94 @@
+#! /bin/bash
+# FS QA Test 394
+#
+# test out high quota ids retrieved by Q_GETNEXTQUOTA
+# Request for next ID near 2^32 should not wrap to 0
+#
+# Designed to use the new Q_GETNEXTQUOTA quotactl
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2016 Red Hat, Inc.  All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms 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.  See the
+# GNU General Public License for more details.
+#
+# 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+#
+
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+	cd /
+	rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/quota
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+_supported_fs generic
+_supported_os Linux
+_require_quota
+_require_scratch
+
+_scratch_mkfs >> $seqres.full 2>&1
+
+MOUNT_OPTIONS="-o usrquota,grpquota"
+
+_qmount
+
+# Ok, do we even have GETNEXTQUOTA?  Querying ID 0 should work.
+$here/src/test-nextquota -i 0 -u -d $SCRATCH_DEV &> $seqres.full || \
+	_notrun "No GETNEXTQUOTA support"
+
+echo "Launch all quotas"
+
+# We want to create a block of quotas for an id very near
+# 2^32, then ask for the next quota after it.  The returned
+# ID should not overflow to 0.
+
+# Populate  with 2^32-4
+ID=4294967292
+setquota -u $ID $ID $ID $ID $ID $SCRATCH_MNT
+touch ${SCRATCH_MNT}/${ID}
+chown ${ID} ${SCRATCH_MNT}/${ID}
+
+# remount just for kicks, make sure we get it off disk
+_scratch_unmount
+_qmount
+quotaon $SCRATCH_MNT 2>/dev/null
+
+# Ask for the next quota after $ID; should get nothing back
+# If kernelspace wraps, we'll get 0 back.
+for TYPE in u g; do
+	let NEXT=ID+1
+	echo "Ask for ID after $NEXT expecting nothing"
+	$here/src/test-nextquota -i $NEXT -${TYPE} -d $SCRATCH_DEV
+done
+
+# success, all done
+status=0
+exit
diff --git a/tests/generic/395.out b/tests/generic/395.out
new file mode 100644
index 0000000..bcd87ec
--- /dev/null
+++ b/tests/generic/395.out
@@ -0,0 +1,8 @@
+QA output created by 395
+Launch all quotas
+Ask for ID after 4294967293 expecting nothing
+Q_GETNEXTQUOTA: No such file or directory
+Q_XGETNEXTQUOTA: No such file or directory
+Ask for ID after 4294967293 expecting nothing
+Q_GETNEXTQUOTA: No such file or directory
+Q_XGETNEXTQUOTA: No such file or directory
diff --git a/tests/generic/group b/tests/generic/group
index 20b31ef..e9d3e4a 100644
--- a/tests/generic/group
+++ b/tests/generic/group
@@ -397,3 +397,4 @@
 392 auto quick metadata
 393 auto quick rw
 394 auto quick
+395 auto quick quota


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 1/2] generic/244: remove extra junk
  2016-12-22  1:11 ` [PATCH V2] " Eric Sandeen
@ 2016-12-22  1:23   ` Eric Sandeen
  2016-12-22  1:24   ` [PATCH 2/2] common: add _require_getnextquota helper Eric Sandeen
  2016-12-24 10:20   ` [PATCH V2] generic/395: test GETNEXTQUOTA near INT_MAX Eryu Guan
  2 siblings, 0 replies; 7+ messages in thread
From: Eric Sandeen @ 2016-12-22  1:23 UTC (permalink / raw)
  To: Eric Sandeen, fstests

Lots of pointless mounting & unmounting & quotaon etc,
get rid of it.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

diff --git a/tests/generic/244 b/tests/generic/244
index 0b50438..36c632e 100755
--- a/tests/generic/244
+++ b/tests/generic/244
@@ -54,18 +54,11 @@ _supported_os Linux
 _require_quota
 _require_scratch
 
-scratch_unmount 2>/dev/null
 _scratch_mkfs >> $seqres.full 2>&1
-_scratch_mount "-o usrquota,grpquota"
-quotacheck -u -g $SCRATCH_MNT 2>/dev/null
-quotaon $SCRATCH_MNT 2>/dev/null
-_scratch_unmount
 
 TYPES="u g"
 MOUNT_OPTIONS="-o usrquota,grpquota"
-
 _qmount
-quotaon $SCRATCH_MNT 2>/dev/null
 
 # Ok, do we even have GETNEXTQUOTA?  Querying ID 0 should work.
 $here/src/test-nextquota -i 0 -u -d $SCRATCH_DEV &> $seqres.full || \


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/2] common: add _require_getnextquota helper
  2016-12-22  1:11 ` [PATCH V2] " Eric Sandeen
  2016-12-22  1:23   ` [PATCH 1/2] generic/244: remove extra junk Eric Sandeen
@ 2016-12-22  1:24   ` Eric Sandeen
  2016-12-24 10:20   ` [PATCH V2] generic/395: test GETNEXTQUOTA near INT_MAX Eryu Guan
  2 siblings, 0 replies; 7+ messages in thread
From: Eric Sandeen @ 2016-12-22  1:24 UTC (permalink / raw)
  To: Eric Sandeen, fstests

Add a helper to determine if the kernel supports
the GETNEXTQUOTA quotactl.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

diff --git a/common/quota b/common/quota
index d9bb8d9..d4ae861 100644
--- a/common/quota
+++ b/common/quota
@@ -109,6 +109,16 @@ _require_prjquota()
 }
 
 #
+# Do we have GETNEXTQUOTA?  Querying ID 0 should work.
+#
+_require_getnextquota()
+{
+	_require_test_program "test-nextquota"
+	$here/src/test-nextquota -i 0 -u -d $SCRATCH_DEV &> $seqres.full || \
+		_notrun "No GETNEXTQUOTA support"
+}
+
+#
 # ext4 (for now) is unique in that we must enable the project quota feature
 # prior to mount.  This is a relatively new feature ...
 _scratch_enable_pquota()
diff --git a/tests/generic/244 b/tests/generic/244
index 36c632e..0c64330 100755
--- a/tests/generic/244
+++ b/tests/generic/244
@@ -59,10 +59,7 @@ _scratch_mkfs >> $seqres.full 2>&1
 TYPES="u g"
 MOUNT_OPTIONS="-o usrquota,grpquota"
 _qmount
-
-# Ok, do we even have GETNEXTQUOTA?  Querying ID 0 should work.
-$here/src/test-nextquota -i 0 -u -d $SCRATCH_DEV &> $seqres.full || \
-	_notrun "No GETNEXTQUOTA support"
+_require_getnextquota
 
 echo "Launch all quotas"
 
diff --git a/tests/generic/395 b/tests/generic/395
index cc4a93e..151229d 100755
--- a/tests/generic/395
+++ b/tests/generic/395
@@ -57,12 +57,8 @@ _require_scratch
 _scratch_mkfs >> $seqres.full 2>&1
 
 MOUNT_OPTIONS="-o usrquota,grpquota"
-
 _qmount
-
-# Ok, do we even have GETNEXTQUOTA?  Querying ID 0 should work.
-$here/src/test-nextquota -i 0 -u -d $SCRATCH_DEV &> $seqres.full || \
-	_notrun "No GETNEXTQUOTA support"
+_require_getnextquota
 
 echo "Launch all quotas"
 


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH V2] generic/395: test GETNEXTQUOTA near INT_MAX
  2016-12-22  1:11 ` [PATCH V2] " Eric Sandeen
  2016-12-22  1:23   ` [PATCH 1/2] generic/244: remove extra junk Eric Sandeen
  2016-12-22  1:24   ` [PATCH 2/2] common: add _require_getnextquota helper Eric Sandeen
@ 2016-12-24 10:20   ` Eryu Guan
  2 siblings, 0 replies; 7+ messages in thread
From: Eryu Guan @ 2016-12-24 10:20 UTC (permalink / raw)
  To: Eric Sandeen; +Cc: Eric Sandeen, fstests

On Wed, Dec 21, 2016 at 07:11:21PM -0600, Eric Sandeen wrote:
> XFS kernel code had a bug where GETNEXTQUOTA-type
> quotactls requesting an ID near UINT_MAX could overflow
> and return 0 as the "next" active ID.
> 
> This test checks that by creating an active quota near
> UINT_MAX, then asking for the next one after it.
> 
> The proper answer is ENOENT, but if we wrap we'll return
> ID 0.
> 
> This also changes test-nextquota.c so that it checks
> both GETNEXTQUOTA and XGETNEXTQUOTA even if one fails;
> it stores the failure conditions and returns 1 if either
> of them fails.
> 
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
> 
> V2: cleanups from Eryu's review.
> 
> Eryu - I need to send a _require_getnextquota patch, and some
> other cleanups to 244, similar to your review of this test
> (I copied this test from 244).
> 
> I'll do that in reply to this patch, hopfully tonight, yet.

Thanks, Eric!

> +# remount just for kicks, make sure we get it off disk
> +_scratch_unmount
> +_qmount
> +quotaon $SCRATCH_MNT 2>/dev/null

I removed this quotaon too and merged.

Thanks,
Eryu

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2016-12-24 10:20 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-12-19 15:23 [PATCH] generic/395: test GETNEXTQUOTA near INT_MAX Eric Sandeen
2016-12-20  6:25 ` Eryu Guan
2016-12-20 13:57   ` Eric Sandeen
2016-12-22  1:11 ` [PATCH V2] " Eric Sandeen
2016-12-22  1:23   ` [PATCH 1/2] generic/244: remove extra junk Eric Sandeen
2016-12-22  1:24   ` [PATCH 2/2] common: add _require_getnextquota helper Eric Sandeen
2016-12-24 10:20   ` [PATCH V2] generic/395: test GETNEXTQUOTA near INT_MAX Eryu Guan

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.