]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/partitions/check.c
block: restart partition scan after resizing a device
[mv-sheeva.git] / fs / partitions / check.c
index e238ab23a9e7ff50f712847e3660f4f67a5912d2..8f01df354f0428361d4bd18c4eabaf29c1acf48f 100644 (file)
@@ -544,7 +544,7 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
        struct hd_struct *part;
        struct parsed_partitions *state;
        int p, highest, res;
-
+rescan:
        if (bdev->bd_part_count)
                return -EBUSY;
        res = invalidate_partition(disk, 0);
@@ -581,7 +581,7 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
        /* add partitions */
        for (p = 1; p < state->limit; p++) {
                sector_t size, from;
-try_scan:
+
                size = state->parts[p].size;
                if (!size)
                        continue;
@@ -596,7 +596,6 @@ try_scan:
 
                if (from + size > get_capacity(disk)) {
                        const struct block_device_operations *bdops = disk->fops;
-                       unsigned long long capacity;
 
                        printk(KERN_WARNING
                               "%s: p%d size %llu exceeds device capacity, ",
@@ -605,14 +604,11 @@ try_scan:
                        if (bdops->set_capacity &&
                            (disk->flags & GENHD_FL_NATIVE_CAPACITY) == 0) {
                                printk(KERN_CONT "enabling native capacity\n");
-                               capacity = bdops->set_capacity(disk, ~0ULL);
+                               bdops->set_capacity(disk, ~0ULL);
                                disk->flags |= GENHD_FL_NATIVE_CAPACITY;
-                               if (capacity > get_capacity(disk)) {
-                                       set_capacity(disk, capacity);
-                                       check_disk_size_change(disk, bdev);
-                                       bdev->bd_invalidated = 0;
-                               }
-                               goto try_scan;
+                               /* free state and restart */
+                               kfree(state);
+                               goto rescan;
                        } else {
                                /*
                                 * we can not ignore partitions of broken tables