Whamcloud - gitweb
LU-8998 utils: enlarge default inode size
[fs/lustre-release.git] / lustre / utils / mount_utils_ldiskfs.c
index 3e50ae7..4092eca 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/
@@ -70,8 +66,8 @@
 #ifndef BLKGETSIZE64
 #include <linux/fs.h> /* for BLKGETSIZE64 */
 #endif
+#include <linux/types.h>
 #include <linux/version.h>
-#include <lustre_disk.h>
 #include <lustre_param.h>
 #include <lnet/lnetctl.h>
 #include <lustre_ver.h>
@@ -219,7 +215,7 @@ static int is_feature_enabled(const char *feature, const char *devpath)
        char enabled_features[4096] = "";
        int ret = 1;
 
-       snprintf(cmd, sizeof(cmd), "%s -R features %s 2>&1",
+       snprintf(cmd, sizeof(cmd), "%s -c -R features %s 2>&1",
                 DEBUGFS, devpath);
 
        /* Using popen() instead of run_command() since debugfs does
@@ -310,6 +306,7 @@ int ldiskfs_write_ldd(struct mkfs_opts *mop)
                fclose(filep);
                goto out_umnt;
        }
+       fsync(filep->_fileno);
        fclose(filep);
 
 out_umnt:
@@ -392,6 +389,15 @@ int ldiskfs_read_ldd(char *dev, struct lustre_disk_data *mo_ldd)
        return ret;
 }
 
+int ldiskfs_erase_ldd(struct mkfs_opts *mop, char *param)
+{
+       return 0;
+}
+
+void ldiskfs_print_ldd_params(struct mkfs_opts *mop)
+{
+       printf("Parameters:%s\n", mop->mo_ldd.ldd_params);
+}
 
 /* Display the need for the latest e2fsprogs to be installed. make_backfs
  * indicates if the caller is make_lustre_backfs() or not. */
@@ -750,11 +756,17 @@ int ldiskfs_make_lustre(struct mkfs_opts *mop)
                        }
                }
 
-               /* Inode size includes:
+               /*
+                * The inode size is constituted by following elements
+                * (assuming all files are in composite layout and has
+                * 3 components):
+                *
                 *   ldiskfs inode size: 156
                 *   extended attributes size, including:
                 *      ext4_xattr_header: 32
-                *      LOV EA size: 32(lov_mds_md) +
+                *      LOV EA size: 32(lov_comp_md_v1) +
+                *                   3 * 40(lov_comp_md_entry_v1) +
+                *                   3 * 32(lov_mds_md) +
                 *                   stripes * 24(lov_ost_data) +
                 *                   16(xattr_entry) + 3(lov)
                 *      LMA EA size: 24(lustre_mdt_attrs) +
@@ -765,24 +777,22 @@ int ldiskfs_make_lustre(struct mkfs_opts *mop)
                 *
                 * If we say the average filename length is about 32 bytes,
                 * the calculation looks like:
-                * 156 + 32 + (32+24*N+19) + (24+19) + (24+18+~32+20) + other <=
-                * 512*2^m, {m=0,1,2,3}
+                * 156 + 32 + (32+3*(40 + 32)+24*N+19) + (24+19) +
+                * (24+18+~32+20) + other <= 512*2^m, {m=0,1,2,3}
                 */
                if (strstr(mop->mo_mkfsopts, "-I") == NULL) {
                        if (IS_MDT(&mop->mo_ldd)) {
-                               if (mop->mo_stripe_count > 69)
+                               if (mop->mo_stripe_count > 59)
                                        inode_size = 512; /* bz 7241 */
                                /* see also "-i" below for EA blocks */
-                               else if (mop->mo_stripe_count > 26)
+                               else if (mop->mo_stripe_count > 16)
                                        inode_size = 2048;
-                               else if (mop->mo_stripe_count > 5)
-                                       inode_size = 1024;
                                else
-                                       inode_size = 512;
+                                       inode_size = 1024;
                        } else if (IS_OST(&mop->mo_ldd)) {
-                               /* We store MDS FID and OST objid in EA on OST
-                                * we need to make inode bigger as well. */
-                               inode_size = 256;
+                               /* We store MDS FID and necessary composite
+                                * layout information in the OST object EA. */
+                               inode_size = 512;
                        }
 
                        if (inode_size > 0) {
@@ -805,7 +815,7 @@ int ldiskfs_make_lustre(struct mkfs_opts *mop)
                        if (IS_MDT(&mop->mo_ldd)) {
                                bytes_per_inode = inode_size + 1536;
 
-                               if (mop->mo_stripe_count > 69) {
+                               if (mop->mo_stripe_count > 59) {
                                        int extra = mop->mo_stripe_count * 24;
                                        extra = ((extra - 1) | 4095) + 1;
                                        bytes_per_inode += extra;
@@ -889,7 +899,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;
@@ -1196,16 +1207,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) {
@@ -1230,14 +1245,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);
@@ -1311,6 +1327,69 @@ int ldiskfs_label_lustre(struct mount_opts *mop)
        return rc;
 }
 
+int ldiskfs_rename_fsname(struct mkfs_opts *mop, const char *oldname)
+{
+       struct mount_opts opts;
+       struct lustre_disk_data *ldd = &mop->mo_ldd;
+       char mntpt[] = "/tmp/mntXXXXXX";
+       char *dev;
+       int ret;
+
+       /* Change the filesystem label. */
+       opts.mo_ldd = *ldd;
+       opts.mo_source = mop->mo_device;
+       ret = ldiskfs_label_lustre(&opts);
+       if (ret) {
+               if (errno != 0)
+                       ret = errno;
+               fprintf(stderr, "Can't change filesystem label: %s\n",
+                       strerror(ret));
+               return ret;
+       }
+
+       /* Mount this device temporarily in order to write these files */
+       if (mkdtemp(mntpt) == NULL) {
+               if (errno != 0)
+                       ret = errno;
+               else
+                       ret = EINVAL;
+               fprintf(stderr, "Can't create temp mount point %s: %s\n",
+                       mntpt, strerror(ret));
+               return ret;
+       }
+
+#ifdef HAVE_SELINUX
+       /*
+        * Append file context to mount options if SE Linux is enabled
+        */
+       if (is_selinux_enabled() > 0)
+               append_context_for_mount(mntpt, mop);
+#endif
+
+       if (mop->mo_flags & MO_IS_LOOP)
+               dev = mop->mo_loopdev;
+       else
+               dev = mop->mo_device;
+       ret = mount(dev, mntpt, MT_STR(ldd), 0, ldd->ldd_mount_opts);
+       if (ret) {
+               if (errno != 0)
+                       ret = errno;
+               fprintf(stderr, "Unable to mount %s: %s\n",
+                       dev, strerror(ret));
+               if (ret == ENODEV)
+                       fprintf(stderr, "Is the %s module available?\n",
+                               MT_STR(ldd));
+               goto out_rmdir;
+       }
+
+       ret = lustre_rename_fsname(mop, mntpt, oldname);
+       umount(mntpt);
+
+out_rmdir:
+       rmdir(mntpt);
+       return ret;
+}
+
 /* Enable quota accounting */
 int ldiskfs_enable_quota(struct mkfs_opts *mop)
 {