[systemd-devel] [PATCH] mount: fix manual network mounts

harald at redhat.com harald at redhat.com
Fri Mar 8 07:32:38 PST 2013


From: Harald Hoyer <harald at redhat.com>

Now works as expected for me.

$ mount 192.168.2.2:/Public /mnt/test
$ systemctl status mnt-test.mount
mnt-test.mount - /mnt/test
	  Loaded: loaded (/proc/self/mountinfo)
	  Active: active (mounted) since Fr 2013-03-08 16:24:38 CET; 11s ago
	   Where: /mnt/test
	    What: 192.168.2.2:/Public

Mär 08 16:24:38 lenovo systemd[1]: mnt-test.mount changed dead -> mounted

$ systemctl stop remote-fs.target

$ systemctl status mnt-test.mount
mnt-test.mount - /mnt/test
	  Loaded: loaded (/proc/self/mountinfo)
	  Active: inactive (dead) since Fr 2013-03-08 16:24:57 CET; 1s ago
	   Where: /mnt/test
	 Process: 4968 ExecUnmount=/bin/umount /mnt/test (code=exited, status=0/SUCCESS)

Mär 08 16:24:57 lenovo systemd[1]: Installed new job mnt-test.mount/stop as 744
Mär 08 16:24:57 lenovo systemd[1]: Unmounting /mnt/test...
Mär 08 16:24:57 lenovo systemd[1]: About to execute /bin/umount /mnt/test
Mär 08 16:24:57 lenovo systemd[1]: Forked /bin/umount as 4968
Mär 08 16:24:57 lenovo systemd[1]: mnt-test.mount changed mounted -> unmounting
Mär 08 16:24:57 lenovo systemd[1]: Child 4968 belongs to mnt-test.mount
Mär 08 16:24:57 lenovo systemd[1]: mnt-test.mount mount process exited, code=exited status=0
Mär 08 16:24:57 lenovo systemd[1]: mnt-test.mount changed unmounting -> dead
Mär 08 16:24:57 lenovo systemd[1]: Job mnt-test.mount/stop finished, result=done
Mär 08 16:24:57 lenovo systemd[1]: Unmounted /mnt/test.
---
 src/core/mount.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/core/mount.c b/src/core/mount.c
index 419cf27..353d0e6 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -441,28 +441,38 @@ static int mount_add_default_dependencies(Mount *m) {
         int r;
         MountParameters *p;
         const char *after;
+        const char *before;
 
         assert(m);
 
         if (UNIT(m)->manager->running_as != SYSTEMD_SYSTEM)
                 return 0;
 
-        p = get_mount_parameters_fragment(m);
+        p = get_mount_parameters(m);
+
         if (!p)
                 return 0;
 
         if (path_equal(m->where, "/"))
                 return 0;
 
-        if (mount_is_network(p))
+        if (mount_is_network(p)) {
                 after = SPECIAL_REMOTE_FS_PRE_TARGET;
-        else
+                before = SPECIAL_REMOTE_FS_TARGET;
+        }
+        else {
                 after = SPECIAL_LOCAL_FS_PRE_TARGET;
+                before = SPECIAL_LOCAL_FS_TARGET;
+        }
 
         r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_WANTS, UNIT_AFTER, after, NULL, true);
         if (r < 0)
                 return r;
 
+        r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_REQUIRES, UNIT_BEFORE, before, NULL, true);
+        if (r < 0)
+                return r;
+
         r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
         if (r < 0)
                 return r;
@@ -1516,7 +1526,9 @@ static int mount_add_one(
                 if (u->load_state == UNIT_ERROR) {
                         u->load_state = UNIT_LOADED;
                         u->load_error = 0;
+                }
 
+                if (u->load_state == UNIT_LOADED) {
                         /* Load in the extras later on, after we
                          * finished initialization of the unit */
                         load_extras = true;
-- 
1.8.1



More information about the systemd-devel mailing list