Merge branch 'stable-3.2' into pandora-3.2
[pandora-kernel.git] / drivers / mtd / ubi / vtbl.c
index 277f154..568307c 100644 (file)
  * LEB 1. This scheme guarantees recoverability from unclean reboots.
  *
  * In this UBI implementation the on-flash volume table does not contain any
- * information about how many data static volumes contain. This information may
- * be found from the scanning data.
+ * information about how much data static volumes contain.
  *
  * But it would still be beneficial to store this information in the volume
  * table. For example, suppose we have a static volume X, and all its physical
  * eraseblocks became bad for some reasons. Suppose we are attaching the
- * corresponding MTD device, the scanning has found no logical eraseblocks
+ * corresponding MTD device, for some reason we find no logical eraseblocks
  * corresponding to the volume X. According to the volume table volume X does
  * exist. So we don't know whether it is just empty or all its physical
- * eraseblocks went bad. So we cannot alarm the user about this corruption.
+ * eraseblocks went bad. So we cannot alarm the user properly.
  *
  * The volume table also stores so-called "update marker", which is used for
  * volume updates. Before updating the volume, the update marker is set, and
@@ -62,7 +61,7 @@
 #include <asm/div64.h>
 #include "ubi.h"
 
-static void paranoid_vtbl_check(const struct ubi_device *ubi);
+static void self_vtbl_check(const struct ubi_device *ubi);
 
 /* Empty volume table record */
 static struct ubi_vtbl_record empty_vtbl_record;
@@ -107,7 +106,7 @@ int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
                        return err;
        }
 
-       paranoid_vtbl_check(ubi);
+       self_vtbl_check(ubi);
        return 0;
 }
 
