UBI: add a helper function for updatting on-flash layout volumes
authorshengyong <shengyong1@huawei.com>
Tue, 26 May 2015 10:07:10 +0000 (10:07 +0000)
committerRichard Weinberger <richard@nod.at>
Tue, 2 Jun 2015 09:47:51 +0000 (11:47 +0200)
Signed-off-by: Sheng Yong <shengyong1@huawei.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
drivers/mtd/ubi/vtbl.c

index 68c9c5ea676f74b38da230b86b024ed71df09cc3..80bdd5b88bac271fbd01f5496be76bf1b79f0d9a 100644 (file)
@@ -69,6 +69,26 @@ static void self_vtbl_check(const struct ubi_device *ubi);
 /* Empty volume table record */
 static struct ubi_vtbl_record empty_vtbl_record;
 
+/**
+ * ubi_update_layout_vol - helper for updatting layout volumes on flash
+ * @ubi: UBI device description object
+ */
+static int ubi_update_layout_vol(struct ubi_device *ubi)
+{
+       struct ubi_volume *layout_vol;
+       int i, err;
+
+       layout_vol = ubi->volumes[vol_id2idx(ubi, UBI_LAYOUT_VOLUME_ID)];
+       for (i = 0; i < UBI_LAYOUT_VOLUME_EBS; i++) {
+               err = ubi_eba_atomic_leb_change(ubi, layout_vol, i, ubi->vtbl,
+                                               ubi->vtbl_size);
+               if (err)
+                       return err;
+       }
+
+       return 0;
+}
+
 /**
  * ubi_change_vtbl_record - change volume table record.
  * @ubi: UBI device description object
@@ -83,12 +103,10 @@ 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 err;
        uint32_t crc;
-       struct ubi_volume *layout_vol;
 
        ubi_assert(idx >= 0 && idx < ubi->vtbl_slots);
-       layout_vol = ubi->volumes[vol_id2idx(ubi, UBI_LAYOUT_VOLUME_ID)];
 
        if (!vtbl_rec)
                vtbl_rec = &empty_vtbl_record;
@@ -98,15 +116,10 @@ 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_atomic_leb_change(ubi, layout_vol, i, ubi->vtbl,
-                                               ubi->vtbl_size);
-               if (err)
-                       return err;
-       }
+       err = ubi_update_layout_vol(ubi);
 
        self_vtbl_check(ubi);
-       return 0;
+       return err ? err : 0;
 }
 
 /**
@@ -121,9 +134,7 @@ int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
 int ubi_vtbl_rename_volumes(struct ubi_device *ubi,
                            struct list_head *rename_list)
 {
-       int i, err;
        struct ubi_rename_entry *re;
-       struct ubi_volume *layout_vol;
 
        list_for_each_entry(re, rename_list, list) {
                uint32_t crc;
@@ -145,15 +156,7 @@ int ubi_vtbl_rename_volumes(struct ubi_device *ubi,
                vtbl_rec->crc = cpu_to_be32(crc);
        }
 
-       layout_vol = ubi->volumes[vol_id2idx(ubi, UBI_LAYOUT_VOLUME_ID)];
-       for (i = 0; i < UBI_LAYOUT_VOLUME_EBS; i++) {
-               err = ubi_eba_atomic_leb_change(ubi, layout_vol, i, ubi->vtbl,
-                                               ubi->vtbl_size);
-               if (err)
-                       return err;
-       }
-
-       return 0;
+       return ubi_update_layout_vol(ubi);
 }
 
 /**