fstools: backport regression fix for volume_identify
authorRafał Miłecki <rafal@milecki.pl>
Tue, 9 May 2017 08:18:15 +0000 (10:18 +0200)
committerRafał Miłecki <rafal@milecki.pl>
Mon, 22 May 2017 09:15:53 +0000 (11:15 +0200)
This fixes regression when volume_identify didn't identify volume on
subsequent calls.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
package/system/fstools/Makefile
package/system/fstools/patches/0001-libfstools-fix-multiple-volume_identify-usages-with-.patch [new file with mode: 0644]

index cf9bd21..28f68b5 100644 (file)
@@ -15,6 +15,7 @@ PKG_SOURCE_URL=$(LEDE_GIT)/project/fstools.git
 PKG_SOURCE_DATE:=2016-12-04
 PKG_SOURCE_VERSION:=84b530a732b12cca1cd5ee9ba163b7ead7a83de3
 PKG_MIRROR_HASH:=b607138de1adbb7f49e53daebe28ac1352910fa2b29278365edeabafc5b46a91
+PKG_RELEASE:=2
 CMAKE_INSTALL:=1
 
 PKG_LICENSE:=GPL-2.0
diff --git a/package/system/fstools/patches/0001-libfstools-fix-multiple-volume_identify-usages-with-.patch b/package/system/fstools/patches/0001-libfstools-fix-multiple-volume_identify-usages-with-.patch
new file mode 100644 (file)
index 0000000..4a3809a
--- /dev/null
@@ -0,0 +1,56 @@
+From 633a8d0981fed0c90f6d16ee2257858b04514dc8 Mon Sep 17 00:00:00 2001
+From: Pieter Smith <pieter.smith@philips.com>
+Date: Wed, 29 Mar 2017 18:21:56 +0200
+Subject: [PATCH] libfstools: fix multiple volume_identify usages with the same
+ volume
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This fixes e.g. factory-flashed startup issue with jffs2 on ubi overlay
+
+Commit ba019965 ("libfstools: accept volume as argument in most calls")
+broke startup for factory-flashed jffs2 on ubi systems, causing substantial
+slowdown in factory environments.
+
+When starting up with a factory-flashed jffs2 on ubi system, the "rootfs_data"
+volume contains a deadcode marker. In the start phase, mount_root then mounts a
+tmpfs overlay, and postpones remounting of the jffs2 overlay until the done
+phase of the startup.
+
+The refactoring in ba019965 eliminated an unneeded call to volume_find() when
+done() called jffs2_switch(). Unfortunately the refactoring did not take into
+account that volume_identify() does not function correctly when called twice in
+a row on the same struct volume when using an mtd driver.
+
+mtd_volume_identify() uses mtd_volume_load() to open an fd to the mtd device
+and reads a potential deadcode marker from the fd. The first time this works,
+and FS_DEADCODE is returned.
+
+When volume_identify() is called a second time however, mtd_volume_load()
+notices that we already have an open fd, does nothing further and returns 0
+without resetting the file offset to 0. mtd_volume_identify() now reads past
+the deadcode marker and now returns FS_JFFS2 if the mtd device is a UBIVOLUME.
+
+jffs2_switch() then handles the wrong case, either pulling the root out from
+under user-space in Chaos Calmer, or indefinitely sticking to a tmpfs overlay
+in later OpenWRT builds.
+
+Signed-off-by: Pieter Smith <pieter.smith@philips.com>
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+---
+
+--- a/libfstools/mtd.c
++++ b/libfstools/mtd.c
+@@ -76,8 +76,10 @@ static int mtd_volume_load(struct mtd_vo
+       struct mtd_info_user mtdInfo;
+       struct erase_info_user mtdLockInfo;
+-      if (p->fd)
++      if (p->fd) {
++              lseek(p->fd, 0, SEEK_SET);
+               return 0;
++      }
+       if (!p->chr)
+               return -1;