systemd-mount: support unmounting devices on remote host
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 5 Jul 2017 12:55:39 +0000 (21:55 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 5 Jul 2017 12:55:39 +0000 (21:55 +0900)
The commit 9017f5d88d5061487de53f00a1a8c0a83e41e760 prohibits
to unmount devices on remote host. This makes reenable such feature.

man/systemd-mount.xml
src/mount/mount-tool.c

index 18f14b3..63e4fc4 100644 (file)
         which can be mount points, devices, <filename>/etc/fstab</filename> style node names, or backing files
         corresponding to loop devices, like
         <command>systemd-mount --umount /path/to/umount /dev/sda1 UUID=xxxxxx-xxxx LABEL=xxxxx /path/to/disk.img</command>.
-      </para>
-        </listitem>
+        Note that when <option>-H</option> or <option>-M</option> is specified, only absolute paths to mount points are
+        supported.</para></listitem>
       </varlistentry>
 
       <xi:include href="user-system-options.xml" xpointer="user" />
index 52b8ef5..81c6ef5 100644 (file)
@@ -311,8 +311,13 @@ static int parse_argv(int argc, char *argv[]) {
                 }
 
                 if (arg_transport != BUS_TRANSPORT_LOCAL) {
-                        log_error("Unmounting devices only supported locally.");
-                        return -EOPNOTSUPP;
+                        int i;
+
+                        for (i = optind; i < argc; i++)
+                                if (!path_is_absolute(argv[i]) ) {
+                                        log_error("Only absolute path is supported: %s", argv[i]);
+                                        return -EINVAL;
+                                }
                 }
         } else {
                 if (optind >= argc) {
@@ -918,6 +923,23 @@ static int action_umount(
 
         int i, r, r2 = 0;
 
+        if (arg_transport != BUS_TRANSPORT_LOCAL) {
+                for (i = optind; i < argc; i++) {
+                        _cleanup_free_ char *p = NULL;
+
+                        p = strdup(argv[i]);
+                        if (!p)
+                                return log_oom();
+
+                        path_kill_slashes(p);
+
+                        r = stop_mounts(bus, p);
+                        if (r < 0)
+                                r2 = r;
+                }
+                return r2;
+        }
+
         for (i = optind; i < argc; i++) {
                 _cleanup_free_ char *u = NULL, *p = NULL;
                 struct stat st;