Whamcloud - gitweb
LU-14090 mgs: no local logs flag
[fs/lustre-release.git] / lustre / obdclass / obd_mount.c
index 8c2fde7..be1521f 100644 (file)
 #include <lustre_log.h>
 #include <lustre_disk.h>
 #include <uapi/linux/lustre/lustre_param.h>
-
-static int (*client_fill_super)(struct super_block *sb,
-                               struct vfsmount *mnt);
-
-static void (*kill_super_cb)(struct super_block *sb);
+#include <libcfs/crypto/llcrypt.h>
 
 /**************** config llog ********************/
 
@@ -247,7 +243,7 @@ int lustre_start_mgc(struct super_block *sb)
                        struct lnet_process_id id;
 
                        while ((rc = LNetGetId(i++, &id)) != -ENOENT) {
-                               if (LNET_NETTYP(LNET_NIDNET(id.nid)) == LOLND)
+                               if (id.nid == LNET_NID_LO_0)
                                        continue;
                                nid = id.nid;
                                i++;
@@ -408,7 +404,7 @@ int lustre_start_mgc(struct super_block *sb)
                GOTO(out_free, rc = -ENOMEM);
 
        generate_random_uuid(uuidc.b);
-       snprintf(uuid->uuid, UUID_SIZE, "%pU", uuidc.b);
+       snprintf(uuid->uuid, sizeof(*uuid), "%pU", uuidc.b);
 
        /* Start the MGC */
        rc = lustre_start_simple(mgcname, LUSTRE_MGC_NAME,
@@ -468,10 +464,6 @@ int lustre_start_mgc(struct super_block *sb)
                                  OBD_CONNECT_LVB_TYPE |
                                  OBD_CONNECT_BULK_MBITS | OBD_CONNECT_BARRIER;
 
-#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0)
-       data->ocd_connect_flags |= OBD_CONNECT_MNE_SWAB;
-#endif
-
        if (lmd_is_client(lsi->lsi_lmd) &&
            lsi->lsi_lmd->lmd_flags & LMD_FLG_NOIR)
                data->ocd_connect_flags &= ~OBD_CONNECT_IMP_RECOV;
@@ -503,6 +495,7 @@ out_free:
                OBD_FREE(niduuid, len + 2);
        RETURN(rc);
 }
+EXPORT_SYMBOL(lustre_start_mgc);
 
 static int lustre_stop_mgc(struct super_block *sb)
 {
@@ -586,7 +579,7 @@ out:
 
 /***************** lustre superblock **************/
 
-static struct lustre_sb_info *lustre_init_lsi(struct super_block *sb)
+struct lustre_sb_info *lustre_init_lsi(struct super_block *sb)
 {
        struct lustre_sb_info *lsi;
 
@@ -601,9 +594,6 @@ static struct lustre_sb_info *lustre_init_lsi(struct super_block *sb)
                RETURN(NULL);
        }
 
-       lsi->lsi_lmd->lmd_exclude_count = 0;
-       lsi->lsi_lmd->lmd_recovery_time_soft = 0;
-       lsi->lsi_lmd->lmd_recovery_time_hard = 0;
        s2lsi_nocast(sb) = lsi;
        /* we take 1 extra ref for our setup */
        atomic_set(&lsi->lsi_mounts, 1);
@@ -615,6 +605,7 @@ static struct lustre_sb_info *lustre_init_lsi(struct super_block *sb)
 
        RETURN(lsi);
 }
+EXPORT_SYMBOL(lustre_init_lsi);
 
 static int lustre_free_lsi(struct super_block *sb)
 {
@@ -628,6 +619,7 @@ static int lustre_free_lsi(struct super_block *sb)
        /* someone didn't call server_put_mount. */
        LASSERT(atomic_read(&lsi->lsi_mounts) == 0);
 
+       llcrypt_sb_free(sb);
        if (lsi->lsi_lmd != NULL) {
                if (lsi->lsi_lmd->lmd_dev != NULL)
                        OBD_FREE(lsi->lsi_lmd->lmd_dev,
@@ -697,6 +689,7 @@ int lustre_put_lsi(struct super_block *sb)
        }
        RETURN(0);
 }
+EXPORT_SYMBOL(lustre_put_lsi);
 
 /*
  * The goal of this function is to extract the file system name
@@ -893,6 +886,9 @@ int target_name2index(const char *tgtname, __u32 *idx, const char **endptr)
        if (idx != NULL)
                *idx = index;
 
+       if (index > 0xffff)
+               return -ERANGE;
+
        return rc;
 }
 EXPORT_SYMBOL(target_name2index);
@@ -1030,7 +1026,7 @@ static int lmd_make_exclusion(struct lustre_mount_data *lmd, const char *ptr)
        devmax = strlen(ptr) / 8 + 1;
 
        /* temp storage until we figure out how many we have */
-       OBD_ALLOC(exclude_list, sizeof(index) * devmax);
+       OBD_ALLOC_PTR_ARRAY(exclude_list, devmax);
        if (!exclude_list)
                RETURN(-ENOMEM);
 
@@ -1061,8 +1057,8 @@ static int lmd_make_exclusion(struct lustre_mount_data *lmd, const char *ptr)
 
        if (lmd->lmd_exclude_count) {
                /* permanent, freed in lustre_free_lsi */
-               OBD_ALLOC(lmd->lmd_exclude, sizeof(index) *
-                         lmd->lmd_exclude_count);
+               OBD_ALLOC_PTR_ARRAY(lmd->lmd_exclude,
+                                   lmd->lmd_exclude_count);
                if (lmd->lmd_exclude) {
                        memcpy(lmd->lmd_exclude, exclude_list,
                               sizeof(index) * lmd->lmd_exclude_count);
@@ -1071,7 +1067,7 @@ static int lmd_make_exclusion(struct lustre_mount_data *lmd, const char *ptr)
                        lmd->lmd_exclude_count = 0;
                }
        }
-       OBD_FREE(exclude_list, sizeof(index) * devmax);
+       OBD_FREE_PTR_ARRAY(exclude_list, devmax);
        RETURN(rc);
 }
 
@@ -1261,7 +1257,7 @@ try_again:
  */
 static int lmd_parse_nidlist(char *buf, char **endh)
 {
-       struct list_head nidlist;
+       LIST_HEAD(nidlist);
        char *endp = buf;
        char tmp;
        int rc = 0;
@@ -1279,7 +1275,6 @@ static int lmd_parse_nidlist(char *buf, char **endh)
        tmp = *endp;
        *endp = '\0';
 
-       INIT_LIST_HEAD(&nidlist);
        if (cfs_parse_nidlist(buf, strlen(buf), &nidlist) <= 0)
                rc = 1;
        cfs_free_nidlist(&nidlist);
@@ -1297,7 +1292,7 @@ static int lmd_parse_nidlist(char *buf, char **endh)
  * e.g. mount -v -t lustre -o abort_recov uml1:uml2:/lustre-client /mnt/lustre
  * dev is passed as device=uml1:/lustre by mount.lustre_tgt
  */
-static int lmd_parse(char *options, struct lustre_mount_data *lmd)
+int lmd_parse(char *options, struct lustre_mount_data *lmd)
 {
        char *s1, *s2, *devname = NULL;
        struct lustre_mount_data *raw = (struct lustre_mount_data *)options;
@@ -1351,6 +1346,9 @@ static int lmd_parse(char *options, struct lustre_mount_data *lmd)
                if (strncmp(s1, "abort_recov", 11) == 0) {
                        lmd->lmd_flags |= LMD_FLG_ABORT_RECOV;
                        clear++;
+               } else if (strncmp(s1, "abort_recov_mdt", 15) == 0) {
+                       lmd->lmd_flags |= LMD_FLG_ABORT_RECOV_MDT;
+                       clear++;
                } else if (strncmp(s1, "recovery_time_soft=", 19) == 0) {
                        lmd->lmd_recovery_time_soft =
                                max_t(int, simple_strtoul(s1 + 19, NULL, 10),
@@ -1361,6 +1359,9 @@ static int lmd_parse(char *options, struct lustre_mount_data *lmd)
                                max_t(int, simple_strtoul(s1 + 19, NULL, 10),
                                      time_min);
                        clear++;
+               } else if (strncmp(s1, "no_precreate", 12) == 0) {
+                       lmd->lmd_flags |= LMD_FLG_NO_PRECREATE;
+                       clear++;
                } else if (strncmp(s1, "noir", 4) == 0) {
                        lmd->lmd_flags |= LMD_FLG_NOIR; /* test purpose only. */
                        clear++;
@@ -1394,6 +1395,9 @@ static int lmd_parse(char *options, struct lustre_mount_data *lmd)
                } else if (strncmp(s1, "writeconf", 9) == 0) {
                        lmd->lmd_flags |= LMD_FLG_WRITECONF;
                        clear++;
+               } else if (strncmp(s1, "nolocallogs", 11) == 0) {
+                       lmd->lmd_flags |= LMD_FLG_NO_LOCAL_LOGS;
+                       clear++;
                } else if (strncmp(s1, "update", 6) == 0) {
                        lmd->lmd_flags |= LMD_FLG_UPDATE;
                        clear++;
@@ -1448,6 +1452,9 @@ static int lmd_parse(char *options, struct lustre_mount_data *lmd)
                        strlcat(lmd->lmd_params, " ", LMD_PARAMS_MAXLEN);
                        s3 = s1 + 6 + length;
                        clear++;
+               } else if (strncmp(s1, "localrecov", 10) == 0) {
+                       lmd->lmd_flags |= LMD_FLG_LOCAL_RECOV;
+                       clear++;
                } else if (strncmp(s1, "osd=", 4) == 0) {
                        rc = lmd_parse_string(&lmd->lmd_osd_type, s1 + 4);
                        if (rc)
@@ -1577,22 +1584,19 @@ invalid:
        CERROR("Bad mount options %s\n", options);
        RETURN(-EINVAL);
 }
+EXPORT_SYMBOL(lmd_parse);
 
-struct lustre_mount_data2 {
-       void *lmd2_data;
-       struct vfsmount *lmd2_mnt;
-};
-
+#ifdef HAVE_SERVER_SUPPORT
 /**
  * This is the entry point for the mount call into Lustre.
- * This is called when a server or client is mounted,
+ * This is called when a server target is mounted,
  * and this is where we start setting things up.
  * @param data Mount options (e.g. -o flock,abort_recov)
  */
-static int lustre_fill_super(struct super_block *sb, void *data, int silent)
+static int lustre_tgt_fill_super(struct super_block *sb, void *lmd2_data,
+                                int silent)
 {
        struct lustre_mount_data *lmd;
-       struct lustre_mount_data2 *lmd2 = data;
        struct lustre_sb_info *lsi;
        int rc;
 
@@ -1617,52 +1621,31 @@ static int lustre_fill_super(struct super_block *sb, void *data, int silent)
        obd_zombie_barrier();
 
        /* Figure out the lmd from the mount options */
-       if (lmd_parse((char *)(lmd2->lmd2_data), lmd)) {
+       if (lmd_parse(lmd2_data, lmd)) {
                lustre_put_lsi(sb);
                GOTO(out, rc = -EINVAL);
        }
 
        if (lmd_is_client(lmd)) {
-               CDEBUG(D_MOUNT, "Mounting client %s\n", lmd->lmd_profile);
-               if (client_fill_super == NULL)
-                       request_module("lustre");
-               if (client_fill_super == NULL) {
-                       LCONSOLE_ERROR_MSG(0x165,
-                                          "Nothing registered for client mount! Is the 'lustre' module loaded?\n");
-                       lustre_put_lsi(sb);
-                       rc = -ENODEV;
-               } else {
-                       rc = lustre_start_mgc(sb);
-                       if (rc) {
-                               lustre_common_put_super(sb);
-                               GOTO(out, rc);
-                       }
-                       /* Connect and start */
-                       /* (should always be ll_fill_super) */
-                       rc = (*client_fill_super)(sb, lmd2->lmd2_mnt);
-                       /* c_f_s will call lustre_common_put_super on failure */
-               }
-       } else {
-#ifdef HAVE_SERVER_SUPPORT
-               CDEBUG(D_MOUNT, "Mounting server from %s\n", lmd->lmd_dev);
-               rc = server_fill_super(sb);
-               /*
-                * s_f_s calls lustre_start_mgc after the mount because we need
-                * the MGS NIDs which are stored on disk.  Plus, we may
-                * need to start the MGS first.
-                */
-               /* s_f_s will call server_put_super on failure */
-#else
-               CERROR("client-side-only module, cannot handle server mount\n");
-               rc = -EINVAL;
-#endif
+               rc = -ENODEV;
+               CERROR("%s: attempting to mount a client with -t lustre_tgt' which is only for server-side mounts: rc = %d\n",
+                      lmd->lmd_dev, rc);
+               lustre_put_lsi(sb);
+               GOTO(out, rc);
        }
 
+       CDEBUG(D_MOUNT, "Mounting server from %s\n", lmd->lmd_dev);
+       rc = server_fill_super(sb);
        /*
+        * server_fill_super calls lustre_start_mgc after the mount
+        * because we need the MGS NIDs which are stored on disk.
+        * Plus, we may need to start the MGS first.
+        *
+        * server_fill_super will call server_put_super on failure
+        *
         * If error happens in fill_super() call, @lsi will be killed there.
         * This is why we do not put it here.
         */
-       GOTO(out, rc);
 out:
        if (rc) {
                CERROR("Unable to mount %s (%d)\n",
@@ -1675,59 +1658,14 @@ out:
        return rc;
 }
 
-
-/*
- * We can't call ll_fill_super by name because it lives in a module that
- * must be loaded after this one.
- */
-void lustre_register_client_fill_super(int (*cfs)(struct super_block *sb,
-                                                 struct vfsmount *mnt))
-{
-       client_fill_super = cfs;
-}
-EXPORT_SYMBOL(lustre_register_client_fill_super);
-
-void lustre_register_kill_super_cb(void (*cfs)(struct super_block *sb))
-{
-       kill_super_cb = cfs;
-}
-EXPORT_SYMBOL(lustre_register_kill_super_cb);
-
 /***************** FS registration ******************/
-#ifdef HAVE_FSTYPE_MOUNT
-static struct dentry *lustre_mount(struct file_system_type *fs_type, int flags,
-                                  const char *devname, void *data)
-{
-       struct lustre_mount_data2 lmd2 = {
-               .lmd2_data = data,
-       };
-
-       return mount_nodev(fs_type, flags, &lmd2, lustre_fill_super);
-}
-#else
-static int lustre_get_sb(struct file_system_type *fs_type, int flags,
-                        const char *devname, void *data, struct vfsmount *mnt)
-{
-       struct lustre_mount_data2 lmd2 = {
-               .lmd2_data = data,
-               .lmd2_mnt = mnt,
-       };
-
-       return get_sb_nodev(fs_type, flags, &lmd2, lustre_fill_super, mnt);
-}
-#endif
-
-static void lustre_kill_super(struct super_block *sb)
+static struct dentry *lustre_tgt_mount(struct file_system_type *fs_type,
+                                      int flags, const char *devname,
+                                      void *data)
 {
-       struct lustre_sb_info *lsi = s2lsi(sb);
-
-       if (kill_super_cb && lsi && !IS_SERVER(lsi))
-               (*kill_super_cb)(sb);
-
-       kill_anon_super(sb);
+       return mount_nodev(fs_type, flags, data, lustre_tgt_fill_super);
 }
 
-#ifdef HAVE_SERVER_SUPPORT
 /* Register the "lustre_tgt" fs type.
  *
  * Right now this isn't any different than the normal "lustre" filesystem
@@ -1738,61 +1676,23 @@ static void lustre_kill_super(struct super_block *sb)
  *
  * The long-term goal is to disentangle the client and server mount code.
  */
-static struct file_system_type lustre_fs_type_tgt = {
+static struct file_system_type lustre_tgt_fstype = {
        .owner          = THIS_MODULE,
        .name           = "lustre_tgt",
-#ifdef HAVE_FSTYPE_MOUNT
-       .mount          = lustre_mount,
-#else
-       .get_sb         = lustre_get_sb,
-#endif
-       .kill_sb        = lustre_kill_super,
+       .mount          = lustre_tgt_mount,
+       .kill_sb        = kill_anon_super,
        .fs_flags       = FS_REQUIRES_DEV | FS_RENAME_DOES_D_MOVE,
 };
 MODULE_ALIAS_FS("lustre_tgt");
 
-#define register_filesystem_tgt(fstype)                                            \
-do {                                                                       \
-       int _rc;                                                            \
-                                                                           \
-       _rc = register_filesystem(fstype);                                  \
-       if (_rc && _rc != -EBUSY) {                                         \
-               /* Don't fail if server code also registers "lustre_tgt" */ \
-               CERROR("obdclass: register fstype '%s' failed: rc = %d\n",  \
-                      (fstype)->name, _rc);                                \
-               return _rc;                                                 \
-       }                                                                   \
-} while (0)
-#define unregister_filesystem_tgt(fstype) unregister_filesystem(fstype)
-#else
-#define register_filesystem_tgt(fstype)   do {} while (0)
-#define unregister_filesystem_tgt(fstype) do {} while (0)
-#endif
-
-/* Register the "lustre" fs type */
-static struct file_system_type lustre_fs_type = {
-       .owner          = THIS_MODULE,
-       .name           = "lustre",
-#ifdef HAVE_FSTYPE_MOUNT
-       .mount          = lustre_mount,
-#else
-       .get_sb         = lustre_get_sb,
-#endif
-       .kill_sb        = lustre_kill_super,
-       .fs_flags       = FS_REQUIRES_DEV | FS_RENAME_DOES_D_MOVE,
-};
-MODULE_ALIAS_FS("lustre");
-
-int lustre_register_fs(void)
+int lustre_tgt_register_fs(void)
 {
-       register_filesystem_tgt(&lustre_fs_type_tgt);
-
-       return register_filesystem(&lustre_fs_type);
+       return register_filesystem(&lustre_tgt_fstype);
 }
 
-int lustre_unregister_fs(void)
+void lustre_tgt_unregister_fs(void)
 {
-       unregister_filesystem_tgt(&lustre_fs_type_tgt);
-
-       return unregister_filesystem(&lustre_fs_type);
+       unregister_filesystem(&lustre_tgt_fstype);
 }
+
+#endif /* HAVE_SERVER_SUPPORT */