Skip to content

Commit

Permalink
block: restart partition scan after resizing a device
Browse files Browse the repository at this point in the history
Device resize via ->set_capacity() can reveal new partitions (e.g. in
chained partition table formats such as dos extended parts).  Restart
partition scan from the beginning after resizing a device.  This
change also makes libata always revalidate the disk after resize which
makes lower layer native capacity unlocking implementation simpler and
more robust as resize can be handled in the usual path.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Ben Hutchings <ben@decadent.org.uk>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
  • Loading branch information
Tejun Heo authored and Jens Axboe committed May 21, 2010
1 parent fa4b907 commit 56bca01
Showing 1 changed file with 6 additions and 10 deletions.
16 changes: 6 additions & 10 deletions fs/partitions/check.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand All @@ -596,7 +596,6 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev)

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, ",
Expand All @@ -605,14 +604,11 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
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
Expand Down

0 comments on commit 56bca01

Please sign in to comment.