]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
mount: add a common helper for filling in info from /proc/self/mountinfo
authorLennart Poettering <lennart@poettering.net>
Wed, 28 Nov 2018 11:46:35 +0000 (12:46 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 7 Dec 2018 16:30:14 +0000 (17:30 +0100)
src/core/mount.c

index 76715077350b32c8a014dcd472b9aa96d42f6cff..00a2326183da2db3bb647b9382c13aa76368795a 100644 (file)
@@ -1421,6 +1421,32 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user
         return 0;
 }
 
+static int update_parameters_proc_self_mount_info(
+                Mount *m,
+                const char *what,
+                const char *options,
+                const char *fstype) {
+
+        MountParameters *p;
+        int r, q, w;
+
+        p = &m->parameters_proc_self_mountinfo;
+
+        r = free_and_strdup(&p->what, what);
+        if (r < 0)
+                return r;
+
+        q = free_and_strdup(&p->options, options);
+        if (q < 0)
+                return q;
+
+        w = free_and_strdup(&p->fstype, fstype);
+        if (w < 0)
+                return w;
+
+        return r > 0 || q > 0 || w > 0;
+}
+
 typedef struct {
         bool is_mounted;
         bool just_mounted;
@@ -1435,7 +1461,7 @@ static int mount_setup_new_unit(
                 const char *fstype,
                 MountSetupFlags *flags) {
 
-        MountParameters *p;
+        int r;
 
         assert(u);
         assert(flags);
@@ -1447,17 +1473,16 @@ static int mount_setup_new_unit(
 
         /* Make sure to initialize those fields before mount_is_extrinsic(). */
         MOUNT(u)->from_proc_self_mountinfo = true;
-        p = &MOUNT(u)->parameters_proc_self_mountinfo;
 
-        p->what = strdup(what);
-        p->options = strdup(options);
-        p->fstype = strdup(fstype);
-        if (!p->what || !p->options || !p->fstype)
-                return -ENOMEM;
+        r = update_parameters_proc_self_mount_info(MOUNT(u), what, options, fstype);
+        if (r < 0)
+                return r;
 
         if (!mount_is_extrinsic(MOUNT(u))) {
+                MountParameters *p;
                 const char *target;
-                int r;
+
+                p = &MOUNT(u)->parameters_proc_self_mountinfo;
 
                 target = mount_is_network(p) ? SPECIAL_REMOTE_FS_TARGET : SPECIAL_LOCAL_FS_TARGET;
                 r = unit_add_dependency_by_name(u, UNIT_BEFORE, target, true, UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT);
@@ -1485,9 +1510,9 @@ static int mount_setup_existing_unit(
                 const char *fstype,
                 MountSetupFlags *flags) {
 
-        MountParameters *p;
         bool load_extras = false;
-        int r1, r2, r3;
+        MountParameters *p;
+        int r;
 
         assert(u);
         assert(flags);
@@ -1498,21 +1523,18 @@ static int mount_setup_existing_unit(
                         return -ENOMEM;
         }
 
-        /* Make sure to initialize those fields before mount_is_extrinsic(). */
-        p = &MOUNT(u)->parameters_proc_self_mountinfo;
-
-        r1 = free_and_strdup(&p->what, what);
-        r2 = free_and_strdup(&p->options, options);
-        r3 = free_and_strdup(&p->fstype, fstype);
-        if (r1 < 0 || r2 < 0 || r3 < 0)
-                return -ENOMEM;
+        r = update_parameters_proc_self_mount_info(MOUNT(u), what, options, fstype);
+        if (r < 0)
+                return r;
 
-        flags->just_changed = r1 > 0 || r2 > 0 || r3 > 0;
+        flags->just_changed = r > 0;
         flags->is_mounted = true;
         flags->just_mounted = !MOUNT(u)->from_proc_self_mountinfo || MOUNT(u)->just_mounted;
 
         MOUNT(u)->from_proc_self_mountinfo = true;
 
+        p = &MOUNT(u)->parameters_proc_self_mountinfo;
+
         if (!mount_is_extrinsic(MOUNT(u)) && mount_is_network(p)) {
                 /* _netdev option may have shown up late, or on a
                  * remount. Add remote-fs dependencies, even though