[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