X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Fmount_utils.c;h=80fc189d7ced0aba1aa9f84e820edcf5115c04e1;hb=d46a76cd7bb2b657a6daabbe18b993abeedb2d94;hp=4fb5ee041cb35a72c1831b47d1a42421996c72aa;hpb=56e0d0bd401ba7dadb19e21dac624f6eb9cee3f7;p=fs%2Flustre-release.git diff --git a/lustre/utils/mount_utils.c b/lustre/utils/mount_utils.c index 4fb5ee0..80fc189 100644 --- a/lustre/utils/mount_utils.c +++ b/lustre/utils/mount_utils.c @@ -26,7 +26,7 @@ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. - * Copyright (c) 2012 Whamcloud, Inc. + * Copyright (c) 2012, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -37,6 +37,7 @@ # include "config.h" #endif /* HAVE_CONFIG_H */ +#include "mount_utils.h" #include #include #include @@ -45,7 +46,6 @@ #include #include #include -#include "mount_utils.h" extern char *progname; extern int verbose; @@ -180,6 +180,20 @@ int check_mtab_entry(char *spec1, char *spec2, char *mtpt, char *type) return 0; } +#define PROC_DIR "/proc/" +static int mtab_is_proc(const char *mtab) +{ + char path[16]; + + if (readlink(mtab, path, sizeof(path)) < 0) + return 0; + + if (strncmp(path, PROC_DIR, strlen(PROC_DIR))) + return 0; + + return 1; +} + int update_mtab_entry(char *spec, char *mtpt, char *type, char *opts, int flags, int freq, int pass) { @@ -187,6 +201,10 @@ int update_mtab_entry(char *spec, char *mtpt, char *type, char *opts, struct mntent mnt; int rc = 0; + /* Don't update mtab if it is linked to any file in /proc direcotry.*/ + if (mtab_is_proc(MOUNTED)) + return 0; + mnt.mnt_fsname = spec; mnt.mnt_dir = mtpt; mnt.mnt_type = type; @@ -321,7 +339,8 @@ int loop_setup(struct mkfs_opts *mop) continue; if (ret) { fprintf(stderr, "%s: error %d on losetup: %s\n", - progname, ret, strerror(ret)); + progname, ret, + ret >= 0 ? strerror(ret) : ""); return ret; } strscpy(mop->mo_loopdev, l_device, @@ -376,16 +395,52 @@ int loop_format(struct mkfs_opts *mop) return 0; } +/* Write the server config files */ +int osd_write_ldd(struct mkfs_opts *mop) +{ + struct lustre_disk_data *ldd = &mop->mo_ldd; + int ret; + + switch (ldd->ldd_mount_type) { +#ifdef HAVE_LDISKFS_OSD + case LDD_MT_LDISKFS: + case LDD_MT_LDISKFS2: + ret = ldiskfs_write_ldd(mop); + break; +#endif /* HAVE_LDISKFS_OSD */ +#ifdef HAVE_ZFS_OSD + case LDD_MT_ZFS: + ret = zfs_write_ldd(mop); + break; +#endif /* HAVE_ZFS_OSD */ + default: + fatal(); + fprintf(stderr, "unknown fs type %d '%s'\n", + ldd->ldd_mount_type, MT_STR(ldd)); + ret = EINVAL; + break; + } + + return ret; +} + /* Read the server config files */ int osd_read_ldd(char *dev, struct lustre_disk_data *ldd) { int ret; switch (ldd->ldd_mount_type) { +#ifdef HAVE_LDISKFS_OSD case LDD_MT_LDISKFS: case LDD_MT_LDISKFS2: ret = ldiskfs_read_ldd(dev, ldd); break; +#endif /* HAVE_LDISKFS_OSD */ +#ifdef HAVE_ZFS_OSD + case LDD_MT_ZFS: + ret = zfs_read_ldd(dev, ldd); + break; +#endif /* HAVE_ZFS_OSD */ default: fatal(); fprintf(stderr, "unknown fs type %d '%s'\n", @@ -402,15 +457,52 @@ int osd_is_lustre(char *dev, unsigned *mount_type) { vprint("checking for existing Lustre data: "); +#ifdef HAVE_LDISKFS_OSD if (ldiskfs_is_lustre(dev, mount_type)) { vprint("found\n"); return 1; } +#endif /* HAVE_LDISKFS_OSD */ +#ifdef HAVE_ZFS_OSD + if (zfs_is_lustre(dev, mount_type)) { + vprint("found\n"); + return 1; + } +#endif /* HAVE_ZFS_OSD */ vprint("not found\n"); return 0; } +/* Build fs according to type */ +int osd_make_lustre(struct mkfs_opts *mop) +{ + struct lustre_disk_data *ldd = &mop->mo_ldd; + int ret; + + switch (ldd->ldd_mount_type) { +#ifdef HAVE_LDISKFS_OSD + case LDD_MT_LDISKFS: + case LDD_MT_LDISKFS2: + ret = ldiskfs_make_lustre(mop); + break; +#endif /* HAVE_LDISKFS_OSD */ +#ifdef HAVE_ZFS_OSD + case LDD_MT_ZFS: + ret = zfs_make_lustre(mop); + break; +#endif /* HAVE_ZFS_OSD */ + default: + fatal(); + fprintf(stderr, "unknown fs type %d '%s'\n", + ldd->ldd_mount_type, MT_STR(ldd)); + ret = EINVAL; + break; + } + + return ret; +} + int osd_prepare_lustre(struct mkfs_opts *mop, char *default_mountopts, int default_len, char *always_mountopts, int always_len) @@ -419,12 +511,21 @@ int osd_prepare_lustre(struct mkfs_opts *mop, int ret; switch (ldd->ldd_mount_type) { +#ifdef HAVE_LDISKFS_OSD case LDD_MT_LDISKFS: case LDD_MT_LDISKFS2: ret = ldiskfs_prepare_lustre(mop, default_mountopts, default_len, always_mountopts, always_len); break; +#endif /* HAVE_LDISKFS_OSD */ +#ifdef HAVE_ZFS_OSD + case LDD_MT_ZFS: + ret = zfs_prepare_lustre(mop, + default_mountopts, default_len, + always_mountopts, always_len); + break; +#endif /* HAVE_ZFS_OSD */ default: fatal(); fprintf(stderr, "unknown fs type %d '%s'\n", @@ -436,6 +537,123 @@ int osd_prepare_lustre(struct mkfs_opts *mop, return ret; } +int osd_tune_lustre(char *dev, struct mount_opts *mop) +{ + struct lustre_disk_data *ldd = &mop->mo_ldd; + int ret; + + switch (ldd->ldd_mount_type) { +#ifdef HAVE_LDISKFS_OSD + case LDD_MT_LDISKFS: + case LDD_MT_LDISKFS2: + ret = ldiskfs_tune_lustre(dev, mop); + break; +#endif /* HAVE_LDISKFS_OSD */ +#ifdef HAVE_ZFS_OSD + case LDD_MT_ZFS: + ret = zfs_tune_lustre(dev, mop); + break; +#endif /* HAVE_ZFS_OSD */ + default: + fatal(); + fprintf(stderr, "unknown fs type %d '%s'\n", + ldd->ldd_mount_type, MT_STR(ldd)); + ret = EINVAL; + break; + } + + return ret; +} + +int osd_label_lustre(struct mount_opts *mop) +{ + struct lustre_disk_data *ldd = &mop->mo_ldd; + int ret; + + switch (ldd->ldd_mount_type) { +#ifdef HAVE_LDISKFS_OSD + case LDD_MT_LDISKFS: + case LDD_MT_LDISKFS2: + ret = ldiskfs_label_lustre(mop); + break; +#endif /* HAVE_LDISKFS_OSD */ +#ifdef HAVE_ZFS_OSD + case LDD_MT_ZFS: + ret = zfs_label_lustre(mop); + break; +#endif /* HAVE_ZFS_OSD */ + default: + fatal(); + fprintf(stderr, "unknown fs type %d '%s'\n", + ldd->ldd_mount_type, MT_STR(ldd)); + ret = EINVAL; + break; + } + + return ret; +} + +/* Enable quota accounting */ +int osd_enable_quota(struct mkfs_opts *mop) +{ + struct lustre_disk_data *ldd = &mop->mo_ldd; + int ret; + + switch (ldd->ldd_mount_type) { +#ifdef HAVE_LDISKFS_OSD + case LDD_MT_EXT3: + case LDD_MT_LDISKFS: + case LDD_MT_LDISKFS2: + ret = ldiskfs_enable_quota(mop); + break; +#endif /* HAVE_LDISKFS_OSD */ +#ifdef HAVE_ZFS_OSD + case LDD_MT_ZFS: + fprintf(stderr, "this option is only valid for ldiskfs\n"); + ret = EINVAL; + break; +#endif /* HAVE_ZFS_OSD */ + default: + fatal(); + fprintf(stderr, "unknown fs type %d '%s'\n", + ldd->ldd_mount_type, MT_STR(ldd)); + ret = EINVAL; + break; + } + + return ret; +} + +int osd_init(void) +{ + int ret = 0; + +#ifdef HAVE_LDISKFS_OSD + ret = ldiskfs_init(); + if (ret) + return ret; +#endif /* HAVE_LDISKFS_OSD */ +#ifdef HAVE_ZFS_OSD + ret = zfs_init(); + /* we want to be able to set up a ldiskfs-based filesystem w/o + * the ZFS modules installed, see ORI-425 */ + if (ret) + ret = 0; +#endif /* HAVE_ZFS_OSD */ + + return ret; +} + +void osd_fini(void) +{ +#ifdef HAVE_LDISKFS_OSD + ldiskfs_fini(); +#endif /* HAVE_LDISKFS_OSD */ +#ifdef HAVE_ZFS_OSD + zfs_fini(); +#endif /* HAVE_ZFS_OSD */ +} + __u64 get_device_size(char* device) { int ret, fd; @@ -471,11 +689,23 @@ __u64 get_device_size(char* device) return size >> 10; } -int file_create(char *path, int size) +int file_create(char *path, __u64 size) { + __u64 size_max; int ret; int fd; + /* + * Since "size" is in KB, the file offset it represents could overflow + * off_t. + */ + size_max = (off_t)1 << (_FILE_OFFSET_BITS - 1 - 10); + if (size >= size_max) { + fprintf(stderr, "%s: "LPU64" KB: Backing store size must be " + "smaller than "LPU64" KB\n", progname, size, size_max); + return EFBIG; + } + ret = access(path, F_OK); if (ret == 0) { ret = unlink(path);