Whamcloud - gitweb
b=21592 include linux/fs.h only when sys/mount.h doesn't define BLKGETSIZE64
[fs/lustre-release.git] / lustre / utils / mkfs_lustre.c
index 59e68cc..5c11296 100644 (file)
@@ -26,7 +26,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  */
 /*
@@ -68,7 +68,9 @@
 /* libcfs.h is not really needed here, but on SLES10/PPC, fs.h includes idr.h which
  * requires BITS_PER_LONG to be defined */
 #include <libcfs/libcfs.h>
+#ifndef BLKGETSIZE64
 #include <linux/fs.h> /* for BLKGETSIZE64 */
+#endif
 #include <linux/version.h>
 #endif
 #include <lustre_disk.h>
@@ -130,6 +132,7 @@ void usage(FILE *out)
                 */
                 "\t\t--comment=<user comment>: arbitrary user string (%d bytes)\n"
                 "\t\t--mountfsoptions=<opts> : permanent mount options\n"
+                "\t\t--network=<net>[,<...>] : network(s) to restrict this ost/mdt to\n"
 #ifndef TUNEFS
                 "\t\t--backfstype=<fstype> : backing fs type (ext3, ldiskfs)\n"
                 "\t\t--device-size=#N(KB) : device size for loop devices\n"
@@ -526,7 +529,13 @@ static void enable_default_backfs_features(struct mkfs_opts *mop)
         int maj_high, maj_low, min;
         int ret;
 
-        strscat(mop->mo_mkfsopts, " -O dir_index,extents", sizeof(mop->mo_mkfsopts));
+        if (IS_MDT(&mop->mo_ldd))
+                strscat(mop->mo_mkfsopts, " -O dir_index,extents,dirdata",
+                                sizeof(mop->mo_mkfsopts));
+        else
+                strscat(mop->mo_mkfsopts, " -O dir_index,extents",
+                                sizeof(mop->mo_mkfsopts));
+
 
         /* Upstream e2fsprogs called our uninit_groups feature uninit_bg,
          * check for both of them when testing e2fsprogs features. */
@@ -564,11 +573,24 @@ static void enable_default_backfs_features(struct mkfs_opts *mop)
 /* Build fs according to type */
 int make_lustre_backfs(struct mkfs_opts *mop)
 {
+        __u64 device_sz = mop->mo_device_sz, block_count = 0;
         char mkfs_cmd[PATH_MAX];
         char buf[64];
         char *dev;
         int ret = 0;
-        int block_count = 0;
+
+        if (!(mop->mo_flags & MO_IS_LOOP)) {
+                mop->mo_device_sz = get_device_size(mop->mo_device);
+
+                if (mop->mo_device_sz == 0)
+                        return ENODEV;
+
+                /* Compare to real size */
+                if (device_sz == 0 || device_sz > mop->mo_device_sz)
+                        device_sz = mop->mo_device_sz;
+                else
+                        mop->mo_device_sz = device_sz;
+        }
 
         if (mop->mo_device_sz != 0) {
                 if (mop->mo_device_sz < 8096){
@@ -583,15 +605,6 @@ int make_lustre_backfs(struct mkfs_opts *mop)
         if ((mop->mo_ldd.ldd_mount_type == LDD_MT_EXT3) ||
             (mop->mo_ldd.ldd_mount_type == LDD_MT_LDISKFS) ||
             (mop->mo_ldd.ldd_mount_type == LDD_MT_LDISKFS2)) {
-                __u64 device_sz = mop->mo_device_sz;
-
-                /* we really need the size */
-                if (device_sz == 0) {
-                        device_sz = get_device_size(mop->mo_device);
-                        if (device_sz == 0)
-                                return ENODEV;
-                }
-
                 /* Journal size in MB */
                 if (strstr(mop->mo_mkfsopts, "-J") == NULL) {
                         /* Choose our own default journal size */
@@ -699,7 +712,7 @@ int make_lustre_backfs(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     %d\n", block_count);
+        vprint("\t4k blocks     "LPU64"\n", block_count);
         vprint("\toptions       %s\n", mop->mo_mkfsopts);
 
         /* mkfs_cmd's trailing space is important! */
@@ -707,7 +720,7 @@ int make_lustre_backfs(struct mkfs_opts *mop)
         strscat(mkfs_cmd, " ", sizeof(mkfs_cmd));
         strscat(mkfs_cmd, dev, sizeof(mkfs_cmd));
         if (block_count != 0) {
-                sprintf(buf, " %d", block_count);
+                sprintf(buf, " "LPU64, block_count);
                 strscat(mkfs_cmd, buf, sizeof(mkfs_cmd));
         }
 
@@ -834,7 +847,8 @@ int write_local_files(struct mkfs_opts *mop)
         if (mop->mo_flags & MO_IS_LOOP)
                 dev = mop->mo_loopdev;
 
-        ret = mount(dev, mntpt, MT_STR(&mop->mo_ldd), 0, NULL);
+        ret = mount(dev, mntpt, MT_STR(&mop->mo_ldd), 0,
+                    mop->mo_ldd.ldd_mount_opts);
         if (ret) {
                 fprintf(stderr, "%s: Unable to mount %s: %s\n",
                         progname, dev, strerror(errno));
@@ -1213,6 +1227,7 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop,
                 {"verbose", 0, 0, 'v'},
                 {"writeconf", 0, 0, 'w'},
                 {"upgrade_to_18", 0, 0, 'U'},
+                {"network", 1, 0, 't'},
                 {0, 0, 0, 0}
         };
         char *optstring = "b:c:C:d:ef:Ghi:k:L:m:MnNo:Op:Pqru:vw";
@@ -1368,6 +1383,22 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop,
                 case 'r':
                         mop->mo_flags |= MO_FORCEFORMAT;
                         break;
+                case 't':
+                        if (!IS_MDT(&mop->mo_ldd) && !IS_OST(&mop->mo_ldd)) {
+                                badopt(long_opt[longidx].name, "MDT,OST");
+                                return 1;
+                        }
+
+                        if (!optarg)
+                                return 1;
+
+                        rc = add_param(mop->mo_ldd.ldd_params,
+                                       PARAM_NETWORK, optarg);
+                        if (rc != 0)
+                                return rc;
+                        /* Must update the mgs logs */
+                        mop->mo_ldd.ldd_flags |= LDD_F_UPDATE;
+                        break;
                 case 'u':
                         strscpy(mop->mo_ldd.ldd_userdata, optarg,
                                 sizeof(mop->mo_ldd.ldd_userdata));
@@ -1408,7 +1439,7 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop,
  */
 static int in_mntlist(char *opt, char *mntlist)
 {
-        char *ml, *mlp, *item, *ctx;
+        char *ml, *mlp, *item, *ctx = NULL;
 
         if (!(ml = strdup(mntlist))) {
                 fprintf(stderr, "%s: out of memory\n", progname);
@@ -1431,7 +1462,7 @@ static int in_mntlist(char *opt, char *mntlist)
 static int check_mountfsoptions(char *mountopts, char *wanted_mountopts,
                                 int justwarn)
 {
-        char *ml, *mlp, *item, *ctx;
+        char *ml, *mlp, *item, *ctx = NULL;
         int errors = 0;
 
         if (!(ml = strdup(wanted_mountopts))) {