|
@@ -108,7 +108,6 @@ static int ceph_sync_fs(struct super_block *sb, int wait)
|
|
|
* mount options
|
|
|
*/
|
|
|
enum {
|
|
|
- Opt_mds_namespace,
|
|
|
Opt_wsize,
|
|
|
Opt_rsize,
|
|
|
Opt_rasize,
|
|
@@ -121,6 +120,7 @@ enum {
|
|
|
Opt_last_int,
|
|
|
/* int args above */
|
|
|
Opt_snapdirname,
|
|
|
+ Opt_mds_namespace,
|
|
|
Opt_last_string,
|
|
|
/* string args above */
|
|
|
Opt_dirstat,
|
|
@@ -144,7 +144,6 @@ enum {
|
|
|
};
|
|
|
|
|
|
static match_table_t fsopt_tokens = {
|
|
|
- {Opt_mds_namespace, "mds_namespace=%d"},
|
|
|
{Opt_wsize, "wsize=%d"},
|
|
|
{Opt_rsize, "rsize=%d"},
|
|
|
{Opt_rasize, "rasize=%d"},
|
|
@@ -156,6 +155,7 @@ static match_table_t fsopt_tokens = {
|
|
|
{Opt_congestion_kb, "write_congestion_kb=%d"},
|
|
|
/* int args above */
|
|
|
{Opt_snapdirname, "snapdirname=%s"},
|
|
|
+ {Opt_mds_namespace, "mds_namespace=%s"},
|
|
|
/* string args above */
|
|
|
{Opt_dirstat, "dirstat"},
|
|
|
{Opt_nodirstat, "nodirstat"},
|
|
@@ -212,11 +212,14 @@ static int parse_fsopt_token(char *c, void *private)
|
|
|
if (!fsopt->snapdir_name)
|
|
|
return -ENOMEM;
|
|
|
break;
|
|
|
-
|
|
|
- /* misc */
|
|
|
case Opt_mds_namespace:
|
|
|
- fsopt->mds_namespace = intval;
|
|
|
+ fsopt->mds_namespace = kstrndup(argstr[0].from,
|
|
|
+ argstr[0].to-argstr[0].from,
|
|
|
+ GFP_KERNEL);
|
|
|
+ if (!fsopt->mds_namespace)
|
|
|
+ return -ENOMEM;
|
|
|
break;
|
|
|
+ /* misc */
|
|
|
case Opt_wsize:
|
|
|
fsopt->wsize = intval;
|
|
|
break;
|
|
@@ -302,6 +305,7 @@ static void destroy_mount_options(struct ceph_mount_options *args)
|
|
|
{
|
|
|
dout("destroy_mount_options %p\n", args);
|
|
|
kfree(args->snapdir_name);
|
|
|
+ kfree(args->mds_namespace);
|
|
|
kfree(args->server_path);
|
|
|
kfree(args);
|
|
|
}
|
|
@@ -331,6 +335,9 @@ static int compare_mount_options(struct ceph_mount_options *new_fsopt,
|
|
|
return ret;
|
|
|
|
|
|
ret = strcmp_null(fsopt1->snapdir_name, fsopt2->snapdir_name);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ ret = strcmp_null(fsopt1->mds_namespace, fsopt2->mds_namespace);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
@@ -376,7 +383,6 @@ static int parse_mount_options(struct ceph_mount_options **pfsopt,
|
|
|
fsopt->max_readdir = CEPH_MAX_READDIR_DEFAULT;
|
|
|
fsopt->max_readdir_bytes = CEPH_MAX_READDIR_BYTES_DEFAULT;
|
|
|
fsopt->congestion_kb = default_congestion_kb();
|
|
|
- fsopt->mds_namespace = CEPH_FS_CLUSTER_ID_NONE;
|
|
|
|
|
|
/*
|
|
|
* Distinguish the server list from the path in "dev_name".
|
|
@@ -469,8 +475,8 @@ static int ceph_show_options(struct seq_file *m, struct dentry *root)
|
|
|
seq_puts(m, ",noacl");
|
|
|
#endif
|
|
|
|
|
|
- if (fsopt->mds_namespace != CEPH_FS_CLUSTER_ID_NONE)
|
|
|
- seq_printf(m, ",mds_namespace=%d", fsopt->mds_namespace);
|
|
|
+ if (fsopt->mds_namespace)
|
|
|
+ seq_printf(m, ",mds_namespace=%s", fsopt->mds_namespace);
|
|
|
if (fsopt->wsize)
|
|
|
seq_printf(m, ",wsize=%d", fsopt->wsize);
|
|
|
if (fsopt->rsize != CEPH_RSIZE_DEFAULT)
|
|
@@ -509,9 +515,11 @@ static int extra_mon_dispatch(struct ceph_client *client, struct ceph_msg *msg)
|
|
|
|
|
|
switch (type) {
|
|
|
case CEPH_MSG_MDS_MAP:
|
|
|
- ceph_mdsc_handle_map(fsc->mdsc, msg);
|
|
|
+ ceph_mdsc_handle_mdsmap(fsc->mdsc, msg);
|
|
|
+ return 0;
|
|
|
+ case CEPH_MSG_FS_MAP_USER:
|
|
|
+ ceph_mdsc_handle_fsmap(fsc->mdsc, msg);
|
|
|
return 0;
|
|
|
-
|
|
|
default:
|
|
|
return -1;
|
|
|
}
|
|
@@ -543,8 +551,14 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,
|
|
|
goto fail;
|
|
|
}
|
|
|
fsc->client->extra_mon_dispatch = extra_mon_dispatch;
|
|
|
- fsc->client->monc.fs_cluster_id = fsopt->mds_namespace;
|
|
|
- ceph_monc_want_map(&fsc->client->monc, CEPH_SUB_MDSMAP, 0, true);
|
|
|
+
|
|
|
+ if (fsopt->mds_namespace == NULL) {
|
|
|
+ ceph_monc_want_map(&fsc->client->monc, CEPH_SUB_MDSMAP,
|
|
|
+ 0, true);
|
|
|
+ } else {
|
|
|
+ ceph_monc_want_map(&fsc->client->monc, CEPH_SUB_FSMAP,
|
|
|
+ 0, false);
|
|
|
+ }
|
|
|
|
|
|
fsc->mount_options = fsopt;
|
|
|
|