mirror of https://gitee.com/openkylin/linux.git
exofs: Add option to mount by osdname
If /dev/osd* devices are shuffled because more devices where added, and/or login order has changed. It is hard to mount the FS you want. Add an option to mount by osdname. osdname is any osd-device's osdname as specified to the mkfs.exofs command when formatting the osd-devices. The new mount format is: OPT="osdname=$UUID0,pid=$PID,_netdev" mount -t exofs -o $OPT $DEV_OSD0 $MOUNTDIR if "osdname=" is specified in options above $DEV_OSD0 is ignored and can be empty. Also while at it: Removed some old unused Opt_* enums. Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
This commit is contained in:
parent
66cd6cad49
commit
9ed9648431
|
@ -104,7 +104,15 @@ Where:
|
||||||
exofs specific options: Options are separated by commas (,)
|
exofs specific options: Options are separated by commas (,)
|
||||||
pid=<integer> - The partition number to mount/create as
|
pid=<integer> - The partition number to mount/create as
|
||||||
container of the filesystem.
|
container of the filesystem.
|
||||||
This option is mandatory.
|
This option is mandatory. integer can be
|
||||||
|
Hex by pre-pending an 0x to the number.
|
||||||
|
osdname=<id> - Mount by a device's osdname.
|
||||||
|
osdname is usually a 36 character uuid of the
|
||||||
|
form "d2683732-c906-4ee1-9dbd-c10c27bb40df".
|
||||||
|
It is one of the device's uuid specified in the
|
||||||
|
mkfs.exofs format command.
|
||||||
|
If this option is specified then the /dev/osdX
|
||||||
|
above can be empty and is ignored.
|
||||||
to=<integer> - Timeout in ticks for a single command.
|
to=<integer> - Timeout in ticks for a single command.
|
||||||
default is (60 * HZ) [for debugging only]
|
default is (60 * HZ) [for debugging only]
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
* struct to hold what we get from mount options
|
* struct to hold what we get from mount options
|
||||||
*/
|
*/
|
||||||
struct exofs_mountopt {
|
struct exofs_mountopt {
|
||||||
|
bool is_osdname;
|
||||||
const char *dev_name;
|
const char *dev_name;
|
||||||
uint64_t pid;
|
uint64_t pid;
|
||||||
int timeout;
|
int timeout;
|
||||||
|
@ -56,7 +57,7 @@ struct exofs_mountopt {
|
||||||
/*
|
/*
|
||||||
* exofs-specific mount-time options.
|
* exofs-specific mount-time options.
|
||||||
*/
|
*/
|
||||||
enum { Opt_pid, Opt_to, Opt_mkfs, Opt_format, Opt_err };
|
enum { Opt_name, Opt_pid, Opt_to, Opt_err };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Our mount-time options. These should ideally be 64-bit unsigned, but the
|
* Our mount-time options. These should ideally be 64-bit unsigned, but the
|
||||||
|
@ -64,6 +65,7 @@ enum { Opt_pid, Opt_to, Opt_mkfs, Opt_format, Opt_err };
|
||||||
* sufficient for most applications now.
|
* sufficient for most applications now.
|
||||||
*/
|
*/
|
||||||
static match_table_t tokens = {
|
static match_table_t tokens = {
|
||||||
|
{Opt_name, "osdname=%s"},
|
||||||
{Opt_pid, "pid=%u"},
|
{Opt_pid, "pid=%u"},
|
||||||
{Opt_to, "to=%u"},
|
{Opt_to, "to=%u"},
|
||||||
{Opt_err, NULL}
|
{Opt_err, NULL}
|
||||||
|
@ -94,6 +96,14 @@ static int parse_options(char *options, struct exofs_mountopt *opts)
|
||||||
|
|
||||||
token = match_token(p, tokens, args);
|
token = match_token(p, tokens, args);
|
||||||
switch (token) {
|
switch (token) {
|
||||||
|
case Opt_name:
|
||||||
|
opts->dev_name = match_strdup(&args[0]);
|
||||||
|
if (unlikely(!opts->dev_name)) {
|
||||||
|
EXOFS_ERR("Error allocating dev_name");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
opts->is_osdname = true;
|
||||||
|
break;
|
||||||
case Opt_pid:
|
case Opt_pid:
|
||||||
if (0 == match_strlcpy(str, &args[0], sizeof(str)))
|
if (0 == match_strlcpy(str, &args[0], sizeof(str)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -575,9 +585,17 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent)
|
||||||
goto free_bdi;
|
goto free_bdi;
|
||||||
|
|
||||||
/* use mount options to fill superblock */
|
/* use mount options to fill superblock */
|
||||||
|
if (opts->is_osdname) {
|
||||||
|
struct osd_dev_info odi = {.systemid_len = 0};
|
||||||
|
|
||||||
|
odi.osdname_len = strlen(opts->dev_name);
|
||||||
|
odi.osdname = (u8 *)opts->dev_name;
|
||||||
|
od = osduld_info_lookup(&odi);
|
||||||
|
} else {
|
||||||
od = osduld_path_lookup(opts->dev_name);
|
od = osduld_path_lookup(opts->dev_name);
|
||||||
|
}
|
||||||
if (IS_ERR(od)) {
|
if (IS_ERR(od)) {
|
||||||
ret = PTR_ERR(od);
|
ret = -EINVAL;
|
||||||
goto free_sbi;
|
goto free_sbi;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -670,6 +688,8 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent)
|
||||||
|
|
||||||
_exofs_print_device("Mounting", opts->dev_name, sbi->layout.s_ods[0],
|
_exofs_print_device("Mounting", opts->dev_name, sbi->layout.s_ods[0],
|
||||||
sbi->layout.s_pid);
|
sbi->layout.s_pid);
|
||||||
|
if (opts->is_osdname)
|
||||||
|
kfree(opts->dev_name);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
free_sbi:
|
free_sbi:
|
||||||
|
@ -678,6 +698,8 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent)
|
||||||
EXOFS_ERR("Unable to mount exofs on %s pid=0x%llx err=%d\n",
|
EXOFS_ERR("Unable to mount exofs on %s pid=0x%llx err=%d\n",
|
||||||
opts->dev_name, sbi->layout.s_pid, ret);
|
opts->dev_name, sbi->layout.s_pid, ret);
|
||||||
exofs_free_sbi(sbi);
|
exofs_free_sbi(sbi);
|
||||||
|
if (opts->is_osdname)
|
||||||
|
kfree(opts->dev_name);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -695,6 +717,7 @@ static struct dentry *exofs_mount(struct file_system_type *type,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
|
||||||
|
if (!opts.dev_name)
|
||||||
opts.dev_name = dev_name;
|
opts.dev_name = dev_name;
|
||||||
return mount_nodev(type, flags, &opts, exofs_fill_super);
|
return mount_nodev(type, flags, &opts, exofs_fill_super);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue