[PATCH] UBIFS: add tolerance to use variable writesize

Dirk Behme dirk.behme at gmail.com
Wed May 15 12:21:05 EDT 2013


From: Achim Dahlhoff <Achim.Dahlhoff at de.bosch.com>

UBIfs adapts it‘s structures according to the minimum writeSize reported
by the MTD device. For NOR flash devices, this is normally 1. For NOR
devices with internal hardware-ECC it might be more, such as the S-Die
flash chips of Micron which can use an internal ECC if the chip is
accessed in 32 byte chunks.

The UBIfs mount process checks and compares the writeSize set in the
image and the writeSize reported from the /dev/mtd . UBIfs will fail
to mount if the values differ. It should, though, not be a problem to
mount an image which was created with a writeSize larger than that of
the MTD, if it is larger by an integer factor.

This commit changes the check in a way so it will allow the image
writeSize to be larger than that of the MTD by an integer factor.
It will allow to create images and deploy them on different devices
using different writeSizes. writeSize found using values of 1, 8 and 32.

Signed-off-by: Achim Dahlhoff <Achim.Dahlhoff at de.bosch.com>
---
 fs/ubifs/sb.c |   12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/fs/ubifs/sb.c b/fs/ubifs/sb.c
index 4c37607..69dd794 100644
--- a/fs/ubifs/sb.c
+++ b/fs/ubifs/sb.c
@@ -351,6 +351,7 @@ static int validate_sb(struct ubifs_info *c, struct ubifs_sb_node *sup)
 {
 	long long max_bytes;
 	int err = 1, min_leb_cnt;
+	int chk_tmp;
 
 	if (!c->key_hash) {
 		err = 2;
@@ -362,9 +363,16 @@ static int validate_sb(struct ubifs_info *c, struct ubifs_sb_node *sup)
 		goto failed;
 	}
 
-	if (le32_to_cpu(sup->min_io_size) != c->min_io_size) {
+	/*
+	 * Allow a min_io_size mismatch in the way that
+	 * the size in the superblock (the image) is larger by
+	 * an integer factor. If image-IOsize mod real-IOsize
+	 * is zero, it should be ok to mount this.
+	 */
+	chk_tmp = le32_to_cpu(sup->min_io_size);
+	if (chk_tmp != c->min_io_size && ((chk_tmp%c->min_io_size) != 0)) {
 		ubifs_err("min. I/O unit mismatch: %d in superblock, %d real",
-			  le32_to_cpu(sup->min_io_size), c->min_io_size);
+			  chk_tmp, c->min_io_size);
 		goto failed;
 	}
 
-- 
1.7.10.4




More information about the linux-mtd mailing list