From: Eric Sandeen Date: Wed, 21 Dec 2016 05:21:19 +0000 (-0600) Subject: xfs_quota: handle wrapped id from GETNEXTQUOTA X-Git-Tag: v4.9.0-rc1~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ebd6aa8b28878528f07fb1bf6c06a55600f3f783;p=thirdparty%2Fxfsprogs-dev.git xfs_quota: handle wrapped id from GETNEXTQUOTA 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 Reviewed-by: Christoph Hellwig Signed-off-by: Eric Sandeen --- diff --git a/quota/report.c b/quota/report.c index 604f50dc6..fc023028f 100644 --- a/quota/report.c +++ b/quota/report.c @@ -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)