]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
Merge tag 'block-5.13-2021-05-22' of git://git.kernel.dk/linux-block
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 22 May 2021 17:40:34 +0000 (07:40 -1000)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 22 May 2021 17:40:34 +0000 (07:40 -1000)
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()

1  2 
fs/block_dev.c

diff --combined fs/block_dev.c
index b8abccd03e5d55efd2abf8392420fdf1856c3479,4494411fa4d3ef0f8bd1a826f60f866b101204ca..6cc4d4cfe0c286dd3268969e834b59e2e9a284d7
@@@ -79,7 -79,7 +79,7 @@@ static void kill_bdev(struct block_devi
  {
        struct address_space *mapping = bdev->bd_inode->i_mapping;
  
 -      if (mapping->nrpages == 0 && mapping->nrexceptional == 0)
 +      if (mapping_empty(mapping))
                return;
  
        invalidate_bh_lrus();
@@@ -1244,6 -1244,9 +1244,9 @@@ int bdev_disk_changed(struct block_devi
  
        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 +1301,9 @@@ static int __blkdev_get(struct block_de
        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;
                        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 +1369,12 @@@ struct block_device *blkdev_get_no_open
        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;
                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;
  }