Whamcloud - gitweb
LU-9132 utils: tuning max_sectors_kb on mount
[fs/lustre-release.git] / lustre / utils / mount_utils_ldiskfs.c
index 1ce4aa1..6e566ba 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
@@ -27,7 +23,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2012, 2015, Intel Corporation.
+ * Copyright (c) 2012, 2016, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
-#include "mount_utils.h"
-#include <stdlib.h>
+#include <stdarg.h>
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <inttypes.h>
 #include <unistd.h>
 #include <fcntl.h>
-#include <stdarg.h>
 #include <mntent.h>
 #include <glob.h>
 
@@ -79,6 +76,8 @@
 #include <selinux/selinux.h>
 #endif
 
+#include "mount_utils.h"
+
 #define MAX_HW_SECTORS_KB_PATH "queue/max_hw_sectors_kb"
 #define MAX_SECTORS_KB_PATH    "queue/max_sectors_kb"
 #define SCHEDULER_PATH         "queue/scheduler"
@@ -307,6 +306,7 @@ int ldiskfs_write_ldd(struct mkfs_opts *mop)
                fclose(filep);
                goto out_umnt;
        }
+       fsync(filep->_fileno);
        fclose(filep);
 
 out_umnt:
@@ -553,8 +553,9 @@ static void append_unique(char *buf, char *prefix, char *key, char *val,
 
                strscat(buf, key, maxbuflen);
                if (val != NULL) {
-                       strscat(buf, "=", maxbuflen);
+                       strscat(buf, "=\"", maxbuflen);
                        strscat(buf, val, maxbuflen);
+                       strscat(buf, "\"", maxbuflen);
                }
        }
 }
@@ -564,7 +565,7 @@ static int enable_default_ext4_features(struct mkfs_opts *mop, char *anchor,
 {
        if (IS_OST(&mop->mo_ldd)) {
                append_unique(anchor, user_spec ? "," : " -O ",
-                             "extents", NULL, sizeof(mop->mo_mkfsopts));
+                             "extents", NULL, maxbuflen);
                append_unique(anchor, ",", "uninit_bg", NULL, maxbuflen);
        } else if (IS_MDT(&mop->mo_ldd)) {
                append_unique(anchor, user_spec ? "," : " -O ",
@@ -885,7 +886,8 @@ int ldiskfs_make_lustre(struct mkfs_opts *mop)
                 * descriptor blocks, but leave one block for the superblock.
                 * Only useful for filesystems with < 2^32 blocks due to resize
                 * limitations. */
-               if (IS_OST(&mop->mo_ldd) && mop->mo_device_kb > 100 * 1024 &&
+               if (strstr(mop->mo_mkfsopts, "meta_bg") == NULL &&
+                   IS_OST(&mop->mo_ldd) && mop->mo_device_kb > 100 * 1024 &&
                    mop->mo_device_kb * 1024 / L_BLOCK_SIZE <= 0xffffffffULL) {
                        unsigned group_blocks = L_BLOCK_SIZE * 8;
                        unsigned desc_per_block = L_BLOCK_SIZE / 32;
@@ -1192,16 +1194,20 @@ set_params:
                return rc;
        }
 
-       snprintf(real_path, sizeof(real_path), "%s/%s", path,
-                MAX_HW_SECTORS_KB_PATH);
-       rc = read_file(real_path, buf, sizeof(buf));
-       if (rc) {
-               if (verbose)
-                       fprintf(stderr, "warning: opening %s: %s\n",
-                               real_path, strerror(errno));
-               /* No MAX_HW_SECTORS_KB_PATH isn't necessary an
-                * error for some device. */
-               goto subdevs;
+       if (mop->mo_max_sectors_kb >= 0) {
+               snprintf(buf, sizeof(buf), "%d", mop->mo_max_sectors_kb);
+       } else {
+               snprintf(real_path, sizeof(real_path), "%s/%s", path,
+                        MAX_HW_SECTORS_KB_PATH);
+               rc = read_file(real_path, buf, sizeof(buf));
+               if (rc) {
+                       if (verbose)
+                               fprintf(stderr, "warning: opening %s: %s\n",
+                                       real_path, strerror(errno));
+                       /* No MAX_HW_SECTORS_KB_PATH isn't necessary an
+                        * error for some device. */
+                       goto subdevs;
+               }
        }
 
        if (strlen(buf) - 1 > 0) {
@@ -1226,14 +1232,15 @@ set_params:
                 * PTLRPC_MAX_BRW_SIZE, but that isn't in a public header.
                 * Note that even though the block layer allows larger values,
                 * setting max_sectors_kb = 32768 causes crashes (LU-6974). */
-               if (newval > 16 * 1024) {
+               if (mop->mo_max_sectors_kb < 0 && newval > 16 * 1024) {
                        newval = 16 * 1024;
                        snprintf(buf, sizeof(buf), "%llu", newval);
                }
 
                oldval = strtoull(oldbuf, &end, 0);
                /* Don't shrink the current limit. */
-               if (oldval != ULLONG_MAX && newval <= oldval)
+               if (mop->mo_max_sectors_kb < 0 && oldval != ULLONG_MAX &&
+                   newval <= oldval)
                        goto subdevs;
 
                rc = write_file(real_path, buf);