Browse Source

libfstools: add f2fs filesystem type and simplify fs type code

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Felix Fietkau 7 years ago
parent
commit
4abf9de460
4 changed files with 35 additions and 38 deletions
  1. 3 2
      libfstools/find.c
  2. 2 1
      libfstools/libfstools.h
  3. 28 35
      libfstools/overlay.c
  4. 2 0
      mount_root.c

+ 3 - 2
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);

+ 2 - 1
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);

+ 28 - 35
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));

+ 2 - 0
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);