From 4abf9de460253771fabef2b2cdf5d7a8b457bd1d Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 8 Sep 2016 12:02:08 +0200 Subject: [PATCH] libfstools: add f2fs filesystem type and simplify fs type code Signed-off-by: Felix Fietkau --- libfstools/find.c | 5 ++-- libfstools/libfstools.h | 3 +- libfstools/overlay.c | 63 ++++++++++++++++++----------------------- mount_root.c | 2 ++ 4 files changed, 35 insertions(+), 38 deletions(-) diff --git a/libfstools/find.c b/libfstools/find.c index 0440052..72a2b4c 100644 --- a/libfstools/find.c +++ b/libfstools/find.c @@ -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); diff --git a/libfstools/libfstools.h b/libfstools/libfstools.h index ec760f4..f5ca75c 100644 --- a/libfstools/libfstools.h +++ b/libfstools/libfstools.h @@ -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); diff --git a/libfstools/overlay.c b/libfstools/overlay.c index f68065e..5215ff3 100644 --- a/libfstools/overlay.c +++ b/libfstools/overlay.c @@ -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)); diff --git a/mount_root.c b/mount_root.c index dbe1d65..aaafeca 100644 --- a/mount_root.c +++ b/mount_root.c @@ -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); -- 2.25.1