mount: apply SELinux labels before overlayfs mount
[project/fstools.git] / libfstools / overlay.c
index ebc43f70257a24d00719f8dd2af7a48180a2d41f..eadafcf4391f36658c26f94c5fec770aeb6c743a 100644 (file)
 #include "libfstools.h"
 #include "volume.h"
 
+#ifndef GLOB_ONLYDIR
+#define GLOB_ONLYDIR 0x100
+#endif
+
 #define SWITCH_JFFS2 "/tmp/.switch_jffs2"
+#define OVERLAYDIR "/rom/overlay"
 
 static bool keep_sysupgrade;
 
@@ -177,13 +182,14 @@ switch2jffs(struct volume *v)
                return -1;
        }
 
-       creat("/tmp/.switch_jffs2", 0600);
-       ret = mount(v->blk, "/rom/overlay", "jffs2", MS_NOATIME, NULL);
-       unlink("/tmp/.switch_jffs2");
+       creat(SWITCH_JFFS2, 0600);
+       ret = mount(v->blk, OVERLAYDIR, "jffs2", MS_NOATIME, NULL);
+       unlink(SWITCH_JFFS2);
        if (ret) {
-               ULOG_ERR("failed - mount -t jffs2 %s /rom/overlay: %m\n", v->blk);
+               ULOG_ERR("failed - mount -t jffs2 %s %s: %m\n", v->blk, OVERLAYDIR);
                return -1;
        }
+       selinux_restorecon(OVERLAYDIR);
 
        if (mount("none", "/", NULL, MS_NOATIME | MS_REMOUNT, 0)) {
                ULOG_ERR("failed - mount -o remount,ro none: %m\n");
@@ -341,7 +347,18 @@ static int overlay_mount_fs(struct volume *v)
                return -1;
        }
 
-       if (mount(v->blk, "/tmp/overlay", fstype, MS_NOATIME, NULL)) {
+       if (mount(v->blk, "/tmp/overlay", fstype,
+#ifdef OVL_MOUNT_FULL_ACCESS_TIME
+               MS_RELATIME,
+#else
+               MS_NOATIME,
+#endif
+#ifdef OVL_MOUNT_COMPRESS_ZLIB
+               "compr=zlib"
+#else
+               NULL
+#endif
+               )) {
                ULOG_ERR("failed to mount -t %s %s /tmp/overlay: %m\n",
                         fstype, v->blk);
                return -1;