@@ -225,7 +224,7 @@ static int vtbl_check(const struct ubi_device *ubi,
 
                n = ubi->leb_size % alignment;
                if (data_pad != n) {
-                       dbg_err("bad data_pad, has to be %d", n);
+                       ubi_err("bad data_pad, has to be %d", n);
                        err = 6;
                        goto bad;
                }
@@ -241,7 +240,7 @@ static int vtbl_check(const struct ubi_device *ubi,
                }
 
                if (reserved_pebs > ubi->good_peb_count) {
-                       dbg_err("too large reserved_pebs %d, good PEBs %d",
+                       ubi_err("too large reserved_pebs %d, good PEBs %d",
                                reserved_pebs, ubi->good_peb_count);
                        err = 9;
                        goto bad;
@@ -291,19 +290,19 @@ bad:
 /**
  * create_vtbl - create a copy of volume table.
  * @ubi: UBI device description object
- * @si: scanning information
+ * @ai: attaching information
  * @copy: number of the volume table copy
  * @vtbl: contents of the volume table
  *
  * This function returns zero in case of success and a negative error code in
  * case of failure.
  */
-static int create_vtbl(struct ubi_device *ubi, struct ubi_scan_info *si,
+static int create_vtbl(struct ubi_device *ubi, struct ubi_attach_info *ai,
                       int copy, void *vtbl)
 {
        int err, tries = 0;
        struct ubi_vid_hdr *vid_hdr;
-       struct ubi_scan_leb *new_seb;
+       struct ubi_ainf_peb *new_aeb;
 
        ubi_msg("create volume table (copy #%d)", copy + 1);
 
@@ -312,9 +311,9 @@ static int create_vtbl(struct ubi_device *ubi, struct ubi_scan_info *si,
                return -ENOMEM;
 
 retry:
-       new_seb = ubi_scan_get_free_peb(ubi, si);
-       if (IS_ERR(new_seb)) {
-               err = PTR_ERR(new_seb);
+       new_aeb = ubi_early_get_peb(ubi, ai);
+       if (IS_ERR(new_aeb)) {
+               err = PTR_ERR(new_aeb);
                goto out_free;
        }
 
@@ -324,25 +323,24 @@ retry:
        vid_hdr->data_size = vid_hdr->used_ebs =
                             vid_hdr->data_pad = cpu_to_be32(0);
        vid_hdr->lnum = cpu_to_be32(copy);
-       vid_hdr->sqnum = cpu_to_be64(++si->max_sqnum);
+       vid_hdr->sqnum = cpu_to_be64(++ai->max_sqnum);
 
        /* The EC header is already there, write the VID header */
-       err = ubi_io_write_vid_hdr(ubi, new_seb->pnum, vid_hdr);
+       err = ubi_io_write_vid_hdr(ubi, new_aeb->pnum, vid_hdr);
        if (err)
                goto write_error;
 
        /* Write the layout volume contents */
-       err = ubi_io_write_data(ubi, vtbl, new_seb->pnum, 0, ubi->vtbl_size);
+       err = ubi_io_write_data(ubi, vtbl, new_aeb->pnum, 0, ubi->vtbl_size);
        if (err)
                goto write_error;
 
        /*
-        * And add it to the scanning information. Don't delete the old version
-        * of this LEB as it will be deleted and freed in 'ubi_scan_add_used()'.
+        * And add it to the attaching information. Don't delete the old version
+        * of this LEB as it will be deleted and freed in 'ubi_add_to_av()'.
         */
-       err = ubi_scan_add_used(ubi, si, new_seb->pnum, new_seb->ec,
-                               vid_hdr, 0);
-       kfree(new_seb);
+       err = ubi_add_to_av(ubi, ai, new_aeb->pnum, new_aeb->ec, vid_hdr, 0);
+       kmem_cache_free(ai->aeb_slab_cache, new_aeb);
        ubi_free_vid_hdr(ubi, vid_hdr);
        return err;
 
@@ -352,10 +350,10 @@ write_error:
                 * Probably this physical eraseblock went bad, try to pick
                 * another one.
                 */
-               list_add(&new_seb->u.list, &si->erase);
+               list_add(&new_aeb->u.list, &ai->erase);
                goto retry;
        }
-       kfree(new_seb);
+       kmem_cache_free(ai->aeb_slab_cache, new_aeb);
 out_free:
        ubi_free_vid_hdr(ubi, vid_hdr);
        return err;
@@ -365,20 +363,20 @@ out_free:
 /**
  * process_lvol - process the layout volume.
  * @ubi: UBI device description object
- * @si: scanning information
- * @sv: layout volume scanning information
+ * @ai: attaching information
+ * @av: layout volume attaching information
  *
  * This function is responsible for reading the layout volume, ensuring it is
  * not corrupted, and recovering from corruptions if needed. Returns volume
  * table in case of success and a negative error code in case of failure.
  */
 static struct ubi_vtbl_record *process_lvol(struct ubi_device *ubi,
-                                           struct ubi_scan_info *si,
-                                           struct ubi_scan_volume *sv)
+                                           struct ubi_attach_info *ai,
+                                           struct ubi_ainf_volume *av)
 {
        int err;
        struct rb_node *rb;
-       struct ubi_scan_leb *seb;
+       struct ubi_ainf_peb *aeb;
        struct ubi_vtbl_record *leb[UBI_LAYOUT_VOLUME_EBS] = { NULL, NULL };
        int leb_corrupted[UBI_LAYOUT_VOLUME_EBS] = {1, 1};
 
@@ -410,14 +408,14 @@ static struct ubi_vtbl_record *process_lvol(struct ubi_device *ubi,
        dbg_gen("check layout volume");
 
        /* Read both LEB 0 and LEB 1 into memory */
-       ubi_rb_for_each_entry(rb, seb, &sv->root, u.rb) {
-               leb[seb->lnum] = vzalloc(ubi->vtbl_size);
-               if (!leb[seb->lnum]) {
+       ubi_rb_for_each_entry(rb, aeb, &av->root, u.rb) {
+               leb[aeb->lnum] = vzalloc(ubi->vtbl_size);
+               if (!leb[aeb->lnum]) {
                        err = -ENOMEM;
                        goto out_free;
                }
 
-               err = ubi_io_read_data(ubi, leb[seb->lnum], seb->pnum, 0,
+               err = ubi_io_read_data(ubi, leb[aeb->lnum], aeb->pnum, 0,
                                       ubi->vtbl_size);
                if (err == UBI_IO_BITFLIPS || mtd_is_eccerr(err))
                        /*
@@ -425,12 +423,12 @@ static struct ubi_vtbl_record *process_lvol(struct ubi_device *ubi,
                         * uncorrectable ECC error, but we have our own CRC and
                         * the data will be checked later. If the data is OK,
                         * the PEB will be scrubbed (because we set
-                        * seb->scrub). If the data is not OK, the contents of
+                        * aeb->scrub). If the data is not OK, the contents of
                         * the PEB will be recovered from the second copy, and
-                        * seb->scrub will be cleared in
-                        * 'ubi_scan_add_used()'.
+                        * aeb->scrub will be cleared in
+                        * 'ubi_add_to_av()'.
                         */
-                       seb->scrub = 1;
+                       aeb->scrub = 1;
                else if (err)
                        goto out_free;
        }
@@ -449,7 +447,7 @@ static struct ubi_vtbl_record *process_lvol(struct ubi_device *ubi,
                                                  ubi->vtbl_size);
                if (leb_corrupted[1]) {
                        ubi_warn("volume table copy #2 is corrupted");
-                       err = create_vtbl(ubi, si, 1, leb[0]);
+                       err = create_vtbl(ubi, ai, 1, leb[0]);
                        if (err)
                                goto out_free;
                        ubi_msg("volume table was restored");
@@ -472,7 +470,7 @@ static struct ubi_vtbl_record *process_lvol(struct ubi_device *ubi,
                }
 
                ubi_warn("volume table copy #1 is corrupted");
-               err = create_vtbl(ubi, si, 0, leb[1]);
+               err = create_vtbl(ubi, ai, 0, leb[1]);
                if (err)
                        goto out_free;
                ubi_msg("volume table was restored");
@@ -490,13 +488,13 @@ out_free:
 /**
  * create_empty_lvol - create empty layout volume.
  * @ubi: UBI device description object
- * @si: scanning information
+ * @ai: attaching information
  *
  * This function returns volume table contents in case of success and a
  * negative error code in case of failure.
  */
 static struct ubi_vtbl_record *create_empty_lvol(struct ubi_device *ubi,
-                                                struct ubi_scan_info *si)
+                                                struct ubi_attach_info *ai)
 {
        int i;
        struct ubi_vtbl_record *vtbl;
@@ -511,7 +509,7 @@ static struct ubi_vtbl_record *create_empty_lvol(struct ubi_device *ubi,
        for (i = 0; i < UBI_LAYOUT_VOLUME_EBS; i++) {
                int err;
 
-               err = create_vtbl(ubi, si, i, vtbl);
+               err = create_vtbl(ubi, ai, i, vtbl);
                if (err) {
                        vfree(vtbl);
                        return ERR_PTR(err);
@@ -524,18 +522,19 @@ static struct ubi_vtbl_record *create_empty_lvol(struct ubi_device *ubi,
 /**
  * init_volumes - initialize volume information for existing volumes.
  * @ubi: UBI device description object
- * @si: scanning information
+ * @ai: scanning information
  * @vtbl: volume table
  *
  * This function allocates volume description objects for existing volumes.
  * Returns zero in case of success and a negative error code in case of
  * failure.
  */
-static int init_volumes(struct ubi_device *ubi, const struct ubi_scan_info *si,
+static int init_volumes(struct ubi_device *ubi,
+                       const struct ubi_attach_info *ai,
                        const struct ubi_vtbl_record *vtbl)
 {
        int i, reserved_pebs = 0;
-       struct ubi_scan_volume *sv;
+       struct ubi_ainf_volume *av;
        struct ubi_volume *vol;
 
        for (i = 0; i < ubi->vtbl_slots; i++) {
@@ -591,8 +590,8 @@ static int init_volumes(struct ubi_device *ubi, const struct ubi_scan_info *si,
                }
 
                /* Static volumes only */
-               sv = ubi_scan_find_sv(si, i);
-               if (!sv) {
+               av = ubi_find_av(ai, i);
+               if (!av) {
                        /*
                         * No eraseblocks belonging to this volume found. We
                         * don't actually know whether this static volume is
@@ -604,22 +603,22 @@ static int init_volumes(struct ubi_device *ubi, const struct ubi_scan_info *si,
                        continue;
                }
 
-               if (sv->leb_count != sv->used_ebs) {
+               if (av->leb_count != av->used_ebs) {
                        /*
                         * We found a static volume which misses several
                         * eraseblocks. Treat it as corrupted.
                         */
                        ubi_warn("static volume %d misses %d LEBs - corrupted",
-                                sv->vol_id, sv->used_ebs - sv->leb_count);
+                                av->vol_id, av->used_ebs - av->leb_count);
                        vol->corrupted = 1;
                        continue;
                }
 
-               vol->used_ebs = sv->used_ebs;
+               vol->used_ebs = av->used_ebs;
                vol->used_bytes =
                        (long long)(vol->used_ebs - 1) * vol->usable_leb_size;
-               vol->used_bytes += sv->last_data_size;
-               vol->last_eb_bytes = sv->last_data_size;
+               vol->used_bytes += av->last_data_size;
+               vol->last_eb_bytes = av->last_data_size;
        }
 
        /* And add the layout volume */
@@ -660,105 +659,104 @@ static int init_volumes(struct ubi_device *ubi, const struct ubi_scan_info *si,
 }
 
 /**
- * check_sv - check volume scanning information.
+ * check_av - check volume attaching information.
  * @vol: UBI volume description object
- * @sv: volume scanning information
+ * @av: volume attaching information
  *
- * This function returns zero if the volume scanning information is consistent
+ * This function returns zero if the volume attaching information is consistent
  * to the data read from the volume tabla, and %-EINVAL if not.
  */
-static int check_sv(const struct ubi_volume *vol,
-                   const struct ubi_scan_volume *sv)
+static int check_av(const struct ubi_volume *vol,
+                   const struct ubi_ainf_volume *av)
 {
        int err;
 
-       if (sv->highest_lnum >= vol->reserved_pebs) {
+       if (av->highest_lnum >= vol->reserved_pebs) {
                err = 1;
                goto bad;
        }
-       if (sv->leb_count > vol->reserved_pebs) {
+       if (av->leb_count > vol->reserved_pebs) {
                err = 2;
                goto bad;
        }
-       if (sv->vol_type != vol->vol_type) {
+       if (av->vol_type != vol->vol_type) {
                err = 3;
                goto bad;
        }
-       if (sv->used_ebs > vol->reserved_pebs) {
+       if (av->used_ebs > vol->reserved_pebs) {
                err = 4;
                goto bad;
        }
-       if (sv->data_pad != vol->data_pad) {
+       if (av->data_pad != vol->data_pad) {
                err = 5;
                goto bad;
        }
        return 0;
 
 bad:
-       ubi_err("bad scanning information, error %d", err);
-       ubi_dump_sv(sv);
+       ubi_err("bad attaching information, error %d", err);
+       ubi_dump_av(av);
        ubi_dump_vol_info(vol);
        return -EINVAL;
 }
 
 /**
- * check_scanning_info - check that scanning information.
+ * check_attaching_info - check that attaching information.
  * @ubi: UBI device description object
- * @si: scanning information
+ * @ai: attaching information
  *
  * Even though we protect on-flash data by CRC checksums, we still don't trust
- * the media. This function ensures that scanning information is consistent to
- * the information read from the volume table. Returns zero if the scanning
+ * the media. This function ensures that attaching information is consistent to
+ * the information read from the volume table. Returns zero if the attaching
  * information is OK and %-EINVAL if it is not.
  */
-static int check_scanning_info(const struct ubi_device *ubi,
-                              struct ubi_scan_info *si)
+static int check_attaching_info(const struct ubi_device *ubi,
+                              struct ubi_attach_info *ai)
 {
        int err, i;
-       struct ubi_scan_volume *sv;
+       struct ubi_ainf_volume *av;
        struct ubi_volume *vol;
 
-       if (si->vols_found > UBI_INT_VOL_COUNT + ubi->vtbl_slots) {
-               ubi_err("scanning found %d volumes, maximum is %d + %d",
-                       si->vols_found, UBI_INT_VOL_COUNT, ubi->vtbl_slots);
+       if (ai->vols_found > UBI_INT_VOL_COUNT + ubi->vtbl_slots) {
+               ubi_err("found %d volumes while attaching, maximum is %d + %d",
+                       ai->vols_found, UBI_INT_VOL_COUNT, ubi->vtbl_slots);
                return -EINVAL;
        }
 
-       if (si->highest_vol_id >= ubi->vtbl_slots + UBI_INT_VOL_COUNT &&
-           si->highest_vol_id < UBI_INTERNAL_VOL_START) {
-               ubi_err("too large volume ID %d found by scanning",
-                       si->highest_vol_id);
+       if (ai->highest_vol_id >= ubi->vtbl_slots + UBI_INT_VOL_COUNT &&
+           ai->highest_vol_id < UBI_INTERNAL_VOL_START) {
+               ubi_err("too large volume ID %d found", ai->highest_vol_id);
                return -EINVAL;
        }
 
        for (i = 0; i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) {
                cond_resched();
 
-               sv = ubi_scan_find_sv(si, i);
+               av = ubi_find_av(ai, i);
                vol = ubi->volumes[i];
                if (!vol) {
-                       if (sv)
-                               ubi_scan_rm_volume(si, sv);
+                       if (av)
+                               ubi_remove_av(ai, av);
                        continue;
                }
 
                if (vol->reserved_pebs == 0) {
                        ubi_assert(i < ubi->vtbl_slots);
 
-                       if (!sv)
+                       if (!av)
                                continue;
 
                        /*
-                        * During scanning we found a volume which does not
+                        * During attaching we found a volume which does not
                         * exist according to the information in the volume
                         * table. This must have happened due to an unclean
                         * reboot while the volume was being removed. Discard
                         * these eraseblocks.
                         */
-                       ubi_msg("finish volume %d removal", sv->vol_id);
-                       ubi_scan_rm_volume(si, sv);
-               } else if (sv) {
-                       err = check_sv(vol, sv);
+                       ubi_msg("finish volume %d removal", av->vol_id);
+                       ubi_remove_av(ai, av);
+               } else if (av) {
+                       err = check_av(vol, av);
                        if (err)
                                return err;
                }
@@ -770,16 +768,16 @@ static int check_scanning_info(const struct ubi_device *ubi,
 /**
  * ubi_read_volume_table - read the volume table.
  * @ubi: UBI device description object
- * @si: scanning information
+ * @ai: attaching information
  *
  * This function reads volume table, checks it, recover from errors if needed,
  * or creates it if needed. Returns zero in case of success and a negative
  * error code in case of failure.
  */
-int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_scan_info *si)
+int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_attach_info *ai)
 {
        int i, err;
-       struct ubi_scan_volume *sv;
+       struct ubi_ainf_volume *av;
 
        empty_vtbl_record.crc = cpu_to_be32(0xf116c36b);
 
@@ -794,8 +792,8 @@ int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_scan_info *si)
        ubi->vtbl_size = ubi->vtbl_slots * UBI_VTBL_RECORD_SIZE;
        ubi->vtbl_size = ALIGN(ubi->vtbl_size, ubi->min_io_size);
 
-       sv = ubi_scan_find_sv(si, UBI_LAYOUT_VOLUME_ID);
-       if (!sv) {
+       av = ubi_find_av(ai, UBI_LAYOUT_VOLUME_ID);
+       if (!av) {
                /*
                 * No logical eraseblocks belonging to the layout volume were
                 * found. This could mean that the flash is just empty. In
@@ -804,8 +802,8 @@ int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_scan_info *si)
                 * But if flash is not empty this must be a corruption or the
                 * MTD device just contains garbage.
                 */
-               if (si->is_empty) {
-                       ubi->vtbl = create_empty_lvol(ubi, si);
+               if (ai->is_empty) {
+                       ubi->vtbl = create_empty_lvol(ubi, ai);
                        if (IS_ERR(ubi->vtbl))
                                return PTR_ERR(ubi->vtbl);
                } else {
@@ -813,14 +811,14 @@ int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_scan_info *si)
                        return -EINVAL;
                }
        } else {
-               if (sv->leb_count > UBI_LAYOUT_VOLUME_EBS) {
+               if (av->leb_count > UBI_LAYOUT_VOLUME_EBS) {
                        /* This must not happen with proper UBI images */
-                       dbg_err("too many LEBs (%d) in layout volume",
-                               sv->leb_count);
+                       ubi_err("too many LEBs (%d) in layout volume",
+                               av->leb_count);
                        return -EINVAL;
                }
 
-               ubi->vtbl = process_lvol(ubi, si, sv);
+               ubi->vtbl = process_lvol(ubi, ai, av);
                if (IS_ERR(ubi->vtbl))
                        return PTR_ERR(ubi->vtbl);
        }
@@ -831,15 +829,15 @@ int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_scan_info *si)
         * The layout volume is OK, initialize the corresponding in-RAM data
         * structures.
         */
-       err = init_volumes(ubi, si, ubi->vtbl);
+       err = init_volumes(ubi, ai, ubi->vtbl);
        if (err)
                goto out_free;
 
        /*
-        * Make sure that the scanning information is consistent to the
+        * Make sure that the attaching information is consistent to the
         * information stored in the volume table.
         */
-       err = check_scanning_info(ubi, si);
+       err = check_attaching_info(ubi, ai);
        if (err)
                goto out_free;
 
@@ -855,16 +853,16 @@ out_free:
 }
 
 /**
- * paranoid_vtbl_check - check volume table.
+ * self_vtbl_check - check volume table.
  * @ubi: UBI device description object
  */
-static void paranoid_vtbl_check(const struct ubi_device *ubi)
+static void self_vtbl_check(const struct ubi_device *ubi)
 {
        if (!ubi->dbg->chk_gen)
                return;
 
        if (vtbl_check(ubi, ubi->vtbl)) {
-               ubi_err("paranoid check failed");
+               ubi_err("self-check failed");
                BUG();
        }
 }