[XFS] Fix compat XFS_IOC_FSBULKSTAT_SINGLE ioctl
authorsandeen@sandeen.net <sandeen@sandeen.net>
Wed, 26 Nov 2008 03:20:13 +0000 (21:20 -0600)
committerLachlan McIlroy <lachlan@redback.melbourne.sgi.com>
Tue, 2 Dec 2008 06:16:24 +0000 (17:16 +1100)
The XFS_IOC_FSBULKSTAT_SINGLE ioctl passes in the
desired inode number, while XFS_IOC_FSBULKSTAT passes
in the previous/last-stat'd inode number.  The
compat handler wasn't differentiating these, so
when a XFS_IOC_FSBULKSTAT_SINGLE request for inode
128 was sent in, stat information for 131 was sent out.

Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
fs/xfs/linux-2.6/xfs_ioctl32.c

index 2d33606..cc1fe96 100644 (file)
@@ -291,15 +291,22 @@ xfs_compat_ioc_bulkstat(
        if (bulkreq.ubuffer == NULL)
                return -XFS_ERROR(EINVAL);
 
-       if (cmd == XFS_IOC_FSINUMBERS_32)
+       if (cmd == XFS_IOC_FSINUMBERS_32) {
                error = xfs_inumbers(mp, &inlast, &count,
                                bulkreq.ubuffer, xfs_inumbers_fmt_compat);
-       else {
+       } else if (cmd == XFS_IOC_FSBULKSTAT_SINGLE_32) {
+               int res;
+
+               error = xfs_bulkstat_one_compat(mp, inlast, bulkreq.ubuffer,
+                               sizeof(compat_xfs_bstat_t),
+                               NULL, 0, NULL, NULL, &res);
+       } else if (cmd == XFS_IOC_FSBULKSTAT_32) {
                error = xfs_bulkstat(mp, &inlast, &count,
                        xfs_bulkstat_one_compat, NULL,
                        sizeof(compat_xfs_bstat_t), bulkreq.ubuffer,
                        BULKSTAT_FG_QUICK, &done);
-       }
+       } else
+               error = XFS_ERROR(EINVAL);
        if (error)
                return -error;