Skip to content

Commit 17d084c

Browse files
committed
Merge branch 'for-linus' of git://git.kernel.dk/linux-block
Pull block fixes from Jens Axboe: "A collection of fixes for this series. This contains: - NVMe pull request from Christoph, one uuid attribute fix, and one fix for the controller memory buffer address for remapped BARs. - use-after-free fix for bsg, from Benjamin Block. - bcache race/use-after-free fix for a list traversal, fixing a regression in this merge window. From Coly Li. - null_blk change configfs dependency change from a 'depends' to a 'select'. This is a change from this merge window as well. From me. - nbd signal fix from Josef, fixing a regression introduced with the status code changes. - nbd MAINTAINERS mailing list entry update. - blk-throttle stall fix from Joseph Qi. - blk-mq-debugfs fix from Omar, fixing an issue where we don't register the IO scheduler debugfs directory, if the driver is loaded with it. Only shows up if you switch through the sysfs interface" * 'for-linus' of git://git.kernel.dk/linux-block: bsg-lib: fix use-after-free under memory-pressure nvme-pci: Use PCI bus address for data/queues in CMB blk-mq-debugfs: fix device sched directory for default scheduler null_blk: change configfs dependency to select blk-throttle: fix possible io stall when upgrade to max MAINTAINERS: update list for NBD nbd: fix -ERESTARTSYS handling nvme: fix visibility of "uuid" ns attribute bcache: use llist_for_each_entry_safe() in __closure_wake_up()
2 parents 80cf1f8 + d7b544d commit 17d084c

File tree

9 files changed

+45
-22
lines changed

9 files changed

+45
-22
lines changed

MAINTAINERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9360,7 +9360,7 @@ NETWORK BLOCK DEVICE (NBD)
93609360
M: Josef Bacik <[email protected]>
93619361
S: Maintained
93629362
9363-
9363+
L: nbd@other.debian.org
93649364
F: Documentation/blockdev/nbd.txt
93659365
F: drivers/block/nbd.c
93669366
F: include/uapi/linux/nbd.h

block/blk-mq-debugfs.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,10 +815,14 @@ int blk_mq_debugfs_register(struct request_queue *q)
815815
goto err;
816816

817817
/*
818-
* blk_mq_init_hctx() attempted to do this already, but q->debugfs_dir
818+
* blk_mq_init_sched() attempted to do this already, but q->debugfs_dir
819819
* didn't exist yet (because we don't know what to name the directory
820820
* until the queue is registered to a gendisk).
821821
*/
822+
if (q->elevator && !q->sched_debugfs_dir)
823+
blk_mq_debugfs_register_sched(q);
824+
825+
/* Similarly, blk_mq_init_hctx() couldn't do this previously. */
822826
queue_for_each_hw_ctx(q, hctx, i) {
823827
if (!hctx->debugfs_dir && blk_mq_debugfs_register_hctx(q, hctx))
824828
goto err;

block/blk-throttle.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,11 +1911,11 @@ static void throtl_upgrade_state(struct throtl_data *td)
19111911

19121912
tg->disptime = jiffies - 1;
19131913
throtl_select_dispatch(sq);
1914-
throtl_schedule_next_dispatch(sq, false);
1914+
throtl_schedule_next_dispatch(sq, true);
19151915
}
19161916
rcu_read_unlock();
19171917
throtl_select_dispatch(&td->service_queue);
1918-
throtl_schedule_next_dispatch(&td->service_queue, false);
1918+
throtl_schedule_next_dispatch(&td->service_queue, true);
19191919
queue_work(kthrotld_workqueue, &td->dispatch_work);
19201920
}
19211921

block/bsg-lib.c

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -207,20 +207,34 @@ static int bsg_init_rq(struct request_queue *q, struct request *req, gfp_t gfp)
207207
struct bsg_job *job = blk_mq_rq_to_pdu(req);
208208
struct scsi_request *sreq = &job->sreq;
209209

210+
/* called right after the request is allocated for the request_queue */
211+
212+
sreq->sense = kzalloc(SCSI_SENSE_BUFFERSIZE, gfp);
213+
if (!sreq->sense)
214+
return -ENOMEM;
215+
216+
return 0;
217+
}
218+
219+
static void bsg_initialize_rq(struct request *req)
220+
{
221+
struct bsg_job *job = blk_mq_rq_to_pdu(req);
222+
struct scsi_request *sreq = &job->sreq;
223+
void *sense = sreq->sense;
224+
225+
/* called right before the request is given to the request_queue user */
226+
210227
memset(job, 0, sizeof(*job));
211228

212229
scsi_req_init(sreq);
230+
231+
sreq->sense = sense;
213232
sreq->sense_len = SCSI_SENSE_BUFFERSIZE;
214-
sreq->sense = kzalloc(sreq->sense_len, gfp);
215-
if (!sreq->sense)
216-
return -ENOMEM;
217233

218234
job->req = req;
219-
job->reply = sreq->sense;
235+
job->reply = sense;
220236
job->reply_len = sreq->sense_len;
221237
job->dd_data = job + 1;
222-
223-
return 0;
224238
}
225239

226240
static void bsg_exit_rq(struct request_queue *q, struct request *req)
@@ -251,6 +265,7 @@ struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
251265
q->cmd_size = sizeof(struct bsg_job) + dd_job_size;
252266
q->init_rq_fn = bsg_init_rq;
253267
q->exit_rq_fn = bsg_exit_rq;
268+
q->initialize_rq_fn = bsg_initialize_rq;
254269
q->request_fn = bsg_request_fn;
255270

256271
ret = blk_init_allocated_queue(q);

