X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Fmount_utils_ldiskfs.c;h=4092eca9752dff1c60854bad5c672f95b0f4e286;hp=e3501334813bf9b9c50e25ed7e3d4cf2bd88db54;hb=b6dfd13e1d0ca4d280777cd0a30a78a63d49eda9;hpb=8caff5d019674aea7d98e225d0136bf4694d5157 diff --git a/lustre/utils/mount_utils_ldiskfs.c b/lustre/utils/mount_utils_ldiskfs.c index e350133..4092eca 100644 --- a/lustre/utils/mount_utils_ldiskfs.c +++ b/lustre/utils/mount_utils_ldiskfs.c @@ -15,11 +15,7 @@ * * 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 /* for BLKGETSIZE64 */ #endif +#include #include -#include #include #include #include @@ -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. */ @@ -568,7 +574,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 ", @@ -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) {