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:
Boaz Harrosh 2011-01-31 14:32:14 +02:00
parent 66cd6cad49
commit 9ed9648431
2 changed files with 36 additions and 5 deletions

View File

@ -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]

View File

@ -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 */
od = osduld_path_lookup(opts->dev_name); 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);
}
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 @@ free_bdi:
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,7 +717,8 @@ static struct dentry *exofs_mount(struct file_system_type *type,
if (ret) if (ret)
return ERR_PTR(ret); return ERR_PTR(ret);
opts.dev_name = dev_name; if (!opts.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);
} }