public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH] [UBI] Volume table update fix
@ 2009-06-19 11:01 Brijesh Singh
  2009-06-22  7:29 ` Artem Bityutskiy
  0 siblings, 1 reply; 5+ messages in thread
From: Brijesh Singh @ 2009-06-19 11:01 UTC (permalink / raw)
  To: dedekind; +Cc: linux-mtd

Hi,
  This patch fixes the consistency problem during volume update.
  UBI writes two copies of vtbl during volume update. If
the first copy was successfully written, and second copy fails,
UBI returns failure.
  But UBI recovers updated vtbl during next mount. So it should have
returned success. It should go to read only mode to avoid further failures.

Signed-off-by: Brijesh Singh <brij.singh@samsung.com>
---
diff --git a/drivers/mtd/ubi/vtbl.c b/drivers/mtd/ubi/vtbl.c
index 1afc61e..c776037 100644
--- a/drivers/mtd/ubi/vtbl.c
+++ b/drivers/mtd/ubi/vtbl.c
@@ -84,7 +84,7 @@ static struct ubi_vtbl_record empty_vtbl_record;
 int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
 			   struct ubi_vtbl_record *vtbl_rec)
 {
-	int i, err;
+	int copy, err, err1;
 	uint32_t crc;
 	struct ubi_volume *layout_vol;

@@ -99,19 +99,41 @@ int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
 	}

 	memcpy(&ubi->vtbl[idx], vtbl_rec, sizeof(struct ubi_vtbl_record));
-	for (i = 0; i < UBI_LAYOUT_VOLUME_EBS; i++) {
-		err = ubi_eba_unmap_leb(ubi, layout_vol, i);
+	for (copy = 0; copy < UBI_LAYOUT_VOLUME_EBS; copy++) {
+		err = ubi_eba_unmap_leb(ubi, layout_vol, copy);
 		if (err)
-			return err;
+			goto out_error;

-		err = ubi_eba_write_leb(ubi, layout_vol, i, ubi->vtbl, 0,
+		err = ubi_eba_write_leb(ubi, layout_vol, copy, ubi->vtbl, 0,
 					ubi->vtbl_size, UBI_LONGTERM);
 		if (err)
-			return err;
+			goto out_error;
 	}

 	paranoid_vtbl_check(ubi);
 	return 0;
+
+out_error:
+	/* If first copy was written,volume creation is successful.
+	* But switch to read only mode as we have only one copy.
+	* If first copy itself was not written, older version is in copy 2.
+	* Unmap first copy and call wl_flush.
+	* Volume creating is unsuccessful.
+	*/
+	ubi_err("Error writing volume table copy #%d", copy+1);
+	err1 = ubi_eba_unmap_leb(ubi, layout_vol, copy);
+	if (!err1) {
+		ubi_wl_flush(ubi);
+		/* Don't bother about error in flush
+		 * We are going read only any ways
+		 */
+	}
+	ubi_ro_mode(ubi);
+	ubi_msg("Try detaching and attaching UBI again");
+	if (copy > 0)
+		return 0;
+	else
+		return err;
 }

 /**

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2009-06-22 13:12 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-19 11:01 [PATCH] [UBI] Volume table update fix Brijesh Singh
2009-06-22  7:29 ` Artem Bityutskiy
2009-06-22  7:34   ` Artem Bityutskiy
2009-06-22 11:14     ` Brijesh Singh
2009-06-22 13:11       ` Artem Bityutskiy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox