Merge tag 'block-5.13-2021-05-22' of git://git.kernel.dk/linux-block
Pull block fixes from Jens Axboe:
- Fix BLKRRPART and deletion race (Gulam, Christoph)
- NVMe pull request (Christoph):
- nvme-tcp corruption and timeout fixes (Sagi Grimberg, Keith
Busch)
- nvme-fc teardown fix (James Smart)
- nvmet/nvme-loop memory leak fixes (Wu Bo)"
* tag 'block-5.13-2021-05-22' of git://git.kernel.dk/linux-block:
block: fix a race between del_gendisk and BLKRRPART
block: prevent block device lookups at the beginning of del_gendisk
nvme-fc: clear q_live at beginning of association teardown
nvme-tcp: rerun io_work if req_list is not empty
nvme-tcp: fix possible use-after-completion
nvme-loop: fix memory leak in nvme_loop_create_ctrl()
nvmet: fix memory leak in nvmet_alloc_ctrl()
This commit is contained in:
@@ -1244,6 +1244,9 @@ int bdev_disk_changed(struct block_device *bdev, bool invalidate)
|
||||
|
||||
lockdep_assert_held(&bdev->bd_mutex);
|
||||
|
||||
if (!(disk->flags & GENHD_FL_UP))
|
||||
return -ENXIO;
|
||||
|
||||
rescan:
|
||||
if (bdev->bd_part_count)
|
||||
return -EBUSY;
|
||||
@@ -1298,6 +1301,9 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode)
|
||||
struct gendisk *disk = bdev->bd_disk;
|
||||
int ret = 0;
|
||||
|
||||
if (!(disk->flags & GENHD_FL_UP))
|
||||
return -ENXIO;
|
||||
|
||||
if (!bdev->bd_openers) {
|
||||
if (!bdev_is_partition(bdev)) {
|
||||
ret = 0;
|
||||
@@ -1332,8 +1338,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode)
|
||||
whole->bd_part_count++;
|
||||
mutex_unlock(&whole->bd_mutex);
|
||||
|
||||
if (!(disk->flags & GENHD_FL_UP) ||
|
||||
!bdev_nr_sectors(bdev)) {
|
||||
if (!bdev_nr_sectors(bdev)) {
|
||||
__blkdev_put(whole, mode, 1);
|
||||
bdput(whole);
|
||||
return -ENXIO;
|
||||
@@ -1364,16 +1369,12 @@ struct block_device *blkdev_get_no_open(dev_t dev)
|
||||
struct block_device *bdev;
|
||||
struct gendisk *disk;
|
||||
|
||||
down_read(&bdev_lookup_sem);
|
||||
bdev = bdget(dev);
|
||||
if (!bdev) {
|
||||
up_read(&bdev_lookup_sem);
|
||||
blk_request_module(dev);
|
||||
down_read(&bdev_lookup_sem);
|
||||
|
||||
bdev = bdget(dev);
|
||||
if (!bdev)
|
||||
goto unlock;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
disk = bdev->bd_disk;
|
||||
@@ -1383,14 +1384,11 @@ struct block_device *blkdev_get_no_open(dev_t dev)
|
||||
goto put_disk;
|
||||
if (!try_module_get(bdev->bd_disk->fops->owner))
|
||||
goto put_disk;
|
||||
up_read(&bdev_lookup_sem);
|
||||
return bdev;
|
||||
put_disk:
|
||||
put_disk(disk);
|
||||
bdput:
|
||||
bdput(bdev);
|
||||
unlock:
|
||||
up_read(&bdev_lookup_sem);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user