Skip to content

Commit

Permalink
block: merge invalidate_partitions into rescan_partitions
Browse files Browse the repository at this point in the history
A lot of the logic in invalidate_partitions and rescan_partitions is
shared.  Merge the two functions to simplify things.  There is a small
behavior change in that we now send the kevent change notice also if we
were not invalidating but no partitions were found, which seems like
the right thing to do.

Signed-off-by: Christoph Hellwig <[email protected]>
Reviewed-by: Jan Kara <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
Christoph Hellwig authored and axboe committed Nov 14, 2019
1 parent f902b02 commit 6917d06
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 31 deletions.
2 changes: 1 addition & 1 deletion block/ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ int __blkdev_reread_part(struct block_device *bdev)

lockdep_assert_held(&bdev->bd_mutex);

return rescan_partitions(disk, bdev);
return rescan_partitions(disk, bdev, false);
}
EXPORT_SYMBOL(__blkdev_reread_part);

Expand Down
38 changes: 14 additions & 24 deletions block/partition-generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -576,7 +576,8 @@ static int blk_add_partitions(struct gendisk *disk, struct block_device *bdev)
return ret;
}

int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
int rescan_partitions(struct gendisk *disk, struct block_device *bdev,
bool invalidate)
{
int ret;

Expand All @@ -585,40 +586,29 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
if (ret)
return ret;

if (disk->fops->revalidate_disk)
if (invalidate)
set_capacity(disk, 0);
else if (disk->fops->revalidate_disk)
disk->fops->revalidate_disk(disk);
check_disk_size_change(disk, bdev, true);

check_disk_size_change(disk, bdev, !invalidate);
bdev->bd_invalidated = 0;

if (!get_capacity(disk))
if (!get_capacity(disk)) {
/*
* Tell userspace that the media / partition table may have
* changed.
*/
kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);
return 0;
}

ret = blk_add_partitions(disk, bdev);
if (ret == -EAGAIN)
goto rescan;
return ret;
}

int invalidate_partitions(struct gendisk *disk, struct block_device *bdev)
{
int res;

if (!bdev->bd_invalidated)
return 0;

res = drop_partitions(disk, bdev);
if (res)
return res;

set_capacity(disk, 0);
check_disk_size_change(disk, bdev, false);
bdev->bd_invalidated = 0;
/* tell userspace that the media / partition table may have changed */
kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);

return 0;
}

unsigned char *read_dev_sector(struct block_device *bdev, sector_t n, Sector *p)
{
struct address_space *mapping = bdev->bd_inode->i_mapping;
Expand Down
5 changes: 1 addition & 4 deletions fs/block_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1511,10 +1511,7 @@ static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part);
static void bdev_disk_changed(struct block_device *bdev, bool invalidate)
{
if (disk_part_scan_enabled(bdev->bd_disk)) {
if (invalidate)
invalidate_partitions(bdev->bd_disk, bdev);
else
rescan_partitions(bdev->bd_disk, bdev);
rescan_partitions(bdev->bd_disk, bdev, invalidate);
} else {
check_disk_size_change(bdev->bd_disk, bdev, !invalidate);
bdev->bd_invalidated = 0;
Expand Down
4 changes: 2 additions & 2 deletions include/linux/genhd.h
Original file line number Diff line number Diff line change
Expand Up @@ -622,8 +622,8 @@ extern dev_t blk_lookup_devt(const char *name, int partno);
extern char *disk_name (struct gendisk *hd, int partno, char *buf);

extern int disk_expand_part_tbl(struct gendisk *disk, int target);
extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev);
extern int invalidate_partitions(struct gendisk *disk, struct block_device *bdev);
int rescan_partitions(struct gendisk *disk, struct block_device *bdev,
bool invalidate);
extern struct hd_struct * __must_check add_partition(struct gendisk *disk,
int partno, sector_t start,
sector_t len, int flags,
Expand Down

0 comments on commit 6917d06

Please sign in to comment.