]> err.no Git - util-linux/commitdiff
libmount: properly canonicalize source and target
authorKarel Zak <kzak@redhat.com>
Mon, 10 Jan 2011 13:29:51 +0000 (14:29 +0100)
committerKarel Zak <kzak@redhat.com>
Mon, 10 Jan 2011 13:29:51 +0000 (14:29 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
shlibs/mount/src/cache.c
shlibs/mount/src/context.c
shlibs/mount/src/context_mount.c
shlibs/mount/src/context_umount.c
shlibs/mount/src/mountP.h
shlibs/mount/src/utils.c

index 3ed69e1b0fa88af91984998ce4ed56e9ac8802ef..9e20a2ae1f0322ce25ded338dc9f72c1b8acb305 100644 (file)
@@ -406,6 +406,8 @@ char *mnt_get_fstype(const char *devname, int *ambi, mnt_cache *cache)
        char *type = NULL;
        int rc;
 
+       DBG(CACHE, mnt_debug_h(cache, "get %s FS type", devname));
+
        if (cache)
                return mnt_cache_find_tag_value(cache, devname, "TYPE");
 
@@ -444,6 +446,8 @@ char *mnt_resolve_path(const char *path, mnt_cache *cache)
 
        assert(path);
 
+       DBG(CACHE, mnt_debug_h(cache, "resolving path %s", path));
+
        if (!path)
                return NULL;
        if (cache)
@@ -489,6 +493,9 @@ char *mnt_resolve_tag(const char *token, const char *value, mnt_cache *cache)
        assert(token);
        assert(value);
 
+       DBG(CACHE, mnt_debug_h(cache, "resolving tag token=%s value=%s",
+                               token, value));
+
        if (!token || !value)
                return NULL;
 
index deeb606cc63618a8403dc044b17946ffa7782a6c..82a47a0eb80e7399e23b772e8fb7268feca0d612 100644 (file)
@@ -843,7 +843,7 @@ int mnt_context_set_mountdata(mnt_context *cxt, void *data)
  */
 int mnt_context_prepare_srcpath(mnt_context *cxt)
 {
-       const char *path = NULL, *type;
+       const char *path = NULL;
        mnt_cache *cache;
        const char *t, *v, *src;
        int rc = 0;
@@ -859,16 +859,15 @@ int mnt_context_prepare_srcpath(mnt_context *cxt)
 
        src = mnt_fs_get_source(cxt->fs);
 
-       /* ignore filesystems without a real source or MS_PROPAGATION stuff */
-       if (!src ||
-           (cxt->fs->flags & (MNT_FS_PSEUDO | MNT_FS_NET)) ||
-           (cxt->mountflags & (MS_BIND | MS_MOVE | MS_PROPAGATION)))
+       /* ignore filesystems without source or filesystems
+        * where the source is quasi-path (//foo/bar)
+        */
+       if (!src || (cxt->fs->flags & MNT_FS_NET))
                return 0;
 
        DBG(CXT, mnt_debug_h(cxt, "srcpath '%s'", src));
 
        cache = mnt_context_get_cache(cxt);
-       type = mnt_fs_get_fstype(cxt->fs);
 
        if (!mnt_fs_get_tag(cxt->fs, &t, &v)) {
                /*
@@ -879,28 +878,29 @@ int mnt_context_prepare_srcpath(mnt_context *cxt)
 
                rc = path ? mnt_fs_set_source(cxt->fs, path) : -EINVAL;
 
-       } else if (!type || (strncmp(type, "9p", 2) &&
-                            strncmp(type, "nfs", 3) &&
-                            strncmp(type, "cifs", 4) &&
-                            strncmp(type, "smbfs", 5))) {
+       } else if (cache) {
                /*
                 * Source is PATH (canonicalize)
                 */
-               if (cache) {
-                       path = mnt_resolve_path(src, cache);
-                       if (strcmp(path, src))
-                               rc = mnt_fs_set_source(cxt->fs, path);
-               }
-       }
+               path = mnt_resolve_path(src, cache);
+               if (path && strcmp(path, src))
+                       rc = mnt_fs_set_source(cxt->fs, path);
+        }
 
        if (rc) {
-               DBG(CXT, mnt_debug_h(cxt, "failed to prepare srcpath"));
+               DBG(CXT, mnt_debug_h(cxt, "failed to prepare srcpath [rc=%d]", rc));
                return rc;
        }
 
        if (!path)
                path = src;
 
+       if ((cxt->mountflags & (MS_BIND | MS_MOVE | MS_PROPAGATION)) ||
+           (cxt->fs->flags & MNT_FS_PSEUDO)) {
+               DBG(CXT, mnt_debug_h(cxt, "PROPAGATION/pseudo FS source: %s", path));
+               return rc;
+       }
+
        /*
         * Initialize loop device
         */
@@ -912,6 +912,40 @@ int mnt_context_prepare_srcpath(mnt_context *cxt)
        return 0;
 }
 
