UBI: Fastmap: Calc fastmap size correctly
[sfrench/cifs-2.6.git] / drivers / mtd / ubi / block.c
index 33c64955d4d7b3e4bd1d9fc09b08b42b1113db34..8876c7d3d712fe267cbd96239cfd0cbc12e20056 100644 (file)
@@ -188,8 +188,9 @@ static int ubiblock_read_to_buf(struct ubiblock *dev, char *buffer,
 
        ret = ubi_read(dev->desc, leb, buffer, offset, len);
        if (ret) {
-               ubi_err("%s ubi_read error %d",
-                       dev->gd->disk_name, ret);
+               ubi_err("%s: error %d while reading from LEB %d (offset %d, "
+                       "length %d)", dev->gd->disk_name, ret, leb, offset,
+                       len);
                return ret;
        }
        return 0;
@@ -378,7 +379,7 @@ int ubiblock_create(struct ubi_volume_info *vi)
 {
        struct ubiblock *dev;
        struct gendisk *gd;
-       u64 disk_capacity = ((u64)vi->size * vi->usable_leb_size) >> 9;
+       u64 disk_capacity = vi->used_bytes >> 9;
        int ret;
 
        if ((sector_t)disk_capacity != disk_capacity)
@@ -502,13 +503,8 @@ int ubiblock_remove(struct ubi_volume_info *vi)
 static int ubiblock_resize(struct ubi_volume_info *vi)
 {
        struct ubiblock *dev;
-       u64 disk_capacity = ((u64)vi->size * vi->usable_leb_size) >> 9;
+       u64 disk_capacity = vi->used_bytes >> 9;
 
-       if ((sector_t)disk_capacity != disk_capacity) {
-               ubi_warn("%s: the volume is too big, cannot resize (%d LEBs)",
-                        dev->gd->disk_name, vi->size);
-               return -EFBIG;
-       }
        /*
         * Need to lock the device list until we stop using the device,
         * otherwise the device struct might get released in
@@ -520,10 +516,20 @@ static int ubiblock_resize(struct ubi_volume_info *vi)
                mutex_unlock(&devices_mutex);
                return -ENODEV;
        }
+       if ((sector_t)disk_capacity != disk_capacity) {
+               mutex_unlock(&devices_mutex);
+               ubi_warn("%s: the volume is too big (%d LEBs), cannot resize",
+                        dev->gd->disk_name, vi->size);
+               return -EFBIG;
+       }
 
        mutex_lock(&dev->dev_mutex);
-       set_capacity(dev->gd, disk_capacity);
-       ubi_msg("%s resized to %d LEBs", dev->gd->disk_name, vi->size);
+
+       if (get_capacity(dev->gd) != disk_capacity) {
+               set_capacity(dev->gd, disk_capacity);
+               ubi_msg("%s resized to %lld bytes", dev->gd->disk_name,
+                       vi->used_bytes);
+       }
        mutex_unlock(&dev->dev_mutex);
        mutex_unlock(&devices_mutex);
        return 0;
@@ -547,6 +553,14 @@ static int ubiblock_notify(struct notifier_block *nb,
        case UBI_VOLUME_RESIZED:
                ubiblock_resize(&nt->vi);
                break;
+       case UBI_VOLUME_UPDATED:
+               /*
+                * If the volume is static, a content update might mean the
+                * size (i.e. used_bytes) was also changed.
+                */
+               if (nt->vi.vol_type == UBI_STATIC_VOLUME)
+                       ubiblock_resize(&nt->vi);
+               break;
        default:
                break;
        }