These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / mtd / ubi / vtbl.c
index 68c9c5e..d85c197 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);
 }
 
 /**
@@ -646,6 +649,7 @@ static int init_volumes(struct ubi_device *ubi,
                if (ubi->corr_peb_count)
                        ubi_err(ubi, "%d PEBs are corrupted and not used",
                                ubi->corr_peb_count);
+               return -ENOSPC;
        }
        ubi->rsvd_pebs += reserved_pebs;
        ubi->avail_pebs -= reserved_pebs;