+int mnt_context_prepare_target(mnt_context *cxt)
+{
+       const char *tgt;
+       mnt_cache *cache;
+       int rc = 0;
+
+       assert(cxt);
+       assert(cxt->fs);
+       assert((cxt->flags & MNT_FL_MOUNTFLAGS_MERGED));
+
+       if (!cxt || !cxt->fs)
+               return -EINVAL;
+
+       DBG(CXT, mnt_debug_h(cxt, "preparing target path"));
+
+       tgt = mnt_fs_get_target(cxt->fs);
+       if (!tgt)
+               return 0;
+
+       cache = mnt_context_get_cache(cxt);
+       if (cache) {
+               char *path = mnt_resolve_path(tgt, cache);
+               if (strcmp(path, tgt))
+                       rc = mnt_fs_set_target(cxt->fs, path);
+       }
+
+       if (rc)
+               DBG(CXT, mnt_debug_h(cxt, "failed to prepare target"));
+       else
+               DBG(CXT, mnt_debug_h(cxt, "final target '%s'",
+                                       mnt_fs_get_target(cxt->fs)));
+       return 0;
+}
+
 int mnt_context_guess_fstype(mnt_context *cxt)
 {
        char *type;
index 574a8142f911051f212a3785e61553ac057a9d5d..5f6ba6966feac34fef876c5f72c8e9f6b8eeee1e 100644 (file)
@@ -453,6 +453,8 @@ int mnt_context_do_mount(mnt_context *cxt)
                rc = fix_optstr(cxt);
        if (!rc)
                rc = mnt_context_prepare_srcpath(cxt);
+       if (!rc)
+              rc = mnt_context_prepare_target(cxt);
        if (!rc)
                rc = mnt_context_guess_fstype(cxt);
        if (!rc)
index 9bbdc29afe2628bed69eb719ea1079a1109adee1..9b411d86608960249960fa8a87673a2f28310f98 100644 (file)
@@ -469,6 +469,8 @@ int mnt_context_do_umount(mnt_context *cxt)
                rc = mnt_context_merge_mountflags(cxt);
        if (!rc)
                rc = evaluate_permissions(cxt);
+       if (!rc)
+              rc = mnt_context_prepare_target(cxt);
        if (!rc && !cxt->helper)
                rc = mnt_context_prepare_helper(cxt, "umount", NULL);
 /* TODO
index f9e3a3f7d78162324a6e624a60d4b0ef027c597f..c1a864ae52c524f1d96817b7e2dd65ad12b3fbe1 100644 (file)
@@ -310,6 +310,7 @@ extern int __mnt_fs_set_fstype_ptr(mnt_fs *fs, char *fstype);
 
 /* context.c */
 extern int mnt_context_prepare_srcpath(mnt_context *cxt);
+extern int mnt_context_prepare_target(mnt_context *cxt);
 extern int mnt_context_guess_fstype(mnt_context *cxt);
 extern int mnt_context_prepare_helper(mnt_context *cxt, const char *name, const char *type);
 extern int mnt_context_prepare_update(mnt_context *cxt);
index 99708333a1df5f22b798e7a1af7d7f450942c30c..48c37de3da656f2c5869957cd36c5f6f02147685 100644 (file)
@@ -137,11 +137,12 @@ int mnt_fstype_is_netfs(const char *type)
 {
        if (!type)
                return 0;
-       if (strcmp(type, "cifs")  == 0 ||
+       if (strcmp(type, "cifs")   == 0 ||
            strcmp(type, "smbfs")  == 0 ||
-           strncmp(type, "nfs", 3) == 0 ||
-           strcmp(type, "afs") == 0 ||
-           strcmp(type, "ncpfs") == 0)
+           strncmp(type,"nfs", 3) == 0 ||
+           strcmp(type, "afs")    == 0 ||
+           strcmp(type, "ncpfs")  == 0 ||
+           strncmp(type,"9p", 2)  == 0)
                return 1;
        return 0;
 }