Merge branch 'stable-3.2' into pandora-3.2
[pandora-kernel.git] / drivers / mtd / ubi / build.c
index 6c3fb5a..8be9edb 100644 (file)
  * module load parameters or the kernel boot parameters. If MTD devices were
  * specified, UBI does not attach any MTD device, but it is possible to do
  * later using the "UBI control device".
- *
- * At the moment we only attach UBI devices by scanning, which will become a
- * bottleneck when flashes reach certain large size. Then one may improve UBI
- * and add other methods, although it does not seem to be easy to do.
  */
 
 #include <linux/err.h>
@@ -554,10 +550,10 @@ static void uif_close(struct ubi_device *ubi)
 }
 
 /**
- * free_internal_volumes - free internal volumes.
+ * ubi_free_internal_volumes - free internal volumes.
  * @ubi: UBI device description object
  */
-static void free_internal_volumes(struct ubi_device *ubi)
+void ubi_free_internal_volumes(struct ubi_device *ubi)
 {
        int i;
 
@@ -568,59 +564,6 @@ static void free_internal_volumes(struct ubi_device *ubi)
        }
 }
 
-/**
- * attach_by_scanning - attach an MTD device using scanning method.
- * @ubi: UBI device descriptor
- *
- * This function returns zero in case of success and a negative error code in
- * case of failure.
- *
- * Note, currently this is the only method to attach UBI devices. Hopefully in
- * the future we'll have more scalable attaching methods and avoid full media
- * scanning. But even in this case scanning will be needed as a fall-back
- * attaching method if there are some on-flash table corruptions.
- */
-static int attach_by_scanning(struct ubi_device *ubi)
-{
-       int err;
-       struct ubi_scan_info *si;
-
-       si = ubi_scan(ubi);
-       if (IS_ERR(si))
-               return PTR_ERR(si);
-
-       ubi->bad_peb_count = si->bad_peb_count;
-       ubi->good_peb_count = ubi->peb_count - ubi->bad_peb_count;
-       ubi->corr_peb_count = si->corr_peb_count;
-       ubi->max_ec = si->max_ec;
-       ubi->mean_ec = si->mean_ec;
-       ubi_msg("max. sequence number:       %llu", si->max_sqnum);
-
-       err = ubi_read_volume_table(ubi, si);
-       if (err)
-               goto out_si;
-
-       err = ubi_wl_init_scan(ubi, si);
-       if (err)
-               goto out_vtbl;
-
-       err = ubi_eba_init_scan(ubi, si);
-       if (err)
-               goto out_wl;
-
-       ubi_scan_destroy_si(si);
-       return 0;
-
-out_wl:
-       ubi_wl_close(ubi);
-out_vtbl:
-       free_internal_volumes(ubi);
-       vfree(ubi->vtbl);
-out_si:
-       ubi_scan_destroy_si(si);
-       return err;
-}
-
 /**
  * io_init - initialize I/O sub-system for a given UBI device.
  * @ubi: UBI device description object
@@ -638,6 +581,9 @@ out_si:
  */
 static int io_init(struct ubi_device *ubi)
 {
+       dbg_gen("sizeof(struct ubi_ainf_peb) %zu", sizeof(struct ubi_ainf_peb));
+       dbg_gen("sizeof(struct ubi_wl_entry) %zu", sizeof(struct ubi_wl_entry));
+
        if (ubi->mtd->numeraseregions != 0) {
                /*
                 * Some flashes have several erase regions. Different regions
@@ -707,11 +653,11 @@ static int io_init(struct ubi_device *ubi)
        ubi->ec_hdr_alsize = ALIGN(UBI_EC_HDR_SIZE, ubi->hdrs_min_io_size);
        ubi->vid_hdr_alsize = ALIGN(UBI_VID_HDR_SIZE, ubi->hdrs_min_io_size);
 
-       dbg_msg("min_io_size      %d", ubi->min_io_size);
-       dbg_msg("max_write_size   %d", ubi->max_write_size);
-       dbg_msg("hdrs_min_io_size %d", ubi->hdrs_min_io_size);
-       dbg_msg("ec_hdr_alsize    %d", ubi->ec_hdr_alsize);
-       dbg_msg("vid_hdr_alsize   %d", ubi->vid_hdr_alsize);
+       dbg_gen("min_io_size      %d", ubi->min_io_size);
+       dbg_gen("max_write_size   %d", ubi->max_write_size);
+       dbg_gen("hdrs_min_io_size %d", ubi->hdrs_min_io_size);
+       dbg_gen("ec_hdr_alsize    %d", ubi->ec_hdr_alsize);
+       dbg_gen("vid_hdr_alsize   %d", ubi->vid_hdr_alsize);
 
        if (ubi->vid_hdr_offset == 0)
                /* Default offset */
@@ -728,10 +674,10 @@ static int io_init(struct ubi_device *ubi)
        ubi->leb_start = ubi->vid_hdr_offset + UBI_VID_HDR_SIZE;
        ubi->leb_start = ALIGN(ubi->leb_start, ubi->min_io_size);
 
-       dbg_msg("vid_hdr_offset   %d", ubi->vid_hdr_offset);
-       dbg_msg("vid_hdr_aloffset %d", ubi->vid_hdr_aloffset);
-       dbg_msg("vid_hdr_shift    %d", ubi->vid_hdr_shift);
-       dbg_msg("leb_start        %d", ubi->leb_start);
+       dbg_gen("vid_hdr_offset   %d", ubi->vid_hdr_offset);
+       dbg_gen("vid_hdr_aloffset %d", ubi->vid_hdr_aloffset);
+       dbg_gen("vid_hdr_shift    %d", ubi->vid_hdr_shift);
+       dbg_gen("leb_start        %d", ubi->leb_start);
 
        /* The shift must be aligned to 32-bit boundary */
        if (ubi->vid_hdr_shift % 4) {
@@ -757,7 +703,7 @@ static int io_init(struct ubi_device *ubi)
        ubi->max_erroneous = ubi->peb_count / 10;
        if (ubi->max_erroneous < 16)
                ubi->max_erroneous = 16;
-       dbg_msg("max_erroneous    %d", ubi->max_erroneous);
+       dbg_gen("max_erroneous    %d", ubi->max_erroneous);
 
        /*
         * It may happen that EC and VID headers are situated in one minimal
@@ -765,36 +711,24 @@ static int io_init(struct ubi_device *ubi)
         * read-only mode.
         */
        if (ubi->vid_hdr_offset + UBI_VID_HDR_SIZE <= ubi->hdrs_min_io_size) {
-               ubi_warn("EC and VID headers are in the same minimal I/O unit, "
-                        "switch to read-only mode");
+               ubi_warn("EC and VID headers are in the same minimal I/O unit, switch to read-only mode");
                ubi->ro_mode = 1;
        }
 
        ubi->leb_size = ubi->peb_size - ubi->leb_start;
 
        if (!(ubi->mtd->flags & MTD_WRITEABLE)) {
-               ubi_msg("MTD device %d is write-protected, attach in "
-                       "read-only mode", ubi->mtd->index);
+               ubi_msg("MTD device %d is write-protected, attach in read-only mode",
+                       ubi->mtd->index);
                ubi->ro_mode = 1;
        }
 
-       ubi_msg("physical eraseblock size:   %d bytes (%d KiB)",
-               ubi->peb_size, ubi->peb_size >> 10);
-       ubi_msg("logical eraseblock size:    %d bytes", ubi->leb_size);
-       ubi_msg("smallest flash I/O unit:    %d", ubi->min_io_size);
-       if (ubi->hdrs_min_io_size != ubi->min_io_size)
-               ubi_msg("sub-page size:              %d",
-                       ubi->hdrs_min_io_size);
-       ubi_msg("VID header offset:          %d (aligned %d)",
-               ubi->vid_hdr_offset, ubi->vid_hdr_aloffset);
-       ubi_msg("data offset:                %d", ubi->leb_start);
-
        /*
-        * Note, ideally, we have to initialize ubi->bad_peb_count here. But
+        * Note, ideally, we have to initialize @ubi->bad_peb_count here. But
         * unfortunately, MTD does not provide this information. We should loop
         * over all physical eraseblocks and invoke mtd->block_is_bad() for
-        * each physical eraseblock. So, we skip ubi->bad_peb_count
-        * uninitialized and initialize it after scanning.
+        * each physical eraseblock. So, we leave @ubi->bad_peb_count
+        * uninitialized so far.
         */
 
        return 0;
@@ -805,7 +739,7 @@ static int io_init(struct ubi_device *ubi)
  * @ubi: UBI device description object
  * @vol_id: ID of the volume to re-size
  *
- * This function re-sizes the volume marked by the @UBI_VTBL_AUTORESIZE_FLG in
+ * This function re-sizes the volume marked by the %UBI_VTBL_AUTORESIZE_FLG in
  * the volume table to the largest possible size. See comments in ubi-header.h
  * for more description of the flag. Returns zero in case of success and a
  * negative error code in case of failure.
@@ -816,6 +750,11 @@ static int autoresize(struct ubi_device *ubi, int vol_id)
        struct ubi_volume *vol = ubi->volumes[vol_id];
        int err, old_reserved_pebs = vol->reserved_pebs;
 
+       if (ubi->ro_mode) {
+               ubi_warn("skip auto-resize because of R/O mode");
+               return 0;
+       }
+
        /*
         * Clear the auto-resize flag in the volume in-memory copy of the
         * volume table, and 'ubi_resize_volume()' will propagate this change
@@ -881,7 +820,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
        for (i = 0; i < UBI_MAX_DEVICES; i++) {
                ubi = ubi_devices[i];
                if (ubi && mtd->index == ubi->mtd->index) {
-                       dbg_err("mtd%d is already attached to ubi%d",
+                       ubi_err("mtd%d is already attached to ubi%d",
                                mtd->index, i);
                        return -EEXIST;
                }
@@ -896,8 +835,8 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
         * no sense to attach emulated MTD devices, so we prohibit this.
         */
        if (mtd->type == MTD_UBIVOLUME) {
-               ubi_err("refuse attaching mtd%d - it is already emulated on "
-                       "top of UBI", mtd->index);
+               ubi_err("refuse attaching mtd%d - it is already emulated on top of UBI",
+                       mtd->index);
                return -EINVAL;
        }
 
@@ -907,7 +846,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
                        if (!ubi_devices[ubi_num])
                                break;
                if (ubi_num == UBI_MAX_DEVICES) {
-                       dbg_err("only %d UBI devices may be created",
+                       ubi_err("only %d UBI devices may be created",
                                UBI_MAX_DEVICES);
                        return -ENFILE;
                }
@@ -917,7 +856,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
 
                /* Make sure ubi_num is not busy */
                if (ubi_devices[ubi_num]) {
-                       dbg_err("ubi%d already exists", ubi_num);
+                       ubi_err("ubi%d already exists", ubi_num);
                        return -EEXIST;
                }
        }
@@ -937,29 +876,23 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
        spin_lock_init(&ubi->volumes_lock);
 
        ubi_msg("attaching mtd%d to ubi%d", mtd->index, ubi_num);
-       dbg_msg("sizeof(struct ubi_scan_leb) %zu", sizeof(struct ubi_scan_leb));
-       dbg_msg("sizeof(struct ubi_wl_entry) %zu", sizeof(struct ubi_wl_entry));
 
        err = io_init(ubi);
        if (err)
                goto out_free;
 
        err = -ENOMEM;
-       ubi->peb_buf1 = vmalloc(ubi->peb_size);
-       if (!ubi->peb_buf1)
-               goto out_free;
-
-       ubi->peb_buf2 = vmalloc(ubi->peb_size);
-       if (!ubi->peb_buf2)
+       ubi->peb_buf = vmalloc(ubi->peb_size);
+       if (!ubi->peb_buf)
                goto out_free;
 
        err = ubi_debugging_init_dev(ubi);
        if (err)
                goto out_free;
 
-       err = attach_by_scanning(ubi);
+       err = ubi_attach(ubi);
        if (err) {
-               dbg_err("failed to attach by scanning, error %d", err);
+               ubi_err("failed to attach mtd%d, error %d", mtd->index, err);
                goto out_debugging;
        }
 
@@ -985,23 +918,24 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
                goto out_debugfs;
        }
 
-       ubi_msg("attached mtd%d to ubi%d", mtd->index, ubi_num);
-       ubi_msg("MTD device name:            \"%s\"", mtd->name);
-       ubi_msg("MTD device size:            %llu MiB", ubi->flash_size >> 20);
-       ubi_msg("number of good PEBs:        %d", ubi->good_peb_count);
-       ubi_msg("number of bad PEBs:         %d", ubi->bad_peb_count);
-       ubi_msg("number of corrupted PEBs:   %d", ubi->corr_peb_count);
-       ubi_msg("max. allowed volumes:       %d", ubi->vtbl_slots);
-       ubi_msg("wear-leveling threshold:    %d", CONFIG_MTD_UBI_WL_THRESHOLD);
-       ubi_msg("number of internal volumes: %d", UBI_INT_VOL_COUNT);
-       ubi_msg("number of user volumes:     %d",
-               ubi->vol_count - UBI_INT_VOL_COUNT);
-       ubi_msg("available PEBs:             %d", ubi->avail_pebs);
-       ubi_msg("total number of reserved PEBs: %d", ubi->rsvd_pebs);
-       ubi_msg("number of PEBs reserved for bad PEB handling: %d",
-               ubi->beb_rsvd_pebs);
-       ubi_msg("max/mean erase counter: %d/%d", ubi->max_ec, ubi->mean_ec);
-       ubi_msg("image sequence number:  %d", ubi->image_seq);
+       ubi_msg("attached mtd%d (name \"%s\", size %llu MiB) to ubi%d",
+               mtd->index, mtd->name, ubi->flash_size >> 20, ubi_num);
+       ubi_msg("PEB size: %d bytes (%d KiB), LEB size: %d bytes",
+               ubi->peb_size, ubi->peb_size >> 10, ubi->leb_size);
+       ubi_msg("min./max. I/O unit sizes: %d/%d, sub-page size %d",
+               ubi->min_io_size, ubi->max_write_size, ubi->hdrs_min_io_size);
+       ubi_msg("VID header offset: %d (aligned %d), data offset: %d",
+               ubi->vid_hdr_offset, ubi->vid_hdr_aloffset, ubi->leb_start);
+       ubi_msg("good PEBs: %d, bad PEBs: %d, corrupted PEBs: %d",
+               ubi->good_peb_count, ubi->bad_peb_count, ubi->corr_peb_count);
+       ubi_msg("user volume: %d, internal volumes: %d, max. volumes count: %d",
+               ubi->vol_count - UBI_INT_VOL_COUNT, UBI_INT_VOL_COUNT,
+               ubi->vtbl_slots);
+       ubi_msg("max/mean erase counter: %d/%d, WL threshold: %d, image sequence number: %u",
+               ubi->max_ec, ubi->mean_ec, CONFIG_MTD_UBI_WL_THRESHOLD,
+               ubi->image_seq);
+       ubi_msg("available PEBs: %d, total reserved PEBs: %d, PEBs reserved for bad PEB handling: %d",
+               ubi->avail_pebs, ubi->rsvd_pebs, ubi->beb_rsvd_pebs);
 
        /*
         * The below lock makes sure we do not race with 'ubi_thread()' which
@@ -1024,13 +958,12 @@ out_uif:
        uif_close(ubi);
 out_detach:
        ubi_wl_close(ubi);
-       free_internal_volumes(ubi);
+       ubi_free_internal_volumes(ubi);
        vfree(ubi->vtbl);
 out_debugging:
        ubi_debugging_exit_dev(ubi);
 out_free:
-       vfree(ubi->peb_buf1);
-       vfree(ubi->peb_buf2);
+       vfree(ubi->peb_buf);
        if (ref)
                put_device(&ubi->dev);
        else
@@ -1079,7 +1012,7 @@ int ubi_detach_mtd_dev(int ubi_num, int anyway)
 
        ubi_assert(ubi_num == ubi->ubi_num);
        ubi_notify_all(ubi, UBI_VOLUME_REMOVED, NULL);
-       dbg_msg("detaching mtd%d from ubi%d", ubi->mtd->index, ubi_num);
+       ubi_msg("detaching mtd%d from ubi%d", ubi->mtd->index, ubi_num);
 
        /*
         * Before freeing anything, we have to stop the background thread to
@@ -1097,12 +1030,11 @@ int ubi_detach_mtd_dev(int ubi_num, int anyway)
        ubi_debugfs_exit_dev(ubi);
        uif_close(ubi);
        ubi_wl_close(ubi);
-       free_internal_volumes(ubi);
+       ubi_free_internal_volumes(ubi);
        vfree(ubi->vtbl);
        put_mtd_device(ubi->mtd);
        ubi_debugging_exit_dev(ubi);
-       vfree(ubi->peb_buf1);
-       vfree(ubi->peb_buf2);
+       vfree(ubi->peb_buf);
        ubi_msg("mtd%d is detached from ubi%d", ubi->mtd->index, ubi->ubi_num);
        put_device(&ubi->dev);
        return 0;
@@ -1315,8 +1247,7 @@ static int __init bytes_str_to_int(const char *str)
 
        result = simple_strtoul(str, &endp, 0);
        if (str == endp || result >= INT_MAX) {
-               printk(KERN_ERR "UBI error: incorrect bytes count: \"%s\"\n",
-                      str);
+               ubi_err("UBI error: incorrect bytes count: \"%s\"\n", str);
                return -EINVAL;
        }
 
@@ -1332,8 +1263,7 @@ static int __init bytes_str_to_int(const char *str)
        case '\0':
                break;
        default:
-               printk(KERN_ERR "UBI error: incorrect bytes count: \"%s\"\n",
-                      str);
+               ubi_err("UBI error: incorrect bytes count: \"%s\"\n", str);
                return -EINVAL;
        }
 
@@ -1360,21 +1290,20 @@ static int __init ubi_mtd_param_parse(const char *val, struct kernel_param *kp)
                return -EINVAL;
 
        if (mtd_devs == UBI_MAX_DEVICES) {
-               printk(KERN_ERR "UBI error: too many parameters, max. is %d\n",
-                      UBI_MAX_DEVICES);
+               ubi_err("UBI error: too many parameters, max. is %d\n",
+                       UBI_MAX_DEVICES);
                return -EINVAL;
        }
 
        len = strnlen(val, MTD_PARAM_LEN_MAX);
        if (len == MTD_PARAM_LEN_MAX) {
-               printk(KERN_ERR "UBI error: parameter \"%s\" is too long, "
-                      "max. is %d\n", val, MTD_PARAM_LEN_MAX);
+               ubi_err("UBI error: parameter \"%s\" is too long, max. is %d\n",
+                       val, MTD_PARAM_LEN_MAX);
                return -EINVAL;
        }
 
        if (len == 0) {
-               printk(KERN_WARNING "UBI warning: empty 'mtd=' parameter - "
-                      "ignored\n");
+               pr_warn("UBI warning: empty 'mtd=' parameter - ignored\n");
                return 0;
        }
 
@@ -1388,8 +1317,7 @@ static int __init ubi_mtd_param_parse(const char *val, struct kernel_param *kp)
                tokens[i] = strsep(&pbuf, ",");
 
        if (pbuf) {
-               printk(KERN_ERR "UBI error: too many arguments at \"%s\"\n",
-                      val);
+               ubi_err("UBI error: too many arguments at \"%s\"\n", val);
                return -EINVAL;
        }