Whamcloud - gitweb
LU-8443 utils: exclude "resize" parameter with meta_bg option
[fs/lustre-release.git] / lustre / utils / mount_utils_ldiskfs.c
index f3e9c2b..9576e66 100644 (file)
 #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 +80,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"
@@ -93,8 +96,11 @@ extern char *progname;
 #define DUMMY_FILE_NAME_LEN             25
 #define EXT3_DIRENT_SIZE                DUMMY_FILE_NAME_LEN
 
+static void append_unique(char *buf, char *prefix, char *key, char *val,
+                         size_t maxbuflen);
+
 /*
- * Concatenate context of the temporary mount point iff selinux is enabled
+ * Concatenate context of the temporary mount point if selinux is enabled
  */
 #ifdef HAVE_SELINUX
 static void append_context_for_mount(char *mntpt, struct mkfs_opts *mop)
@@ -109,8 +115,9 @@ static void append_context_for_mount(char *mntpt, struct mkfs_opts *mop)
        }
 
        if (fcontext != NULL) {
-               strcat(mop->mo_ldd.ldd_mount_opts, ",context=");
-               strcat(mop->mo_ldd.ldd_mount_opts, fcontext);
+               append_unique(mop->mo_ldd.ldd_mount_opts,
+                             ",", "context", fcontext,
+                             sizeof(mop->mo_ldd.ldd_mount_opts));
                freecon(fcontext);
        }
 }
@@ -549,8 +556,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);
                }
        }
 }
@@ -560,7 +568,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 ",
@@ -696,9 +704,9 @@ int ldiskfs_make_lustre(struct mkfs_opts *mop)
        }
 
        if (mop->mo_device_kb != 0) {
-               if (mop->mo_device_kb < 8096) {
+               if (mop->mo_device_kb < 32384) {
                        fprintf(stderr, "%s: size of filesystem must be larger "
-                               "than 8MB, but is set to %lldKB\n",
+                               "than 32MB, but is set to %lldKB\n",
                                progname, (long long)mop->mo_device_kb);
                        return EINVAL;
                }
@@ -881,7 +889,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;
@@ -921,8 +930,8 @@ int ldiskfs_make_lustre(struct mkfs_opts *mop)
 
        vprint("formatting backing filesystem %s on %s\n",
               MT_STR(&mop->mo_ldd), dev);
-       vprint("\ttarget name  %s\n", mop->mo_ldd.ldd_svname);
-       vprint("\t4k blocks     "LPU64"\n", block_count);
+       vprint("\ttarget name   %s\n", mop->mo_ldd.ldd_svname);
+       vprint("\t4k blocks     %ju\n", (uintmax_t)block_count);
        vprint("\toptions       %s\n", mop->mo_mkfsopts);
 
        /* mkfs_cmd's trailing space is important! */
@@ -930,7 +939,8 @@ int ldiskfs_make_lustre(struct mkfs_opts *mop)
        strscat(mkfs_cmd, " ", sizeof(mkfs_cmd));
        strscat(mkfs_cmd, dev, sizeof(mkfs_cmd));
        if (block_count != 0) {
-               sprintf(buf, " "LPU64, block_count);
+               snprintf(buf, sizeof(buf), " %ju",
+                        (uintmax_t)block_count);
                strscat(mkfs_cmd, buf, sizeof(mkfs_cmd));
        }