aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-10-06 15:13:50 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-10-06 15:13:50 -0400
commit17d084c8d1b73fc07e48c1f5081ef3b8af338e15 (patch)
tree0a41c48c17c4b63ec8174a0b81eb405559a311bc
parent80cf1f8c168d49f0430876950455b3578e27bf82 (diff)
parentd7b544def408ab5dc724e8887ca696db59cd9216 (diff)
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()
-rw-r--r--MAINTAINERS2
-rw-r--r--block/blk-mq-debugfs.c6
-rw-r--r--block/blk-throttle.c4
-rw-r--r--block/bsg-lib.c27
-rw-r--r--drivers/block/Kconfig2
-rw-r--r--drivers/block/nbd.c6
-rw-r--r--drivers/md/bcache/closure.c4
-rw-r--r--drivers/nvme/host/core.c2
-rw-r--r--drivers/nvme/host/pci.c14
9 files changed, 45 insertions, 22 deletions
diff --git a/MAINTAINERS b/MAINTAINERS
index cc42c838ab4f..d5376011c753 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9360,7 +9360,7 @@ NETWORK BLOCK DEVICE (NBD)
9360M: Josef Bacik <jbacik@fb.com> 9360M: Josef Bacik <jbacik@fb.com>
9361S: Maintained 9361S: Maintained
9362L: linux-block@vger.kernel.org 9362L: linux-block@vger.kernel.org
9363L: nbd-general@lists.sourceforge.net 9363L: nbd@other.debian.org
9364F: Documentation/blockdev/nbd.txt 9364F: Documentation/blockdev/nbd.txt
9365F: drivers/block/nbd.c 9365F: drivers/block/nbd.c
9366F: include/uapi/linux/nbd.h 9366F: include/uapi/linux/nbd.h
diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c
index 980e73095643..de294d775acf 100644
--- a/block/blk-mq-debugfs.c
+++ b/block/blk-mq-debugfs.c
@@ -815,10 +815,14 @@ int blk_mq_debugfs_register(struct request_queue *q)
815 goto err; 815 goto err;
816 816
817 /* 817 /*
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
819 * didn't exist yet (because we don't know what to name the directory 819 * didn't exist yet (because we don't know what to name the directory
820 * until the queue is registered to a gendisk). 820 * until the queue is registered to a gendisk).
821 */ 821 */
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. */
822 queue_for_each_hw_ctx(q, hctx, i) { 826 queue_for_each_hw_ctx(q, hctx, i) {
823 if (!hctx->debugfs_dir && blk_mq_debugfs_register_hctx(q, hctx)) 827 if (!hctx->debugfs_dir && blk_mq_debugfs_register_hctx(q, hctx))
824 goto err; 828 goto err;
diff --git a/block/blk-throttle.c b/block/blk-throttle.c
index 0fea76aa0f3f..17816a028dcb 100644
--- a/block/blk-throttle.c
+++ b/block/blk-throttle.c
@@ -1911,11 +1911,11 @@ static void throtl_upgrade_state(struct throtl_data *td)
1911 1911
1912 tg->disptime = jiffies - 1; 1912 tg->disptime = jiffies - 1;
1913 throtl_select_dispatch(sq); 1913 throtl_select_dispatch(sq);
1914 throtl_schedule_next_dispatch(sq, false); 1914 throtl_schedule_next_dispatch(sq, true);
1915 } 1915 }
1916 rcu_read_unlock(); 1916 rcu_read_unlock();
1917 throtl_select_dispatch(&td->service_queue); 1917 throtl_select_dispatch(&td->service_queue);
1918 throtl_schedule_next_dispatch(&td->service_queue, false); 1918 throtl_schedule_next_dispatch(&td->service_queue, true);
1919 queue_work(kthrotld_workqueue, &td->dispatch_work); 1919 queue_work(kthrotld_workqueue, &td->dispatch_work);
1920} 1920}
1921 1921
diff --git a/block/bsg-lib.c b/block/bsg-lib.c
index dbddff8174e5..15d25ccd51a5 100644
--- a/block/bsg-lib.c
+++ b/block/bsg-lib.c
@@ -207,20 +207,34 @@ static int bsg_init_rq(struct request_queue *q, struct request *req, gfp_t gfp)
207 struct bsg_job *job = blk_mq_rq_to_pdu(req); 207 struct bsg_job *job = blk_mq_rq_to_pdu(req);
208 struct scsi_request *sreq = &job->sreq; 208 struct scsi_request *sreq = &job->sreq;
209 209
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
219static 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
210 memset(job, 0, sizeof(*job)); 227 memset(job, 0, sizeof(*job));
211 228
212 scsi_req_init(sreq); 229 scsi_req_init(sreq);
230
231 sreq->sense = sense;
213 sreq->sense_len = SCSI_SENSE_BUFFERSIZE; 232 sreq->sense_len = SCSI_SENSE_BUFFERSIZE;
214 sreq->sense = kzalloc(sreq->sense_len, gfp);
215 if (!sreq->sense)
216 return -ENOMEM;
217 233
218 job->req = req; 234 job->req = req;
219 job->reply = sreq->sense; 235 job->reply = sense;
220 job->reply_len = sreq->sense_len; 236 job->reply_len = sreq->sense_len;
221 job->dd_data = job + 1; 237 job->dd_data = job + 1;
222
223 return 0;
224} 238}
225 239
226static void bsg_exit_rq(struct request_queue *q, struct request *req) 240static 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,
251 q->cmd_size = sizeof(struct bsg_job) + dd_job_size; 265 q->cmd_size = sizeof(struct bsg_job) + dd_job_size;
252 q->init_rq_fn = bsg_init_rq; 266 q->init_rq_fn = bsg_init_rq;
253 q->exit_rq_fn = bsg_exit_rq; 267 q->exit_rq_fn = bsg_exit_rq;
268 q->initialize_rq_fn = bsg_initialize_rq;
254 q->request_fn = bsg_request_fn; 269 q->request_fn = bsg_request_fn;
255 270
256 ret = blk_init_allocated_queue(q); 271 ret = blk_init_allocated_queue(q);
diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig
index 4a438b8abe27..2dfe99b328f8 100644
--- a/drivers/block/Kconfig
+++ b/drivers/block/Kconfig
@@ -17,7 +17,7 @@ if BLK_DEV
17 17
18config BLK_DEV_NULL_BLK 18config BLK_DEV_NULL_BLK
19 tristate "Null test block driver" 19 tristate "Null test block driver"
20 depends on CONFIGFS_FS 20 select CONFIGFS_FS
21 21
22config BLK_DEV_FD 22config BLK_DEV_FD
23 tristate "Normal floppy disk support" 23 tristate "Normal floppy disk support"
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index 3684e21d543f..883dfebd3014 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -820,9 +820,13 @@ static blk_status_t nbd_queue_rq(struct blk_mq_hw_ctx *hctx,
820 * appropriate. 820 * appropriate.
821 */ 821 */
822 ret = nbd_handle_cmd(cmd, hctx->queue_num); 822 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;
823 complete(&cmd->send_complete); 827 complete(&cmd->send_complete);
824 828
825 return ret < 0 ? BLK_STS_IOERR : BLK_STS_OK; 829 return ret;
826} 830}
827 831
828static int nbd_add_socket(struct nbd_device *nbd, unsigned long arg, 832static int nbd_add_socket(struct nbd_device *nbd, unsigned long arg,
diff --git a/drivers/md/bcache/closure.c b/drivers/md/bcache/closure.c
index 7d5286b05036..1841d0359bac 100644
--- a/drivers/md/bcache/closure.c
+++ b/drivers/md/bcache/closure.c
@@ -64,7 +64,7 @@ EXPORT_SYMBOL(closure_put);
64void __closure_wake_up(struct closure_waitlist *wait_list) 64void __closure_wake_up(struct closure_waitlist *wait_list)
65{ 65{
66 struct llist_node *list; 66 struct llist_node *list;
67 struct closure *cl; 67 struct closure *cl, *t;
68 struct llist_node *reverse = NULL; 68 struct llist_node *reverse = NULL;
69 69
70 list = llist_del_all(&wait_list->list); 70 list = llist_del_all(&wait_list->list);
@@ -73,7 +73,7 @@ void __closure_wake_up(struct closure_waitlist *wait_list)
73 reverse = llist_reverse_order(list); 73 reverse = llist_reverse_order(list);
74 74
75 /* Then do the wakeups */ 75 /* Then do the wakeups */
76 llist_for_each_entry(cl, reverse, list) { 76 llist_for_each_entry_safe(cl, t, reverse, list) {
77 closure_set_waiting(cl, 0); 77 closure_set_waiting(cl, 0);
78 closure_sub(cl, CLOSURE_WAITING + 1); 78 closure_sub(cl, CLOSURE_WAITING + 1);
79 } 79 }
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index bb2aad078637..5a14cc7f28ee 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -2136,7 +2136,7 @@ static umode_t nvme_ns_attrs_are_visible(struct kobject *kobj,
2136 struct nvme_ns *ns = nvme_get_ns_from_dev(dev); 2136 struct nvme_ns *ns = nvme_get_ns_from_dev(dev);
2137 2137
2138 if (a == &dev_attr_uuid.attr) { 2138 if (a == &dev_attr_uuid.attr) {
2139 if (uuid_is_null(&ns->uuid) || 2139 if (uuid_is_null(&ns->uuid) &&
2140 !memchr_inv(ns->nguid, 0, sizeof(ns->nguid))) 2140 !memchr_inv(ns->nguid, 0, sizeof(ns->nguid)))
2141 return 0; 2141 return 0;
2142 } 2142 }
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index cb73bc8cad3b..3f5a04c586ce 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -94,7 +94,7 @@ struct nvme_dev {
94 struct mutex shutdown_lock; 94 struct mutex shutdown_lock;
95 bool subsystem; 95 bool subsystem;
96 void __iomem *cmb; 96 void __iomem *cmb;
97 dma_addr_t cmb_dma_addr; 97 pci_bus_addr_t cmb_bus_addr;
98 u64 cmb_size; 98 u64 cmb_size;
99 u32 cmbsz; 99 u32 cmbsz;
100 u32 cmbloc; 100 u32 cmbloc;
@@ -1226,7 +1226,7 @@ static int nvme_alloc_sq_cmds(struct nvme_dev *dev, struct nvme_queue *nvmeq,
1226 if (qid && dev->cmb && use_cmb_sqes && NVME_CMB_SQS(dev->cmbsz)) { 1226 if (qid && dev->cmb && use_cmb_sqes && NVME_CMB_SQS(dev->cmbsz)) {
1227 unsigned offset = (qid - 1) * roundup(SQ_SIZE(depth), 1227 unsigned offset = (qid - 1) * roundup(SQ_SIZE(depth),
1228 dev->ctrl.page_size); 1228 dev->ctrl.page_size);
1229 nvmeq->sq_dma_addr = dev->cmb_dma_addr + offset; 1229 nvmeq->sq_dma_addr = dev->cmb_bus_addr + offset;
1230 nvmeq->sq_cmds_io = dev->cmb + offset; 1230 nvmeq->sq_cmds_io = dev->cmb + offset;
1231 } else { 1231 } else {
1232 nvmeq->sq_cmds = dma_alloc_coherent(dev->dev, SQ_SIZE(depth), 1232 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)
1527 resource_size_t bar_size; 1527 resource_size_t bar_size;
1528 struct pci_dev *pdev = to_pci_dev(dev->dev); 1528 struct pci_dev *pdev = to_pci_dev(dev->dev);
1529 void __iomem *cmb; 1529 void __iomem *cmb;
1530 dma_addr_t dma_addr; 1530 int bar;
1531 1531
1532 dev->cmbsz = readl(dev->bar + NVME_REG_CMBSZ); 1532 dev->cmbsz = readl(dev->bar + NVME_REG_CMBSZ);
1533 if (!(NVME_CMB_SZ(dev->cmbsz))) 1533 if (!(NVME_CMB_SZ(dev->cmbsz)))
@@ -1540,7 +1540,8 @@ static void __iomem *nvme_map_cmb(struct nvme_dev *dev)
1540 szu = (u64)1 << (12 + 4 * NVME_CMB_SZU(dev->cmbsz)); 1540 szu = (u64)1 << (12 + 4 * NVME_CMB_SZU(dev->cmbsz));
1541 size = szu * NVME_CMB_SZ(dev->cmbsz); 1541 size = szu * NVME_CMB_SZ(dev->cmbsz);
1542 offset = szu * NVME_CMB_OFST(dev->cmbloc); 1542 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);
1544 1545
1545 if (offset > bar_size) 1546 if (offset > bar_size)
1546 return NULL; 1547 return NULL;
@@ -1553,12 +1554,11 @@ static void __iomem *nvme_map_cmb(struct nvme_dev *dev)
1553 if (size > bar_size - offset) 1554 if (size > bar_size - offset)
1554 size = bar_size - offset; 1555 size = bar_size - offset;
1555 1556
1556 dma_addr = pci_resource_start(pdev, NVME_CMB_BIR(dev->cmbloc)) + offset; 1557 cmb = ioremap_wc(pci_resource_start(pdev, bar) + offset, size);
1557 cmb = ioremap_wc(dma_addr, size);
1558 if (!cmb) 1558 if (!cmb)
1559 return NULL; 1559 return NULL;
1560 1560
1561 dev->cmb_dma_addr = dma_addr; 1561 dev->cmb_bus_addr = pci_bus_address(pdev, bar) + offset;
1562 dev->cmb_size = size; 1562 dev->cmb_size = size;
1563 return cmb; 1563 return cmb;
1564} 1564}