control: tags -1 + patch

Am 06.01.2015 um 10:37 schrieb Michael Biebl:
> Am 06.01.2015 um 08:23 schrieb Martin Pitt:
>> Also, I think there is a simpler way to check if a dir is a
>> mountpoint: s1 = stat(dir), s2 = stat(parent(dir))
>> (i. e. dir + "/.."), and check
>>
>>  is_mount = (st.st_dev != st2.st_dev) ||
>>             (st.st_dev == st2.st_dev && st.st_ino == st2.st_ino);
> 
> .. this seems simpler indeed. So let's just use that. Thanks for the hint!
> 
>> That's the approach that /bin/mountpoint uses, and it avoids relying
>> on having /etc/mtab, /proc mounted, and doing the iteration.

Updated patch attached (tested with a split-usr setup and with both
initramfs-tools 0.116 and 0.118)



-- 
Why is it that all of the instruments seeking intelligent life in the
universe are pointed away from Earth?
diff --git a/src/remount-fs/remount-fs.c b/src/remount-fs/remount-fs.c
index 847637a..82a1596 100644
--- a/src/remount-fs/remount-fs.c
+++ b/src/remount-fs/remount-fs.c
@@ -34,6 +34,32 @@
 #include "mount-setup.h"
 #include "exit-status.h"
 
+static bool is_mounted(const char *dev_path) {
+        _cleanup_free_ char *parent_path = NULL;
+        struct stat st, pst;
+        int r;
+
+        parent_path = strjoin(dev_path, "/..", NULL);
+
+        r = stat(dev_path, &st);
+        if (r < 0)
+                return false;
+
+        r = stat(parent_path, &pst);
+        if (r < 0)
+                return false;
+
+        /*
+         * This code to check if a given path is a mountpoint is
+         * borrowed from util-linux' mountpoint tool.
+         */
+        if ((st.st_dev != pst.st_dev) ||
+            (st.st_dev == pst.st_dev && st.st_ino == pst.st_ino))
+                return true;
+
+        return false;
+}
+
 /* Goes through /etc/fstab and remounts all API file systems, applying
  * options that are in /etc/fstab that systemd might not have
  * respected */
@@ -83,6 +109,11 @@ int main(int argc, char *argv[]) {
                     !path_equal(me->mnt_dir, "/usr"))
                         continue;
 
+                /* Skip /usr if it hasn't been mounted by the initrd */
+                if (path_equal(me->mnt_dir, "/usr") &&
+                    !is_mounted("/usr"))
+                        continue;
+
                 log_debug("Remounting %s", me->mnt_dir);
 
                 pid = fork();

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to