[Ocfs2-tools-devel] [PATCH 1/1] ocfs2/mount: mount command should convert mapper dm devname to canonical form

Joel Becker jlbec at evilplan.org
Thu Jan 30 15:57:55 PST 2014


On Mon, Jan 27, 2014 at 12:31:41PM -0800, Tariq Saeed wrote:
> Orabug: 17801902
> 
> The kernel commit 784aae735d9b0bba3f8b9faef4c8b30df3bf0128 required a patch
> in the mount command to convert mapper device name of the form dm-<digit> to
> canonical. For example, for the blk dev /dev/dm-0, /sys/block/dm-0/dm/name contains
> the canonical name ocfs2-tmpdir, and /dev/mapper/ocfs2-tmpdir -> ../dm-0.
> The fix was made in the generic mount (see util-linux-ng-2.17.2-12.14) but
> not ported to ocfs2. This patch ports that fix to ocfs2-tools-1.8.0-11.
> 
> Signed-off-by: Tariq Saseed <tariq.x.saeed at oracle.com>
> Signed-off-by: Srinivas Eeda <srinivas.eeda at oracle.com>

Signed-off-by: Joel Becker <jlbec at evilplan.org>

> ---
>  mount.ocfs2/mount.ocfs2.c |    5 +++--
>  mount.ocfs2/sundries.c    |   45 +++++++++++++++++++++++++++++++++++++++++----
>  2 files changed, 44 insertions(+), 6 deletions(-)
> 
> diff --git a/mount.ocfs2/mount.ocfs2.c b/mount.ocfs2/mount.ocfs2.c
> index f2ca5cb..2fa2c2f 100644
> --- a/mount.ocfs2/mount.ocfs2.c
> +++ b/mount.ocfs2/mount.ocfs2.c
> @@ -312,6 +312,7 @@ int main(int argc, char **argv)
>  	int clustered = 1;
>  	int group_join = 0;
>  	struct stat statbuf;
> +	const char *spec;
>  
>  	initialize_ocfs_error_table();
>  	initialize_o2dl_error_table();
> @@ -414,8 +415,8 @@ int main(int argc, char **argv)
>  		}
>  		group_join = 1;
>  	}
> -
> -	ret = mount(mo.dev, mo.dir, OCFS2_FS_NAME, mo.flags & ~MS_NOSYS,
> +	spec = canonicalize(mo.dev);
> +	ret = mount(spec, mo.dir, OCFS2_FS_NAME, mo.flags & ~MS_NOSYS,
>  		    mo.xtra_opts);
>  	if (ret) {
>  		ret = errno;
> diff --git a/mount.ocfs2/sundries.c b/mount.ocfs2/sundries.c
> index bc59d64..2e1b95a 100644
> --- a/mount.ocfs2/sundries.c
> +++ b/mount.ocfs2/sundries.c
> @@ -223,6 +223,37 @@ matching_opts (const char *options, const char *test_opts) {
>       return 1;
>  }
>  
> +/*
> + * Converts private "dm-N" names to "/dev/mapper/<name>"
> + *
> + * Since 2.6.29 (patch 784aae735d9b0bba3f8b9faef4c8b30df3bf0128) kernel sysfs
> + * provides the real DM device names in /sys/block/<ptname>/dm/name
> + */
> +char *
> +canonicalize_dm_name(const char *ptname)
> +{
> +	FILE	*f;
> +	size_t	sz;
> +	char	path[256], name[256], *res = NULL;
> +	int	err;
> +
> +	snprintf(path, sizeof(path), "/sys/block/%s/dm/name", ptname);
> +	f = fopen(path, "r");
> +	if (!f)
> +		return NULL;
> +
> +	/* read "<name>\n" from sysfs */
> +	err = fgets(name, sizeof(name), f);
> +	sz = strlen(name);
> +	if (!err && sz > 1) {
> +		name[sz - 1] = '\0';
> +		snprintf(path, sizeof(path), "/dev/mapper/%s", name);
> +		res = strdup(path);
> +	}
> +	fclose(f);
> +	return res;
> +}
> +
>  /* Make a canonical pathname from PATH.  Returns a freshly malloced string.
>     It is up the *caller* to ensure that the PATH is sensible.  i.e.
>     canonicalize ("/dev/fd0/.") returns "/dev/fd0" even though ``/dev/fd0/.''
> @@ -231,6 +262,7 @@ matching_opts (const char *options, const char *test_opts) {
>  char *
>  canonicalize (const char *path) {
>  	char canonical[PATH_MAX+2];
> +	char *p;
>  
>  	if (path == NULL)
>  		return NULL;
> @@ -241,8 +273,13 @@ canonicalize (const char *path) {
>  	    streq(path, "devpts"))
>  		return xstrdup(path);
>  #endif
> -	if (myrealpath (path, canonical, PATH_MAX+1))
> -		return xstrdup(canonical);
> -
> -	return xstrdup(path);
> +	if (!myrealpath(path, canonical, PATH_MAX+1))
> +		return xstrdup(path);
> +	p = strrchr(canonical, '/');
> +	if (p && strncmp(p, "/dm-", 4) == 0 && isdigit(*(p + 4))) {
> +		p = canonicalize_dm_name(p+1);
> +		if (p)
> +			return p;
> +	}
> +	return xstrdup(canonical);
>  }
> -- 
> 1.7.1
> 
> 
> _______________________________________________
> Ocfs2-tools-devel mailing list
> Ocfs2-tools-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/ocfs2-tools-devel

-- 

"You don't make the poor richer by making the rich poorer."
	- Sir Winston Churchill

			http://www.jlbec.org/
			jlbec at evilplan.org



More information about the Ocfs2-tools-devel mailing list