]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
xfs: cleanup calculating the stat optimal I/O size
authorChristoph Hellwig <hch@lst.de>
Mon, 28 Oct 2019 15:41:43 +0000 (08:41 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 29 Oct 2019 16:50:12 +0000 (09:50 -0700)
Move xfs_preferred_iosize to xfs_iops.c, unobsfucate it and also handle
the realtime special case in the helper.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_iops.c
fs/xfs/xfs_mount.h

index 404f2dd58698bed235f9c67779f42f184a26b7c0..b6dbfd8eb6a1d7746baa7c6dec041e08a93af05f 100644 (file)
@@ -484,6 +484,42 @@ xfs_vn_get_link_inline(
        return link;
 }
 
+static uint32_t
+xfs_stat_blksize(
+       struct xfs_inode        *ip)
+{
+       struct xfs_mount        *mp = ip->i_mount;
+
+       /*
+        * If the file blocks are being allocated from a realtime volume, then
+        * always return the realtime extent size.
+        */
+       if (XFS_IS_REALTIME_INODE(ip))
+               return xfs_get_extsz_hint(ip) << mp->m_sb.sb_blocklog;
+
+       /*
+        * Allow large block sizes to be reported to userspace programs if the
+        * "largeio" mount option is used.
+        *
+        * If compatibility mode is specified, simply return the basic unit of
+        * caching so that we don't get inefficient read/modify/write I/O from
+        * user apps. Otherwise....
+        *
+        * If the underlying volume is a stripe, then return the stripe width in
+        * bytes as the recommended I/O size. It is not a stripe and we've set a
+        * default buffered I/O size, return that, otherwise return the compat
+        * default.
+        */
+       if (!(mp->m_flags & XFS_MOUNT_COMPAT_IOSIZE)) {
+               if (mp->m_swidth)
+                       return mp->m_swidth << mp->m_sb.sb_blocklog;
+               if (mp->m_flags & XFS_MOUNT_DFLT_IOSIZE)
+                       return 1U << max(mp->m_readio_log, mp->m_writeio_log);
+       }
+
+       return PAGE_SIZE;
+}
+
 STATIC int
 xfs_vn_getattr(
        const struct path       *path,
@@ -543,16 +579,7 @@ xfs_vn_getattr(
                stat->rdev = inode->i_rdev;
                break;
        default:
-               if (XFS_IS_REALTIME_INODE(ip)) {
-                       /*
-                        * If the file blocks are being allocated from a
-                        * realtime volume, then return the inode's realtime
-                        * extent size or the realtime volume's extent size.
-                        */
-                       stat->blksize =
-                               xfs_get_extsz_hint(ip) << mp->m_sb.sb_blocklog;
-               } else
-                       stat->blksize = xfs_preferred_iosize(mp);
+               stat->blksize = xfs_stat_blksize(ip);
                stat->rdev = 0;
                break;
        }
index fdb60e09a9c543eb65d4c233ea3f2b9243fa41d6..f69e370db341dca7357a91ada58edcd144bbdf02 100644 (file)
@@ -267,30 +267,6 @@ typedef struct xfs_mount {
 #define        XFS_WSYNC_READIO_LOG    15      /* 32k */
 #define        XFS_WSYNC_WRITEIO_LOG   14      /* 16k */
 
-/*
- * Allow large block sizes to be reported to userspace programs if the
- * "largeio" mount option is used.
- *
- * If compatibility mode is specified, simply return the basic unit of caching
- * so that we don't get inefficient read/modify/write I/O from user apps.
- * Otherwise....
- *
- * If the underlying volume is a stripe, then return the stripe width in bytes
- * as the recommended I/O size. It is not a stripe and we've set a default
- * buffered I/O size, return that, otherwise return the compat default.
- */
-static inline unsigned long
-xfs_preferred_iosize(xfs_mount_t *mp)
-{
-       if (mp->m_flags & XFS_MOUNT_COMPAT_IOSIZE)
-               return PAGE_SIZE;
-       return (mp->m_swidth ?
-               (mp->m_swidth << mp->m_sb.sb_blocklog) :
-               ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) ?
-                       (1 << (int)max(mp->m_readio_log, mp->m_writeio_log)) :
-                       PAGE_SIZE));
-}
-
 #define XFS_LAST_UNMOUNT_WAS_CLEAN(mp) \
                                ((mp)->m_flags & XFS_MOUNT_WAS_CLEAN)
 #define XFS_FORCED_SHUTDOWN(mp)        ((mp)->m_flags & XFS_MOUNT_FS_SHUTDOWN)