71 lines
2.3 KiB
Diff
71 lines
2.3 KiB
Diff
From 866c02ef409514de12a6e136614e9c8db5d36c06 Mon Sep 17 00:00:00 2001
|
|
From: Tejun Heo <tj@kernel.org>
|
|
Date: Sat, 15 May 2010 19:55:31 +0200
|
|
Subject: [PATCH 2/8] block: restart partition scan after resizing a device
|
|
|
|
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>
|
|
---
|
|
fs/partitions/check.c | 16 ++++++----------
|
|
1 files changed, 6 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/fs/partitions/check.c b/fs/partitions/check.c
|
|
index e238ab2..8f01df3 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
|
|
--
|
|
1.7.1
|
|
|