drivers/block/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ if BLK_DEV
1717

1818
config BLK_DEV_NULL_BLK
1919
tristate "Null test block driver"
20-
depends on CONFIGFS_FS
20+
select CONFIGFS_FS
2121

2222
config BLK_DEV_FD
2323
tristate "Normal floppy disk support"

drivers/block/nbd.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -820,9 +820,13 @@ static blk_status_t nbd_queue_rq(struct blk_mq_hw_ctx *hctx,
820820
* appropriate.
821821
*/
822822
ret = nbd_handle_cmd(cmd, hctx->queue_num);
823+
if (ret < 0)
824+
ret = BLK_STS_IOERR;
825+
else if (!ret)
826+
ret = BLK_STS_OK;
823827
complete(&cmd->send_complete);
824828

825-
return ret < 0 ? BLK_STS_IOERR : BLK_STS_OK;
829+
return ret;
826830
}
827831

828832
static int nbd_add_socket(struct nbd_device *nbd, unsigned long arg,

drivers/md/bcache/closure.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ EXPORT_SYMBOL(closure_put);
6464
void __closure_wake_up(struct closure_waitlist *wait_list)
6565
{
6666
struct llist_node *list;
67-
struct closure *cl;
67+
struct closure *cl, *t;
6868
struct llist_node *reverse = NULL;
6969

7070
list = llist_del_all(&wait_list->list);
@@ -73,7 +73,7 @@ void __closure_wake_up(struct closure_waitlist *wait_list)
7373
reverse = llist_reverse_order(list);
7474

7575
/* Then do the wakeups */
76-
llist_for_each_entry(cl, reverse, list) {
76+
llist_for_each_entry_safe(cl, t, reverse, list) {
7777
closure_set_waiting(cl, 0);
7878
closure_sub(cl, CLOSURE_WAITING + 1);
7979
}

drivers/nvme/host/core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2136,7 +2136,7 @@ static umode_t nvme_ns_attrs_are_visible(struct kobject *kobj,
21362136
struct nvme_ns *ns = nvme_get_ns_from_dev(dev);
21372137

21382138
if (a == &dev_attr_uuid.attr) {
2139-
if (uuid_is_null(&ns->uuid) ||
2139+
if (uuid_is_null(&ns->uuid) &&
21402140
!memchr_inv(ns->nguid, 0, sizeof(ns->nguid)))
21412141
return 0;
21422142
}

drivers/nvme/host/pci.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ struct nvme_dev {
9494
struct mutex shutdown_lock;
9595
bool subsystem;
9696
void __iomem *cmb;
97-
dma_addr_t cmb_dma_addr;
97+
pci_bus_addr_t cmb_bus_addr;
9898
u64 cmb_size;
9999
u32 cmbsz;
100100
u32 cmbloc;
@@ -1226,7 +1226,7 @@ static int nvme_alloc_sq_cmds(struct nvme_dev *dev, struct nvme_queue *nvmeq,
12261226
if (qid && dev->cmb && use_cmb_sqes && NVME_CMB_SQS(dev->cmbsz)) {
12271227
unsigned offset = (qid - 1) * roundup(SQ_SIZE(depth),
12281228
dev->ctrl.page_size);
1229-
nvmeq->sq_dma_addr = dev->cmb_dma_addr + offset;
1229+
nvmeq->sq_dma_addr = dev->cmb_bus_addr + offset;
12301230
nvmeq->sq_cmds_io = dev->cmb + offset;
12311231
} else {
12321232
nvmeq->sq_cmds = dma_alloc_coherent(dev->dev, SQ_SIZE(depth),
@@ -1527,7 +1527,7 @@ static void __iomem *nvme_map_cmb(struct nvme_dev *dev)
15271527
resource_size_t bar_size;
15281528
struct pci_dev *pdev = to_pci_dev(dev->dev);
15291529
void __iomem *cmb;
1530-
dma_addr_t dma_addr;
1530+
int bar;
15311531

15321532
dev->cmbsz = readl(dev->bar + NVME_REG_CMBSZ);
15331533
if (!(NVME_CMB_SZ(dev->cmbsz)))
@@ -1540,7 +1540,8 @@ static void __iomem *nvme_map_cmb(struct nvme_dev *dev)
15401540
szu = (u64)1 << (12 + 4 * NVME_CMB_SZU(dev->cmbsz));
15411541
size = szu * NVME_CMB_SZ(dev->cmbsz);
15421542
offset = szu * NVME_CMB_OFST(dev->cmbloc);
1543-
bar_size = pci_resource_len(pdev, NVME_CMB_BIR(dev->cmbloc));
1543+
bar = NVME_CMB_BIR(dev->cmbloc);
1544+
bar_size = pci_resource_len(pdev, bar);
15441545

15451546
if (offset > bar_size)
15461547
return NULL;
@@ -1553,12 +1554,11 @@ static void __iomem *nvme_map_cmb(struct nvme_dev *dev)
15531554
if (size > bar_size - offset)
15541555
size = bar_size - offset;
15551556

1556-
dma_addr = pci_resource_start(pdev, NVME_CMB_BIR(dev->cmbloc)) + offset;
1557-
cmb = ioremap_wc(dma_addr, size);
1557+
cmb = ioremap_wc(pci_resource_start(pdev, bar) + offset, size);
15581558
if (!cmb)
15591559
return NULL;
15601560

1561-
dev->cmb_dma_addr = dma_addr;
1561+
dev->cmb_bus_addr = pci_bus_address(pdev, bar) + offset;
15621562
dev->cmb_size = size;
15631563
return cmb;
15641564
}

0 commit comments

Comments
 (0)