summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/partitions/check.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/fs/partitions/check.c b/fs/partitions/check.c
index e238ab23a9e7..8f01df354f04 100644
--- a/fs/partitions/check.c
+++ b/fs/partitions/check.c
@@ -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