fstools: backport regression fix for volume_identify
This fixes regression when volume_identify didn't identify volume on subsequent calls. Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
This commit is contained in:
parent
379155dc0f
commit
0bef8f8011
@ -15,6 +15,7 @@ PKG_SOURCE_URL=$(LEDE_GIT)/project/fstools.git
|
|||||||
PKG_SOURCE_DATE:=2016-12-04
|
PKG_SOURCE_DATE:=2016-12-04
|
||||||
PKG_SOURCE_VERSION:=84b530a732b12cca1cd5ee9ba163b7ead7a83de3
|
PKG_SOURCE_VERSION:=84b530a732b12cca1cd5ee9ba163b7ead7a83de3
|
||||||
PKG_MIRROR_HASH:=b607138de1adbb7f49e53daebe28ac1352910fa2b29278365edeabafc5b46a91
|
PKG_MIRROR_HASH:=b607138de1adbb7f49e53daebe28ac1352910fa2b29278365edeabafc5b46a91
|
||||||
|
PKG_RELEASE:=2
|
||||||
CMAKE_INSTALL:=1
|
CMAKE_INSTALL:=1
|
||||||
|
|
||||||
PKG_LICENSE:=GPL-2.0
|
PKG_LICENSE:=GPL-2.0
|
||||||
|
@ -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;
|
Loading…
Reference in New Issue
Block a user