X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Fmount_utils_ldiskfs.c;h=6bc37a2187159f234e5e17a3e00164cd4e174bda;hb=a99e42c9fa47677cd2468abfa9378d776cc40803;hp=0eb2ed8ac8c5c1062f0926955c97acd3c81af4c7;hpb=1f1d3a376d488d715dd1b0c94d5b66ea05c1e6ca;p=fs%2Flustre-release.git diff --git a/lustre/utils/mount_utils_ldiskfs.c b/lustre/utils/mount_utils_ldiskfs.c index 0eb2ed8a..6bc37a21 100644 --- a/lustre/utils/mount_utils_ldiskfs.c +++ b/lustre/utils/mount_utils_ldiskfs.c @@ -27,7 +27,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, 2013, Intel Corporation. + * Copyright (c) 2012, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -66,9 +66,6 @@ #include #include -/* 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 #ifndef BLKGETSIZE64 #include /* for BLKGETSIZE64 */ #endif @@ -618,7 +615,8 @@ static int enable_default_ext4_features(struct mkfs_opts *mop, char *anchor, append_unique(anchor, ",", "flex_bg", NULL, maxbuflen); - if (IS_OST(&mop->mo_ldd)) { + if (IS_OST(&mop->mo_ldd) && + strstr(mop->mo_mkfsopts, "-G") == NULL) { snprintf(tmp_buf, sizeof(tmp_buf), " -G %u", (1 << 20) / L_BLOCK_SIZE); strscat(anchor, tmp_buf, maxbuflen); @@ -743,17 +741,32 @@ int ldiskfs_make_lustre(struct mkfs_opts *mop) } } - /* Inode size (for extended attributes). The LOV EA size is - * 32 (EA hdr) + 32 (lov_mds_md) + stripes * 24 (lov_ost_data), - * and we want some margin above that for ACLs, other EAs... */ + /* Inode size includes: + * ldiskfs inode size: 156 + * extended attributes size, including: + * ext4_xattr_header: 32 + * LOV EA size: 32(lov_mds_md) + + * stripes * 24(lov_ost_data) + + * 16(xattr_entry) + 3(lov) + * LMA EA size: 24(lustre_mdt_attrs) + + * 16(xattr_entry) + 3(lma) + * link EA size: 24(link_ea_header) + 18(link_ea_entry) + + * (filename) + 16(xattr_entry) + 4(link) + * and some margin for 4-byte alignment, ACLs and other EAs. + * + * 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} + */ if (strstr(mop->mo_mkfsopts, "-I") == NULL) { if (IS_MDT(&mop->mo_ldd)) { - if (mop->mo_stripe_count > 72) + if (mop->mo_stripe_count > 69) inode_size = 512; /* bz 7241 */ /* see also "-i" below for EA blocks */ - else if (mop->mo_stripe_count > 32) + else if (mop->mo_stripe_count > 26) inode_size = 2048; - else if (mop->mo_stripe_count > 10) + else if (mop->mo_stripe_count > 5) inode_size = 1024; else inode_size = 512; @@ -783,7 +796,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 > 72) { + if (mop->mo_stripe_count > 69) { int extra = mop->mo_stripe_count * 24; extra = ((extra - 1) | 4095) + 1; bytes_per_inode += extra; @@ -959,32 +972,38 @@ static int read_file(const char *path, char *buf, int size) if (fd == NULL) return errno; - /* should not ignore fgets(3)'s return value */ - if (!fgets(buf, size, fd)) { + if (fgets(buf, size, fd) == NULL) { fprintf(stderr, "reading from %s: %s", path, strerror(errno)); fclose(fd); return 1; } fclose(fd); + + /* strip trailing newline */ + size = strlen(buf); + if (buf[size - 1] == '\n') + buf[size - 1] = '\0'; + return 0; } static int write_file(const char *path, const char *buf) { - FILE *fd; + int fd, rc; - fd = fopen(path, "w"); - if (fd == NULL) + fd = open(path, O_WRONLY); + if (fd < 0) return errno; - fputs(buf, fd); - fclose(fd); - return 0; + rc = write(fd, buf, strlen(buf)); + close(fd); + + return rc < 0 ? errno : 0; } static int set_blockdev_scheduler(const char *path, const char *scheduler) { - char buf[PATH_MAX], *c; + char buf[PATH_MAX], *s, *e, orig_sched[50]; int rc; /* Before setting the scheduler, we need to check to see if it's @@ -1001,18 +1020,21 @@ static int set_blockdev_scheduler(const char *path, const char *scheduler) } /* The expected format of buf: noop anticipatory deadline [cfq] */ - c = strchr(buf, '['); + s = strchr(buf, '['); + e = strchr(buf, ']'); - /* If c is NULL, the format is not what we expect. Play it safe - * and error out. */ - if (c == NULL) { + /* If the format is not what we expect. Play it safe and error out. */ + if (s == NULL || e == NULL) { if (verbose) fprintf(stderr, "%s: cannot parse scheduler " "options for '%s'\n", progname, path); return -EINVAL; } - if (strncmp(c+1, "noop", 4) == 0) + snprintf(orig_sched, e - s, "%s", s + 1); + + if (strcmp(orig_sched, "noop") == 0 || + strcmp(orig_sched, scheduler) == 0) return 0; rc = write_file(path, scheduler); @@ -1022,6 +1044,9 @@ static int set_blockdev_scheduler(const char *path, const char *scheduler) "'%s': %s\n", progname, path, strerror(errno)); return rc; + } else { + fprintf(stderr, "%s: change scheduler of %s from %s to %s\n", + progname, path, orig_sched, scheduler); } return rc; @@ -1147,7 +1172,7 @@ set_params: snprintf(buf, sizeof(buf), "%d", mop->mo_md_stripe_cache_size); rc = write_file(real_path, buf); - if (rc && verbose) + if (rc != 0 && verbose) fprintf(stderr, "warning: opening %s: %s\n", real_path, strerror(errno)); } @@ -1164,23 +1189,55 @@ set_params: real_path, strerror(errno)); /* No MAX_HW_SECTORS_KB_PATH isn't necessary an * error for some device. */ - rc = 0; + goto subdevs; } if (strlen(buf) - 1 > 0) { + char oldbuf[32] = "", *end = NULL; + unsigned long long oldval, newval; + snprintf(real_path, sizeof(real_path), "%s/%s", path, MAX_SECTORS_KB_PATH); + rc = read_file(real_path, oldbuf, sizeof(oldbuf)); + /* Only set new parameter if different from the old one. */ + if (rc != 0 || strcmp(oldbuf, buf) == 0) { + /* No MAX_SECTORS_KB_PATH isn't necessary an + * error for some device. */ + goto subdevs; + } + + newval = strtoull(buf, &end, 0); + if (newval == 0 || newval == ULLONG_MAX || end == buf) + goto subdevs; + + /* Don't increase IO request size limit past 16MB. It is about + * 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) { + 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) + goto subdevs; + rc = write_file(real_path, buf); - if (rc) { + if (rc != 0) { if (verbose) fprintf(stderr, "warning: writing to %s: %s\n", real_path, strerror(errno)); /* No MAX_SECTORS_KB_PATH isn't necessary an * error for some device. */ - rc = 0; + goto subdevs; } + fprintf(stderr, "%s: increased %s from %s to %s\n", + progname, real_path, oldbuf, buf); } +subdevs: /* Purposely ignore errors reported from set_blockdev_scheduler. * The worst that will happen is a block device with an "incorrect" * scheduler. */