X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Fmount_utils_zfs.c;h=0f30e13942f6ae0878b23c52a632b7e2a2d8265d;hb=0cc1756e9fb28609705f5f86b8e2197f57b40513;hp=ec53cc8ea275ec1798c2a97a527365d9619f9cfd;hpb=2b294992edce5af7b79d4300ed3aa1ea6a8db850;p=fs%2Flustre-release.git diff --git a/lustre/utils/mount_utils_zfs.c b/lustre/utils/mount_utils_zfs.c index ec53cc8..0f30e13 100644 --- a/lustre/utils/mount_utils_zfs.c +++ b/lustre/utils/mount_utils_zfs.c @@ -20,17 +20,20 @@ * GPL HEADER END */ /* - * Copyright (c) 2012, 2014, Intel Corporation. + * Copyright (c) 2012, 2016, Intel Corporation. * Use is subject to license terms. */ /* * Author: Brian Behlendorf */ #include "mount_utils.h" +#include #include #include #include +#define HOSTID_PATH "/etc/hostid" + /* Persistent mount data is stored in these user attributes */ #define LDD_PREFIX "lustre:" #define LDD_VERSION_PROP LDD_PREFIX "version" @@ -141,7 +144,7 @@ static int zfs_set_prop_params(zfs_handle_t *zhp, char *params) { char *params_dup, *token, *key, *value; char *save_token = NULL; - char prop_name[ZFS_MAXNAMELEN]; + char prop_name[ZFS_MAXPROPLEN]; int ret = 0; params_dup = strdup(params); @@ -173,6 +176,62 @@ static int zfs_set_prop_params(zfs_handle_t *zhp, char *params) return ret; } +static int zfs_check_hostid(struct mkfs_opts *mop) +{ + FILE *f; + unsigned long hostid; + int rc; + + if (strstr(mop->mo_ldd.ldd_params, PARAM_FAILNODE) == NULL) + return 0; + + f = fopen("/sys/module/spl/parameters/spl_hostid", "r"); + if (f == NULL) { + fatal(); + fprintf(stderr, "Failed to open spl_hostid: %s\n", + strerror(errno)); + return errno; + } + rc = fscanf(f, "%li", &hostid); + fclose(f); + if (rc != 1) { + fatal(); + fprintf(stderr, "Failed to read spl_hostid: %d\n", rc); + return rc; + } + + if (hostid != 0) + return 0; + + f = fopen(HOSTID_PATH, "r"); + if (f == NULL) + goto out; + + rc = fread(&hostid, sizeof(uint32_t), 1, f); + fclose(f); + + if (rc != 1) { + fprintf(stderr, "Failed to read "HOSTID_PATH": %d\n", + rc); + hostid = 0; + } + +out: + if (hostid == 0) { + if (mop->mo_flags & MO_NOHOSTID_CHECK) { + fprintf(stderr, "WARNING: spl_hostid not set. ZFS has " + "no zpool import protection\n"); + } else { + fatal(); + fprintf(stderr, "spl_hostid not set. See %s(8)", + progname); + return EINVAL; + } + } + + return 0; +} + static int osd_check_zfs_setup(void) { if (osd_zfs_setup == 0) { @@ -194,7 +253,7 @@ int zfs_write_ldd(struct mkfs_opts *mop) int i, ret = EINVAL; if (osd_check_zfs_setup() == 0) - return EINVAL; + goto out; zhp = zfs_open(g_zfs, ds, ZFS_TYPE_FILESYSTEM); if (zhp == NULL) { @@ -202,6 +261,10 @@ int zfs_write_ldd(struct mkfs_opts *mop) goto out; } + ret = zfs_check_hostid(mop); + if (ret != 0) + goto out; + vprint("Writing %s properties\n", ds); for (i = 0; special_ldd_prop_params[i].zlpb_prop_name != NULL; i++) { @@ -276,7 +339,7 @@ static int zfs_get_prop_params(zfs_handle_t *zhp, char *param, int len) { nvlist_t *props; nvpair_t *nvp; - char key[ZFS_MAXNAMELEN]; + char key[ZFS_MAXPROPLEN]; char *value; int ret = 0; @@ -450,6 +513,10 @@ int zfs_make_lustre(struct mkfs_opts *mop) return EINVAL; } + ret = zfs_check_hostid(mop); + if (ret != 0) + goto out; + pool = strdup(ds); if (pool == NULL) return ENOMEM; @@ -563,8 +630,7 @@ int zfs_enable_quota(struct mkfs_opts *mop) } int zfs_prepare_lustre(struct mkfs_opts *mop, - char *default_mountopts, int default_len, - char *always_mountopts, int always_len) + char *wanted_mountopts, size_t len) { if (osd_check_zfs_setup() == 0) return EINVAL; @@ -615,25 +681,25 @@ int zfs_init(void) { int ret = 0; - /* If the ZFS libs are not installed, don't print an error to avoid - * spamming ldiskfs users. An error message will still be printed if - * someone tries to do some real work involving a ZFS backend */ - - if (libzfs_load_module("zfs") != 0) { - /* The ZFS modules are not installed */ - ret = EINVAL; - goto out; - } - g_zfs = libzfs_init(); if (g_zfs == NULL) { - fprintf(stderr, "Failed to initialize ZFS library\n"); - ret = EINVAL; + /* Try to load zfs.ko and retry libzfs_init() */ + + ret = system("/sbin/modprobe -q zfs"); + + if (ret == 0) { + g_zfs = libzfs_init(); + if (g_zfs == NULL) + ret = EINVAL; + } } -out: - osd_zfs_setup = 1; - if (ret) - zfs_fini(); + + if (ret == 0) + osd_zfs_setup = 1; + + else + fprintf(stderr, "Failed to initialize ZFS library: %d\n", ret); + return ret; }