]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
xfs: simplify parsing of allocsize mount option
authorChristoph Hellwig <hch@lst.de>
Mon, 28 Oct 2019 15:41:45 +0000 (08:41 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 29 Oct 2019 16:50:13 +0000 (09:50 -0700)
Rework xfs_parseargs to fill out the default value and then parse the
option directly into the mount structure, similar to what we do for
other updates, and open code the now trivial updates based on on the
on-disk superblock directly into xfs_mountfs.

Note that this change rejects the allocsize=0 mount option that has been
documented as invalid for a long time instead of just ignoring it.

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

index 1853797ea938894856c4ff48ee89c5a1f513373a..3e8eedf01eb2aa937f7d599fddc344fd40c4b2a8 100644 (file)
@@ -425,30 +425,6 @@ xfs_update_alignment(xfs_mount_t *mp)
        return 0;
 }
 
-/*
- * Set the default minimum read and write sizes unless
- * already specified in a mount option.
- * We use smaller I/O sizes when the file system
- * is being used for NFS service (wsync mount option).
- */
-STATIC void
-xfs_set_rw_sizes(xfs_mount_t *mp)
-{
-       xfs_sb_t        *sbp = &(mp->m_sb);
-       int             readio_log, writeio_log;
-
-       if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE))
-               writeio_log = XFS_WRITEIO_LOG_LARGE;
-       else
-               writeio_log = mp->m_allocsize_log;
-
-       if (sbp->sb_blocklog > writeio_log)
-               mp->m_allocsize_log = sbp->sb_blocklog;
-       } else
-               mp->m_allocsize_log = writeio_log;
-       mp->m_allocsize_blocks = 1 << (mp->m_allocsize_log - sbp->sb_blocklog);
-}
-
 /*
  * precalculate the low space thresholds for dynamic speculative preallocation.
  */
@@ -713,9 +689,12 @@ xfs_mountfs(
                goto out_remove_errortag;
 
        /*
-        * Set the minimum read and write sizes
+        * Update the preferred write size based on the information from the
+        * on-disk superblock.
         */
-       xfs_set_rw_sizes(mp);
+       mp->m_allocsize_log =
+               max_t(uint32_t, sbp->sb_blocklog, mp->m_allocsize_log);
+       mp->m_allocsize_blocks = 1U << (mp->m_allocsize_log - sbp->sb_blocklog);
 
        /* set the low space thresholds for dynamic preallocation */
        xfs_set_low_space_thresholds(mp);
index 109081c16a07f05f054c0f2da53843ba7fd9e590..712dbb2039cd4a7767a685f0148d8d9849d4a833 100644 (file)
@@ -244,12 +244,6 @@ typedef struct xfs_mount {
 
 #define XFS_MOUNT_DAX          (1ULL << 62)    /* TEST ONLY! */
 
-
-/*
- * Default write size.
- */
-#define XFS_WRITEIO_LOG_LARGE  16
-
 /*
  * Max and min values for mount-option defined I/O
  * preallocation sizes.
index d1a0958f336d2e979fe1c743c938e8942ca44133..3e5002d2a79eecbc99c19a2fea5cf4b06887062d 100644 (file)
@@ -159,8 +159,7 @@ xfs_parseargs(
        const struct super_block *sb = mp->m_super;
        char                    *p;
        substring_t             args[MAX_OPT_ARGS];
-       int                     iosize = 0;
-       uint8_t                 iosizelog = 0;
+       int                     size = 0;
 
        /*
         * set up the mount name first so all the errors will refer to the
@@ -192,6 +191,7 @@ xfs_parseargs(
         */
        mp->m_logbufs = -1;
        mp->m_logbsize = -1;
+       mp->m_allocsize_log = 16; /* 64k */
 
        if (!options)
                goto done;
@@ -225,9 +225,10 @@ xfs_parseargs(
                                return -ENOMEM;
                        break;
                case Opt_allocsize:
-                       if (suffix_kstrtoint(args, 10, &iosize))
+                       if (suffix_kstrtoint(args, 10, &size))
                                return -EINVAL;
-                       iosizelog = ffs(iosize) - 1;
+                       mp->m_allocsize_log = ffs(size) - 1;
+                       mp->m_flags |= XFS_MOUNT_DFLT_IOSIZE;
                        break;
                case Opt_grpid:
                case Opt_bsdgroups:
@@ -395,17 +396,12 @@ xfs_parseargs(
                return -EINVAL;
        }
 
-       if (iosizelog) {
-               if (iosizelog > XFS_MAX_IO_LOG ||
-                   iosizelog < XFS_MIN_IO_LOG) {
-                       xfs_warn(mp, "invalid log iosize: %d [not %d-%d]",
-                               iosizelog, XFS_MIN_IO_LOG,
-                               XFS_MAX_IO_LOG);
-                       return -EINVAL;
-               }
-
-               mp->m_flags |= XFS_MOUNT_DFLT_IOSIZE;
-               mp->m_allocsize_log = iosizelog;
+       if ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) &&
+           (mp->m_allocsize_log > XFS_MAX_IO_LOG ||
+            mp->m_allocsize_log < XFS_MIN_IO_LOG)) {
+               xfs_warn(mp, "invalid log iosize: %d [not %d-%d]",
+                       mp->m_allocsize_log, XFS_MIN_IO_LOG, XFS_MAX_IO_LOG);
+               return -EINVAL;
        }
 
        return 0;