Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9ed96484 authored by Boaz Harrosh's avatar Boaz Harrosh
Browse files

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: default avatarBoaz Harrosh <bharrosh@panasas.com>
parent 66cd6cad
Loading
Loading
Loading
Loading
+9 −1
Original line number Original line Diff line number Diff line
@@ -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]


+27 −4
Original line number Original line Diff line number Diff line
@@ -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);
}
}