xfs
[Top] [All Lists]

[patch 07/11] Fix compat XFS_IOC_FSBULKSTAT_SINGLE ioctl

To: xfs@xxxxxxxxxxx
Subject: [patch 07/11] Fix compat XFS_IOC_FSBULKSTAT_SINGLE ioctl
From: sandeen@xxxxxxxxxxx
Date: Tue, 18 Nov 2008 22:44:08 -0600
Cc: hch@xxxxxxxxxxxxx, david@xxxxxxxxxxxxx
References: <20081119044401.573365619@xxxxxxxxxxx>
User-agent: quilt/0.46-1
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@xxxxxxxxxxx>
--

Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_ioctl32.c
===================================================================
--- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_ioctl32.c
+++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_ioctl32.c
@@ -279,7 +279,7 @@ xfs_ioc_bulkstat_compat(
        int                     count;  /* # of records returned */
        xfs_ino_t               inlast; /* last inode number */
        int                     done;
-       int                     error;
+       int                     error = EINVAL;
 
        /* done = 1 if there are more stats to get and if bulkstat */
        /* should be called again (unused here, but used in dmapi) */
@@ -310,17 +310,23 @@ xfs_ioc_bulkstat_compat(
        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);
        }
        if (error)
-               return -error;
+               return -XFS_ERROR(error);
 
        if (bulkreq.ocount != NULL) {
                if (copy_to_user(bulkreq.lastip, &inlast, sizeof(xfs_ino_t)) ||

-- 

<Prev in Thread] Current Thread [Next in Thread>