]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_quota: handle wrapped id from GETNEXTQUOTA
authorEric Sandeen <sandeen@redhat.com>
Wed, 21 Dec 2016 05:21:19 +0000 (23:21 -0600)
committerEric Sandeen <sandeen@redhat.com>
Wed, 21 Dec 2016 05:21:19 +0000 (23:21 -0600)
The GETNEXTQUOTA interface in the kernel had a bug
(at least in xfs) where if we pass in UINT_MAX as the
ID, it incremented, warpped, and returned 0 for the next
id.  This would cause userspace to start querying
again at zero, and an xfs_quota "report" command would
loop forever.  This occurred if a quota ID near
UINT max existed, and later offsets within the block
wrapped the xfs_dqid_t.

This will also be fixed in the kernel, but we should also
catch this in userspace, and stop the loop if it happens.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
quota/report.c

index 604f50dc6001b9f828312a2104eb4511a7b33a23..fc023028f407fe0b365840fdc0f2b4c055bfa883 100644 (file)
@@ -101,6 +101,10 @@ dump_file(
        if (oid)
                *oid = d.d_id;
 
+       /* Did kernelspace wrap? */
+       if (*oid < id)
+               return 0;
+
        if (!d.d_blk_softlimit && !d.d_blk_hardlimit &&
            !d.d_ino_softlimit && !d.d_ino_hardlimit &&
            !d.d_rtb_softlimit && !d.d_rtb_hardlimit)
@@ -360,6 +364,10 @@ report_mount(
        if (oid)
                *oid = d.d_id;
 
+       /* Did kernelspace wrap? */
+       if (*oid < id)
+               return 0;
+
        if (flags & TERSE_FLAG) {
                count = 0;
                if ((form & XFS_BLOCK_QUOTA) && d.d_bcount)