X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Fmount_lustre.c;h=7671da38acdaa645e0d674590079bba3a41e9c16;hp=9be94a622afe77547f60815b694ddf6e61afca93;hb=281671b5ee43c2aea5d5b708aadf10fd1df45b16;hpb=6a6561972406043efe41ae43b64fd278f360a4b9 diff --git a/lustre/utils/mount_lustre.c b/lustre/utils/mount_lustre.c index 9be94a6..7671da3 100644 --- a/lustre/utils/mount_lustre.c +++ b/lustre/utils/mount_lustre.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) 2011, 2012, Whamcloud, Inc. + * Copyright (c) 2011, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -42,6 +42,7 @@ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif +#include "mount_utils.h" #include #include #include @@ -52,7 +53,20 @@ #include #include #include -#include "mount_utils.h" +#include +#if LUSTRE_VERSION_CODE > OBD_OCD_VERSION(2, 10, 51, 0) +/* + * LU-1783 + * We only #include a kernel level include file here because + * important MS_ flag #defines are missing from the SLES version + * of sys/mount.h + * In the future if SLES updates sys/mount.h to have a more complete + * set of flag #defines we should stop including linux/fs.h + */ +#warn remove kernel include +#elif !defined(MS_RDONLY) +#include +#endif #define MAXOPT 4096 #define MAX_RETRIES 99 @@ -254,10 +268,21 @@ int parse_options(struct mount_opts *mop, char *orig_options, int *flagp) } } #ifdef MS_STRICTATIME - /* set strictatime to default if NOATIME or RELATIME - not given explicit */ - if (!(*flagp & (MS_NOATIME | MS_RELATIME))) - *flagp |= MS_STRICTATIME; +#if LUSTRE_VERSION_CODE > OBD_OCD_VERSION(2, 10, 51, 0) +/* + * LU-1783 + * In the future when upstream fixes land in all supported kernels + * we should stop forcing MS_STRICTATIME in lustre mounts. + * We override the kernel level default of MS_RELATIME for now + * due to a kernel vfs level bug in atime updates that fails + * to reset timestamps from the future. + */ +#warn remove MS_STRICTATIME override +#endif + /* set strictatime to default if NOATIME or RELATIME + not given explicit */ + if (!(*flagp & (MS_NOATIME | MS_RELATIME))) + *flagp |= MS_STRICTATIME; #endif strcpy(orig_options, options); free(options); @@ -290,6 +315,67 @@ static int add_mgsnids(struct mount_opts *mop, char *options, return 0; } +static int clear_update_ondisk(char *source, struct lustre_disk_data *ldd) +{ + char always_mountopts[512] = ""; + char default_mountopts[512] = ""; + struct mkfs_opts mkop; + int ret; + int ret2; + + memset(&mkop, 0, sizeof(mkop)); + mkop.mo_ldd = *ldd; + mkop.mo_ldd.ldd_flags &= ~LDD_F_UPDATE; + if (strlen(source) > sizeof(mkop.mo_device)-1) { + fatal(); + fprintf(stderr, "Device name too long: %s\n", source); + return -E2BIG; + } + strncpy(mkop.mo_device, source, sizeof(mkop.mo_device)); + + ret = osd_prepare_lustre(&mkop, + default_mountopts, sizeof(default_mountopts), + always_mountopts, sizeof(always_mountopts)); + if (ret) { + fatal(); + fprintf(stderr, "Can't prepare device %s: %s\n", + source, strerror(ret)); + return ret; + } + + /* Create the loopback file */ + if (mkop.mo_flags & MO_IS_LOOP) { + ret = access(mkop.mo_device, F_OK); + if (ret) { + ret = errno; + fatal(); + fprintf(stderr, "Can't access device %s: %s\n", + source, strerror(ret)); + return ret; + } + + ret = loop_setup(&mkop); + if (ret) { + fatal(); + fprintf(stderr, "Loop device setup for %s failed: %s\n", + mkop.mo_device, strerror(ret)); + return ret; + } + } + ret = osd_write_ldd(&mkop); + if (ret != 0) { + fatal(); + fprintf(stderr, "failed to write local files: %s\n", + strerror(ret)); + } + + ret2 = loop_cleanup(&mkop); + if (ret == 0) + ret = ret2; + + return ret; +} + static int parse_ldd(char *source, struct mount_opts *mop, char *options) { struct lustre_disk_data *ldd = &mop->mo_ldd; @@ -307,11 +393,13 @@ static int parse_ldd(char *source, struct mount_opts *mop, char *options) rc = osd_read_ldd(source, ldd); if (rc) { fprintf(stderr, "%s: %s failed to read permanent mount" - " data: %s\n", progname, source, strerror(rc)); + " data: %s\n", progname, source, + rc >= 0 ? strerror(rc) : ""); return rc; } - if (ldd->ldd_flags & LDD_F_NEED_INDEX) { + if ((IS_MDT(ldd) || IS_OST(ldd)) && + (ldd->ldd_flags & LDD_F_NEED_INDEX)) { fprintf(stderr, "%s: %s has no index assigned " "(probably formatted with old mkfs)\n", progname, source); @@ -324,8 +412,11 @@ static int parse_ldd(char *source, struct mount_opts *mop, char *options) return EINVAL; } + if (ldd->ldd_flags & LDD_F_UPDATE) + clear_update_ondisk(source, ldd); + /* Since we never rewrite ldd, ignore temp flags */ - ldd->ldd_flags &= ~(LDD_F_VIRGIN | LDD_F_UPDATE | LDD_F_WRITECONF); + ldd->ldd_flags &= ~(LDD_F_VIRGIN | LDD_F_WRITECONF); /* svname of the form lustre:OST1234 means never registered */ rc = strlen(ldd->ldd_svname); @@ -362,10 +453,10 @@ static int parse_ldd(char *source, struct mount_opts *mop, char *options) if (ldd->ldd_flags & LDD_F_VIRGIN) append_option(options, "virgin"); + if (ldd->ldd_flags & LDD_F_UPDATE) + append_option(options, "update"); if (ldd->ldd_flags & LDD_F_WRITECONF) append_option(options, "writeconf"); - if (ldd->ldd_flags & LDD_F_IAM_DIR) - append_option(options, "iam"); if (ldd->ldd_flags & LDD_F_NO_PRIMNODE) append_option(options, "noprimnode"); @@ -473,8 +564,6 @@ static int parse_opts(int argc, char *const argv[], struct mount_opts *mop) * symbolic link for instance */ if (realpath(mop->mo_usource, real_path) != NULL) { - mop->mo_usource = strdup(real_path); - ptr = strrchr(real_path, '/'); if (ptr && strncmp(ptr, "/dm-", 4) == 0 && isdigit(*(ptr + 4))) { snprintf(path, sizeof(path), "/sys/block/%s/dm/name", ptr+1); @@ -487,6 +576,7 @@ static int parse_opts(int argc, char *const argv[], struct mount_opts *mop) fclose(f); } } + mop->mo_usource = strdup(real_path); } ptr = strstr(mop->mo_usource, ":/"); @@ -605,7 +695,18 @@ int main(int argc, char *const argv[]) for (i = 0, rc = -EAGAIN; i <= mop.mo_retry && rc != 0; i++) { rc = mount(mop.mo_source, mop.mo_target, "lustre", flags, (void *)options); - if (rc) { + if (rc == 0) { + /* change label from : to + * - to indicate the device has + * been registered. only if the label is + * supposed to be changed and target service + * is supposed to start */ + if (mop.mo_ldd.ldd_flags & + (LDD_F_VIRGIN | LDD_F_WRITECONF)) { + if (mop.mo_nosvc == 0) + (void)osd_label_lustre(&mop); + } + } else { if (verbose) { fprintf(stderr, "%s: mount %s at %s " "failed: %s retries left: " @@ -638,6 +739,9 @@ int main(int argc, char *const argv[]) fprintf(stderr, "%s: mount %s at %s failed: %s\n", progname, mop.mo_usource, mop.mo_target, strerror(errno)); + if (errno == EBUSY) + fprintf(stderr, "Is the backend filesystem mounted?\n" + "Check /etc/mtab and /proc/mounts\n"); if (errno == ENODEV) fprintf(stderr, "Are the lustre modules loaded?\n" "Check /etc/modprobe.conf and " @@ -688,16 +792,7 @@ int main(int argc, char *const argv[]) } else if (!mop.mo_nomtab) { rc = update_mtab_entry(mop.mo_usource, mop.mo_target, "lustre", mop.mo_orig_options, 0,0,0); - - /* change label from : to - - * to indicate the device has been registered. - * only if the label is supposed to be changed and - * target service is supposed to start */ - if (mop.mo_ldd.ldd_flags & (LDD_F_VIRGIN | LDD_F_WRITECONF)) { - if (mop.mo_nosvc == 0 ) - (void) osd_label_lustre(&mop); - } - } + } free(options); /* mo_usource should be freed, but we can rely on the kernel */