X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Fmount_lustre.c;h=1986c4b65b56acecfd0968b83addea7473a388f1;hb=10cf5e4ec079fed1fa339240e00c027232f7971e;hp=042fac10c32980968067c20fb0eb221f70921746;hpb=bc6011c431ffcfab0bc3066dd002deed1935b05b;p=fs%2Flustre-release.git diff --git a/lustre/utils/mount_lustre.c b/lustre/utils/mount_lustre.c index 042fac1..1986c4b 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, 2012, 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,19 @@ #include #include #include -#include "mount_utils.h" +#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 +#else +#include +#endif #define MAXOPT 4096 #define MAX_RETRIES 99 @@ -254,10 +267,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 +314,58 @@ 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; + + memset(&mkop, 0, sizeof(mkop)); + mkop.mo_ldd = *ldd; + mkop.mo_ldd.ldd_flags &= ~LDD_F_UPDATE; + strcpy(mkop.mo_device, source); + + 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)); + } + loop_cleanup(&mkop); + + return ret; +} + static int parse_ldd(char *source, struct mount_opts *mop, char *options) { struct lustre_disk_data *ldd = &mop->mo_ldd; @@ -307,7 +383,8 @@ 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; } @@ -324,8 +401,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 +442,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");