block-5.13-2021-05-22
-----BEGIN PGP SIGNATURE----- iQJEBAABCAAuFiEEwPw5LcreJtl1+l5K99NY+ylx4KYFAmCpPO4QHGF4Ym9lQGtl cm5lbC5kawAKCRD301j7KXHgpgI0EACitV5OwfX+saZdQEj3LF4dAo7uZkMV0cZK GJ3m1NWsMDXJJofcczyVTEs0iNT4fpb1dKE9cyOVjAFDoH8Dn7C+UZ163QWu+SCk WGgyiY+Qdwr7cyl6+2+WQkLBeLcyuFVjGtYHTxYWY2O+DpyhRw94Oiih1bfnI/6i KZTpaA3z+pZs/KFIE7eUnkI/iWC39VShZ1T8/gXO9vmIhUkA67j1o9i3LYpGYnXx Awza8Lpql7s3tfWcDL6FNHQmFPUjiowCSUNupzdnHgjggWwUCosJTTcL+mfdTHOJ YuYM3qRuzTbIeXXy/5JTZUt5AOkS8SCre7BpclSDrhZBiL/dkvAndN43ce/6vc7i FrgvnbY/Ik2PWQwcbxiXZzcEKxT9dzXbsyJG08ePZwQ5s+8M5KVZv+ElrV+T7/nJ DYjnWahQ674tHv2Z7Bp4hAjnchwiypxqie8OnOKBI+WseT2D8Pjs2sinUHSYKYDk 3m2e0BVsw+FAYt3bcdhocDQnrJwMNrhSuA9Rtyh6qeMG34yxOXJmZvrHNrbg2fG/ a/xgVewn/P4sDxGCwS3XH/zILYgvJAwTFWIfDeRXE4epqsPZ9h8FBq3Fzl5asL7V yl9iQlWuE1+Ks8IQMjunbJfQSTEghPCjJWHVQQVJm+rT33qI80Ac4a0vdd99TaXh 8P58LE+0jg== =ADzj -----END PGP SIGNATURE----- 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:
commit
4ff2473bdb
|
@ -29,8 +29,6 @@
|
|||
|
||||
static struct kobject *block_depr;
|
||||
|
||||
DECLARE_RWSEM(bdev_lookup_sem);
|
||||
|
||||
/* for extended dynamic devt allocation, currently only one major is used */
|
||||
#define NR_EXT_DEVT (1 << MINORBITS)
|
||||
static DEFINE_IDA(ext_devt_ida);
|
||||
|
@ -609,13 +607,8 @@ void del_gendisk(struct gendisk *disk)
|
|||
blk_integrity_del(disk);
|
||||
disk_del_events(disk);
|
||||
|
||||
/*
|
||||
* Block lookups of the disk until all bdevs are unhashed and the
|
||||
* disk is marked as dead (GENHD_FL_UP cleared).
|
||||
*/
|
||||
down_write(&bdev_lookup_sem);
|
||||
|
||||
mutex_lock(&disk->part0->bd_mutex);
|
||||
disk->flags &= ~GENHD_FL_UP;
|
||||
blk_drop_partitions(disk);
|
||||
mutex_unlock(&disk->part0->bd_mutex);
|
||||
|
||||
|
@ -629,8 +622,6 @@ void del_gendisk(struct gendisk *disk)
|
|||
remove_inode_hash(disk->part0->bd_inode);
|
||||
|
||||
set_capacity(disk, 0);
|
||||
disk->flags &= ~GENHD_FL_UP;
|
||||
up_write(&bdev_lookup_sem);
|
||||
|
||||
if (!(disk->flags & GENHD_FL_HIDDEN)) {
|
||||
sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
|
||||
|
|
|
@ -2461,6 +2461,18 @@ nvme_fc_terminate_exchange(struct request *req, void *data, bool reserved)
|
|||
static void
|
||||
__nvme_fc_abort_outstanding_ios(struct nvme_fc_ctrl *ctrl, bool start_queues)
|
||||
{
|
||||
int q;
|
||||
|
||||
/*
|
||||
* if aborting io, the queues are no longer good, mark them
|
||||
* all as not live.
|
||||
*/
|
||||
if (ctrl->ctrl.queue_count > 1) {
|
||||
for (q = 1; q < ctrl->ctrl.queue_count; q++)
|
||||
clear_bit(NVME_FC_Q_LIVE, &ctrl->queues[q].flags);
|
||||
}
|
||||
clear_bit(NVME_FC_Q_LIVE, &ctrl->queues[0].flags);
|
||||
|
||||
/*
|
||||
* If io queues are present, stop them and terminate all outstanding
|
||||
* ios on them. As FC allocates FC exchange for each io, the
|
||||
|
|
|
@ -943,7 +943,6 @@ static int nvme_tcp_try_send_data(struct nvme_tcp_request *req)
|
|||
if (ret <= 0)
|
||||
return ret;
|
||||
|
||||
nvme_tcp_advance_req(req, ret);
|
||||
if (queue->data_digest)
|
||||
nvme_tcp_ddgst_update(queue->snd_hash, page,
|
||||
offset, ret);
|
||||
|
@ -960,6 +959,7 @@ static int nvme_tcp_try_send_data(struct nvme_tcp_request *req)
|
|||
}
|
||||
return 1;
|
||||
}
|
||||
nvme_tcp_advance_req(req, ret);
|
||||
}
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
@ -1140,7 +1140,8 @@ static void nvme_tcp_io_work(struct work_struct *w)
|
|||
pending = true;
|
||||
else if (unlikely(result < 0))
|
||||
break;
|
||||
}
|
||||
} else
|
||||
pending = !llist_empty(&queue->req_list);
|
||||
|
||||
result = nvme_tcp_try_recv(queue);
|
||||
if (result > 0)
|
||||
|
|
|
@ -1372,7 +1372,7 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn,
|
|||
goto out_free_changed_ns_list;
|
||||
|
||||
if (subsys->cntlid_min > subsys->cntlid_max)
|
||||
goto out_free_changed_ns_list;
|
||||
goto out_free_sqs;
|
||||
|
||||
ret = ida_simple_get(&cntlid_ida,
|
||||
subsys->cntlid_min, subsys->cntlid_max,
|
||||
|
|
|
@ -590,8 +590,10 @@ static struct nvme_ctrl *nvme_loop_create_ctrl(struct device *dev,
|
|||
|
||||
ret = nvme_init_ctrl(&ctrl->ctrl, dev, &nvme_loop_ctrl_ops,
|
||||
0 /* no quirks, we're perfect! */);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
kfree(ctrl);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_CONNECTING))
|
||||
WARN_ON_ONCE(1);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -306,8 +306,6 @@ static inline void bd_unlink_disk_holder(struct block_device *bdev,
|
|||
}
|
||||
#endif /* CONFIG_SYSFS */
|
||||
|
||||
extern struct rw_semaphore bdev_lookup_sem;
|
||||
|
||||
dev_t blk_lookup_devt(const char *name, int partno);
|
||||
void blk_request_module(dev_t devt);
|
||||
#ifdef CONFIG_BLOCK
|
||||
|
|
Loading…
Reference in New Issue