]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: fix mount -a for cifs
authorAurelien Aptel <aaptel@suse.com>
Thu, 1 Sep 2016 11:57:42 +0000 (13:57 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 29 Sep 2016 09:51:38 +0000 (11:51 +0200)
when mounting a cifs share, the src is actually an UNC path which can in
in several forms:

simple:            //host/share, //host/share/
including subpath: //host/share/sub/path

to check if the cifs fs is mounted we have to extract the subpath and
compare *that* to the root.

Signed-off-by: Aurelien Aptel <aaptel@suse.com>
libmount/src/tab.c

index 341e5e343ef018b62080766239a3b3b30fa1ba59..9c49ec885b0ff740f0c12dd9fff187924b89e3e5 100644 (file)
@@ -1329,6 +1329,20 @@ err:
 }
 #endif /* HAVE_BTRFS_SUPPORT */
 
+static const char *get_cifs_unc_subdir_path (const char *unc)
+{
+       /*
+        *  1 or more slash:     %*[/]
+        *  1 or more non-slash: %*[^/]
+        *  number of byte read: %n
+        */
+       int share_end = 0;
+       int r = sscanf(unc, "%*[/]%*[^/]%*[/]%*[^/]%n", &share_end);
+       if (r == EOF || share_end == 0)
+               return NULL;
+       return unc + share_end;
+}
+
 /*
  * tb: /proc/self/mountinfo
  * fs: filesystem
@@ -1563,9 +1577,16 @@ int mnt_table_is_fs_mounted(struct libmnt_table *tb, struct libmnt_fs *fstab_fs)
                }
 
                if (root) {
-                       const char *r = mnt_fs_get_root(fs);
-                       if (!r || strcmp(r, root) != 0)
-                               continue;
+                       if (strcmp(mnt_fs_get_fstype(fs), "cifs") == 0) {
+                               const char *unc_subdir = get_cifs_unc_subdir_path(src);
+                               const char *path_on_fs = mnt_fs_get_root(fs);
+                               if (!unc_subdir || !path_on_fs || !streq_paths(unc_subdir, path_on_fs))
+                                       continue;
+                       } else {
+                               const char *r = mnt_fs_get_root(fs);
+                               if (!r || strcmp(r, root) != 0)
+                                       continue;
+                       }
                }
 
                /*