From: Karel Zak Date: Thu, 17 May 2012 10:10:43 +0000 (+0200) Subject: libmount: don't canonicalize target X-Git-Tag: v2.22-rc1~398 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fa705b5441bdb93c36702f7db6c54ec1133bd1cc;p=thirdparty%2Futil-linux.git libmount: don't canonicalize target Note that mountpoint (target_ paths in /proc/mounts and /proc/self/mountinfo are always canonicalized by kernel. * for umount we don't have to canonicalize target by default if the mountpoint is found in /proc/self/mountinfo * in mnt_table_find_target() is unnecessary to canonicalize target paths if the table of the filesystems is read from /proc/self/mountinfo Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=820707 Signed-off-by: Karel Zak --- diff --git a/libmount/src/context_umount.c b/libmount/src/context_umount.c index 3443da11bc..39d940f6c2 100644 --- a/libmount/src/context_umount.c +++ b/libmount/src/context_umount.c @@ -604,8 +604,6 @@ int mnt_context_prepare_umount(struct libmnt_context *cxt) rc = mnt_context_merge_mflags(cxt); if (!rc) rc = evaluate_permissions(cxt); - if (!rc) - rc = mnt_context_prepare_target(cxt); if (!rc && !cxt->helper) { diff --git a/libmount/src/fs.c b/libmount/src/fs.c index 22addb9f42..543ffb1537 100644 --- a/libmount/src/fs.c +++ b/libmount/src/fs.c @@ -1208,7 +1208,8 @@ int mnt_fs_get_attribute(struct libmnt_fs *fs, const char *name, * Possible are three attempts: * 1) compare @target with @fs->target * 2) realpath(@target) with @fs->target - * 3) realpath(@target) with realpath(@fs->target). + * 3) realpath(@target) with realpath(@fs->target) if @fs is not from + * /proc/self/mountinfo. * * The 2nd and 3rd attempts are not performed when @cache is NULL. * @@ -1231,7 +1232,7 @@ int mnt_fs_match_target(struct libmnt_fs *fs, const char *target, rc = (cn && strcmp(cn, fs->target) == 0); /* 3) - canonicalized and canonicalized */ - if (!rc && cn) { + if (!rc && cn && !mnt_fs_is_kernel(fs)) { char *tcn = mnt_resolve_path(fs->target, cache); rc = (tcn && strcmp(cn, tcn) == 0); } diff --git a/libmount/src/tab.c b/libmount/src/tab.c index 9c41c99a2c..927e0f8dad 100644 --- a/libmount/src/tab.c +++ b/libmount/src/tab.c @@ -456,13 +456,18 @@ struct libmnt_fs *mnt_table_find_target(struct libmnt_table *tb, const char *pat return fs; } - /* non-canonicaled path in struct libmnt_table */ + /* non-canonicaled path in struct libmnt_table + * -- note that mountpoint in /proc/self/mountinfo is already + * canonicalized by kernel + */ mnt_reset_iter(&itr, direction); while(mnt_table_next_fs(tb, &itr, &fs) == 0) { char *p; - if (!fs->target || mnt_fs_is_swaparea(fs) || - (*fs->target == '/' && *(fs->target + 1) == '\0')) + if (!fs->target + || mnt_fs_is_swaparea(fs) + || mnt_fs_is_kernel(fs) + || (*fs->target == '/' && *(fs->target + 1) == '\0')) continue; p = mnt_resolve_path(fs->target, tb->cache);