libfstools: add f2fs filesystem type and simplify fs type code
authorFelix Fietkau <nbd@nbd.name>
Thu, 8 Sep 2016 10:02:08 +0000 (12:02 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 8 Sep 2016 11:05:57 +0000 (13:05 +0200)
Signed-off-by: Felix Fietkau <nbd@nbd.name>
libfstools/find.c
libfstools/libfstools.h
libfstools/overlay.c
mount_root.c

index 0440052bf51c42bd7be2ff876e9ddd1a228263b4..72a2b4c70736adc482cb7d6a21225c241401b16c 100644 (file)
@@ -77,7 +77,7 @@ find_mount(char *mp)
 }
 
 char*
-find_mount_point(char *block, int mtd_only)
+find_mount_point(char *block, int root_only)
 {
        FILE *fp = fopen("/proc/mounts", "r");
        static char line[256];
@@ -100,7 +100,8 @@ find_mount_point(char *block, int mtd_only)
                        *t = '\0';
                        t++;
 
-                       if (mtd_only &&
+                       if (root_only &&
+                           strncmp(t, "f2fs", 4) &&
                            strncmp(t, "jffs2", 5) &&
                            strncmp(t, "ubifs", 5)) {
                                fclose(fp);
index ec760f4a33b72ae8f861d1d04cf39bdb435f6cb9..f5ca75cbb064f8172582dd2e5c70a9d5b7e18141 100644 (file)
@@ -27,6 +27,7 @@ enum {
        FS_JFFS2,
        FS_DEADCODE,
        FS_UBIFS,
+       FS_F2FS,
 };
 
 enum fs_state {
@@ -48,7 +49,7 @@ extern int ramoverlay(void);
 
 extern int find_overlay_mount(char *overlay);
 extern char* find_mount(char *mp);
-extern char* find_mount_point(char *block, int mtd_only);
+extern char* find_mount_point(char *block, int root_only);
 extern int find_filesystem(char *fs);
 
 extern int jffs2_switch(struct volume *v);
index f68065e4fb7e598f0c9e49296add7966be39be2e..5215ff3a06018db740ca6a604f6d36e78d5f59eb 100644 (file)
@@ -192,18 +192,31 @@ handle_whiteout(const char *dir)
        return 0;
 }
 
+static char *overlay_fs_name(int type)
+{
+       switch (type) {
+               case FS_F2FS:
+                       return "f2fs";
+               case FS_UBIFS:
+                       return "ubifs";
+               case FS_JFFS2:
+               default:
+                       return "jffs2";
+       }
+}
+
 int
 jffs2_switch(struct volume *v)
 {
        char *mp;
-       int ret = -1;
+       int type;
 
        if (find_overlay_mount("overlayfs:/tmp/root"))
                return -1;
 
        if (find_filesystem("overlay")) {
                ULOG_ERR("overlayfs not supported by kernel\n");
-               return ret;
+               return -1;
        }
 
        volume_init(v);
@@ -213,44 +226,32 @@ jffs2_switch(struct volume *v)
                return -1;
        }
 
-       switch (volume_identify(v)) {
+       type = volume_identify(v);
+       switch (type) {
        case FS_NONE:
                ULOG_ERR("no jffs2 marker found\n");
                /* fall through */
 
        case FS_DEADCODE:
-               ret = switch2jffs(v);
-               if (!ret) {
-                       ULOG_INFO("performing overlay whiteout\n");
-                       umount2("/tmp/root", MNT_DETACH);
-                       foreachdir("/overlay/", handle_whiteout);
-               }
-               break;
+               if (switch2jffs(v))
+                       return -1;
 
-       case FS_JFFS2:
-               ret = overlay_mount(v, "jffs2");
-               if (ret)
-                       break;
-               if (mount_move("/tmp", "", "/overlay") || fopivot("/overlay", "/rom")) {
-                       ULOG_ERR("switching to jffs2 failed\n");
-                       ret = -1;
-               }
+               ULOG_INFO("performing overlay whiteout\n");
+               umount2("/tmp/root", MNT_DETACH);
+               foreachdir("/overlay/", handle_whiteout);
                break;
 
+       case FS_F2FS:
        case FS_UBIFS:
-               ret = overlay_mount(v, "ubifs");
-               if (ret)
-                       break;
+               if (overlay_mount(v, overlay_fs_name(type)))
+                       return -1;
                if (mount_move("/tmp", "", "/overlay") || fopivot("/overlay", "/rom")) {
-                       ULOG_ERR("switching to ubifs failed\n");
-                       ret = -1;
+                       ULOG_ERR("switching to jffs2 failed\n");
+                       return -1;
                }
                break;
        }
 
-       if (ret)
-               return ret;
-
        sync();
        fs_state_set("/overlay", FS_STATE_READY);
        return 0;
@@ -258,21 +259,13 @@ jffs2_switch(struct volume *v)
 
 static int overlay_mount_fs(struct volume *v)
 {
-       char *fstype;
+       char *fstype = overlay_fs_name(volume_identify(v));
 
        if (mkdir("/tmp/overlay", 0755)) {
                ULOG_ERR("failed to mkdir /tmp/overlay: %s\n", strerror(errno));
                return -1;
        }
 
-       fstype = "jffs2";
-
-       switch (volume_identify(v)) {
-       case FS_UBIFS:
-               fstype = "ubifs";
-               break;
-       }
-
        if (mount(v->blk, "/tmp/overlay", fstype, MS_NOATIME, NULL)) {
                ULOG_ERR("failed to mount -t %s %s /tmp/overlay: %s\n",
                         fstype, v->blk, strerror(errno));
index dbe1d658569a3498b7ef59dd48e19634cd8632c1..aaafecad506407544710f0ff70e81e312015f628 100644 (file)
@@ -71,6 +71,7 @@ start(int argc, char *argv[1])
                ULOG_NOTE("jffs2 not ready yet, using temporary tmpfs overlay\n");
                return ramoverlay();
 
+       case FS_F2FS:
        case FS_JFFS2:
        case FS_UBIFS:
                mount_overlay(data);
@@ -109,6 +110,7 @@ done(int argc, char *argv[1])
        case FS_DEADCODE:
                return jffs2_switch(v);
 
+       case FS_F2FS:
        case FS_JFFS2:
        case FS_UBIFS:
                fs_state_set("/overlay", FS_STATE_READY);