diff options
-rw-r--r-- | block/bio.c | 3 | ||||
-rw-r--r-- | block/blk-core.c | 8 | ||||
-rw-r--r-- | block/blk-mq-debugfs.c | 2 | ||||
-rw-r--r-- | block/blk-mq.c | 1 | ||||
-rw-r--r-- | block/blk-softirq.c | 1 | ||||
-rw-r--r-- | block/blk-timeout.c | 1 | ||||
-rw-r--r-- | block/sed-opal.c | 4 | ||||
-rw-r--r-- | drivers/block/nbd.c | 42 | ||||
-rw-r--r-- | drivers/block/null_blk.c | 2 | ||||
-rw-r--r-- | drivers/lightnvm/Kconfig | 2 | ||||
-rw-r--r-- | drivers/nvme/host/core.c | 1 | ||||
-rw-r--r-- | drivers/nvme/host/fc.c | 6 | ||||
-rw-r--r-- | drivers/nvme/host/nvme.h | 1 | ||||
-rw-r--r-- | drivers/nvme/host/pci.c | 44 | ||||
-rw-r--r-- | drivers/nvme/host/rdma.c | 73 | ||||
-rw-r--r-- | drivers/nvme/target/core.c | 8 | ||||
-rw-r--r-- | drivers/scsi/scsi_transport_fc.c | 2 | ||||
-rw-r--r-- | include/linux/backing-dev-defs.h | 2 | ||||
-rw-r--r-- | include/uapi/linux/nbd.h | 3 | ||||
-rw-r--r-- | mm/backing-dev.c | 20 |
20 files changed, 142 insertions, 84 deletions
diff --git a/block/bio.c b/block/bio.c index 9710e275f230..67eff5eddc49 100644 --- a/block/bio.c +++ b/block/bio.c | |||
@@ -1807,9 +1807,6 @@ again: | |||
1807 | if (!bio_integrity_endio(bio)) | 1807 | if (!bio_integrity_endio(bio)) |
1808 | return; | 1808 | return; |
1809 | 1809 | ||
1810 | if (WARN_ONCE(bio->bi_next, "driver left bi_next not NULL")) | ||
1811 | bio->bi_next = NULL; | ||
1812 | |||
1813 | /* | 1810 | /* |
1814 | * Need to have a real endio function for chained bios, otherwise | 1811 | * Need to have a real endio function for chained bios, otherwise |
1815 | * various corner cases will break (like stacking block devices that | 1812 | * various corner cases will break (like stacking block devices that |
diff --git a/block/blk-core.c b/block/blk-core.c index cf0ee764b908..afd2596ea3d3 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
@@ -273,10 +273,6 @@ static void req_bio_endio(struct request *rq, struct bio *bio, | |||
273 | bio_advance(bio, nbytes); | 273 | bio_advance(bio, nbytes); |
274 | 274 | ||
275 | /* don't actually finish bio if it's part of flush sequence */ | 275 | /* don't actually finish bio if it's part of flush sequence */ |
276 | /* | ||
277 | * XXX this code looks suspicious - it's not consistent with advancing | ||
278 | * req->bio in caller | ||
279 | */ | ||
280 | if (bio->bi_iter.bi_size == 0 && !(rq->rq_flags & RQF_FLUSH_SEQ)) | 276 | if (bio->bi_iter.bi_size == 0 && !(rq->rq_flags & RQF_FLUSH_SEQ)) |
281 | bio_endio(bio); | 277 | bio_endio(bio); |
282 | } | 278 | } |
@@ -3081,10 +3077,8 @@ bool blk_update_request(struct request *req, blk_status_t error, | |||
3081 | struct bio *bio = req->bio; | 3077 | struct bio *bio = req->bio; |
3082 | unsigned bio_bytes = min(bio->bi_iter.bi_size, nr_bytes); | 3078 | unsigned bio_bytes = min(bio->bi_iter.bi_size, nr_bytes); |
3083 | 3079 | ||
3084 | if (bio_bytes == bio->bi_iter.bi_size) { | 3080 | if (bio_bytes == bio->bi_iter.bi_size) |
3085 | req->bio = bio->bi_next; | 3081 | req->bio = bio->bi_next; |
3086 | bio->bi_next = NULL; | ||
3087 | } | ||
3088 | 3082 | ||
3089 | /* Completion has already been traced */ | 3083 | /* Completion has already been traced */ |
3090 | bio_clear_flag(bio, BIO_TRACE_COMPLETION); | 3084 | bio_clear_flag(bio, BIO_TRACE_COMPLETION); |
diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c index ffa622366922..1c4532e92938 100644 --- a/block/blk-mq-debugfs.c +++ b/block/blk-mq-debugfs.c | |||
@@ -356,7 +356,7 @@ static const char *const blk_mq_rq_state_name_array[] = { | |||
356 | 356 | ||
357 | static const char *blk_mq_rq_state_name(enum mq_rq_state rq_state) | 357 | static const char *blk_mq_rq_state_name(enum mq_rq_state rq_state) |
358 | { | 358 | { |
359 | if (WARN_ON_ONCE((unsigned int)rq_state > | 359 | if (WARN_ON_ONCE((unsigned int)rq_state >= |
360 | ARRAY_SIZE(blk_mq_rq_state_name_array))) | 360 | ARRAY_SIZE(blk_mq_rq_state_name_array))) |
361 | return "(?)"; | 361 | return "(?)"; |
362 | return blk_mq_rq_state_name_array[rq_state]; | 362 | return blk_mq_rq_state_name_array[rq_state]; |
diff --git a/block/blk-mq.c b/block/blk-mq.c index 70c65bb6c013..b429d515b568 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c | |||
@@ -781,7 +781,6 @@ static void blk_mq_rq_timed_out(struct request *req, bool reserved) | |||
781 | WARN_ON_ONCE(ret != BLK_EH_RESET_TIMER); | 781 | WARN_ON_ONCE(ret != BLK_EH_RESET_TIMER); |
782 | } | 782 | } |
783 | 783 | ||
784 | req->rq_flags &= ~RQF_TIMED_OUT; | ||
785 | blk_add_timer(req); | 784 | blk_add_timer(req); |
786 | } | 785 | } |
787 | 786 | ||
diff --git a/block/blk-softirq.c b/block/blk-softirq.c index 01e2b353a2b9..15c1f5e12eb8 100644 --- a/block/blk-softirq.c +++ b/block/blk-softirq.c | |||
@@ -144,6 +144,7 @@ do_local: | |||
144 | 144 | ||
145 | local_irq_restore(flags); | 145 | local_irq_restore(flags); |
146 | } | 146 | } |
147 | EXPORT_SYMBOL(__blk_complete_request); | ||
147 | 148 | ||
148 | /** | 149 | /** |
149 | * blk_complete_request - end I/O on a request | 150 | * blk_complete_request - end I/O on a request |
diff --git a/block/blk-timeout.c b/block/blk-timeout.c index 4b8a48d48ba1..f2cfd56e1606 100644 --- a/block/blk-timeout.c +++ b/block/blk-timeout.c | |||
@@ -210,6 +210,7 @@ void blk_add_timer(struct request *req) | |||
210 | if (!req->timeout) | 210 | if (!req->timeout) |
211 | req->timeout = q->rq_timeout; | 211 | req->timeout = q->rq_timeout; |
212 | 212 | ||
213 | req->rq_flags &= ~RQF_TIMED_OUT; | ||
213 | blk_rq_set_deadline(req, jiffies + req->timeout); | 214 | blk_rq_set_deadline(req, jiffies + req->timeout); |
214 | 215 | ||
215 | /* | 216 | /* |
diff --git a/block/sed-opal.c b/block/sed-opal.c index 945f4b8610e0..e0de4dd448b3 100644 --- a/block/sed-opal.c +++ b/block/sed-opal.c | |||
@@ -877,7 +877,7 @@ static size_t response_get_string(const struct parsed_resp *resp, int n, | |||
877 | return 0; | 877 | return 0; |
878 | } | 878 | } |
879 | 879 | ||
880 | if (n > resp->num) { | 880 | if (n >= resp->num) { |
881 | pr_debug("Response has %d tokens. Can't access %d\n", | 881 | pr_debug("Response has %d tokens. Can't access %d\n", |
882 | resp->num, n); | 882 | resp->num, n); |
883 | return 0; | 883 | return 0; |
@@ -916,7 +916,7 @@ static u64 response_get_u64(const struct parsed_resp *resp, int n) | |||
916 | return 0; | 916 | return 0; |
917 | } | 917 | } |
918 | 918 | ||
919 | if (n > resp->num) { | 919 | if (n >= resp->num) { |
920 | pr_debug("Response has %d tokens. Can't access %d\n", | 920 | pr_debug("Response has %d tokens. Can't access %d\n", |
921 | resp->num, n); | 921 | resp->num, n); |
922 | return 0; | 922 | return 0; |
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 3b7083b8ecbb..74a05561b620 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c | |||
@@ -76,6 +76,7 @@ struct link_dead_args { | |||
76 | #define NBD_HAS_CONFIG_REF 4 | 76 | #define NBD_HAS_CONFIG_REF 4 |
77 | #define NBD_BOUND 5 | 77 | #define NBD_BOUND 5 |
78 | #define NBD_DESTROY_ON_DISCONNECT 6 | 78 | #define NBD_DESTROY_ON_DISCONNECT 6 |
79 | #define NBD_DISCONNECT_ON_CLOSE 7 | ||
79 | 80 | ||
80 | struct nbd_config { | 81 | struct nbd_config { |
81 | u32 flags; | 82 | u32 flags; |
@@ -138,6 +139,7 @@ static void nbd_config_put(struct nbd_device *nbd); | |||
138 | static void nbd_connect_reply(struct genl_info *info, int index); | 139 | static void nbd_connect_reply(struct genl_info *info, int index); |
139 | static int nbd_genl_status(struct sk_buff *skb, struct genl_info *info); | 140 | static int nbd_genl_status(struct sk_buff *skb, struct genl_info *info); |
140 | static void nbd_dead_link_work(struct work_struct *work); | 141 | static void nbd_dead_link_work(struct work_struct *work); |
142 | static void nbd_disconnect_and_put(struct nbd_device *nbd); | ||
141 | 143 | ||
142 | static inline struct device *nbd_to_dev(struct nbd_device *nbd) | 144 | static inline struct device *nbd_to_dev(struct nbd_device *nbd) |
143 | { | 145 | { |
@@ -1305,6 +1307,12 @@ out: | |||
1305 | static void nbd_release(struct gendisk *disk, fmode_t mode) | 1307 | static void nbd_release(struct gendisk *disk, fmode_t mode) |
1306 | { | 1308 | { |
1307 | struct nbd_device *nbd = disk->private_data; | 1309 | struct nbd_device *nbd = disk->private_data; |
1310 | struct block_device *bdev = bdget_disk(disk, 0); | ||
1311 | |||
1312 | if (test_bit(NBD_DISCONNECT_ON_CLOSE, &nbd->config->runtime_flags) && | ||
1313 | bdev->bd_openers == 0) | ||
1314 | nbd_disconnect_and_put(nbd); | ||
1315 | |||
1308 | nbd_config_put(nbd); | 1316 | nbd_config_put(nbd); |
1309 | nbd_put(nbd); | 1317 | nbd_put(nbd); |
1310 | } | 1318 | } |
@@ -1705,6 +1713,10 @@ again: | |||
1705 | &config->runtime_flags); | 1713 | &config->runtime_flags); |
1706 | put_dev = true; | 1714 | put_dev = true; |
1707 | } | 1715 | } |
1716 | if (flags & NBD_CFLAG_DISCONNECT_ON_CLOSE) { | ||
1717 | set_bit(NBD_DISCONNECT_ON_CLOSE, | ||
1718 | &config->runtime_flags); | ||
1719 | } | ||
1708 | } | 1720 | } |
1709 | 1721 | ||
1710 | if (info->attrs[NBD_ATTR_SOCKETS]) { | 1722 | if (info->attrs[NBD_ATTR_SOCKETS]) { |
@@ -1749,6 +1761,17 @@ out: | |||
1749 | return ret; | 1761 | return ret; |
1750 | } | 1762 | } |
1751 | 1763 | ||
1764 | static void nbd_disconnect_and_put(struct nbd_device *nbd) | ||
1765 | { | ||
1766 | mutex_lock(&nbd->config_lock); | ||
1767 | nbd_disconnect(nbd); | ||
1768 | nbd_clear_sock(nbd); | ||
1769 | mutex_unlock(&nbd->config_lock); | ||
1770 | if (test_and_clear_bit(NBD_HAS_CONFIG_REF, | ||
1771 | &nbd->config->runtime_flags)) | ||
1772 | nbd_config_put(nbd); | ||
1773 | } | ||
1774 | |||
1752 | static int nbd_genl_disconnect(struct sk_buff *skb, struct genl_info *info) | 1775 | static int nbd_genl_disconnect(struct sk_buff *skb, struct genl_info *info) |
1753 | { | 1776 | { |
1754 | struct nbd_device *nbd; | 1777 | struct nbd_device *nbd; |
@@ -1781,13 +1804,7 @@ static int nbd_genl_disconnect(struct sk_buff *skb, struct genl_info *info) | |||
1781 | nbd_put(nbd); | 1804 | nbd_put(nbd); |
1782 | return 0; | 1805 | return 0; |
1783 | } | 1806 | } |
1784 | mutex_lock(&nbd->config_lock); | 1807 | nbd_disconnect_and_put(nbd); |
1785 | nbd_disconnect(nbd); | ||
1786 | nbd_clear_sock(nbd); | ||
1787 | mutex_unlock(&nbd->config_lock); | ||
1788 | if (test_and_clear_bit(NBD_HAS_CONFIG_REF, | ||
1789 | &nbd->config->runtime_flags)) | ||
1790 | nbd_config_put(nbd); | ||
1791 | nbd_config_put(nbd); | 1808 | nbd_config_put(nbd); |
1792 | nbd_put(nbd); | 1809 | nbd_put(nbd); |
1793 | return 0; | 1810 | return 0; |
@@ -1798,7 +1815,7 @@ static int nbd_genl_reconfigure(struct sk_buff *skb, struct genl_info *info) | |||
1798 | struct nbd_device *nbd = NULL; | 1815 | struct nbd_device *nbd = NULL; |
1799 | struct nbd_config *config; | 1816 | struct nbd_config *config; |
1800 | int index; | 1817 | int index; |
1801 | int ret = -EINVAL; | 1818 | int ret = 0; |
1802 | bool put_dev = false; | 1819 | bool put_dev = false; |
1803 | 1820 | ||
1804 | if (!netlink_capable(skb, CAP_SYS_ADMIN)) | 1821 | if (!netlink_capable(skb, CAP_SYS_ADMIN)) |
@@ -1838,6 +1855,7 @@ static int nbd_genl_reconfigure(struct sk_buff *skb, struct genl_info *info) | |||
1838 | !nbd->task_recv) { | 1855 | !nbd->task_recv) { |
1839 | dev_err(nbd_to_dev(nbd), | 1856 | dev_err(nbd_to_dev(nbd), |
1840 | "not configured, cannot reconfigure\n"); | 1857 | "not configured, cannot reconfigure\n"); |
1858 | ret = -EINVAL; | ||
1841 | goto out; | 1859 | goto out; |
1842 | } | 1860 | } |
1843 | 1861 | ||
@@ -1862,6 +1880,14 @@ static int nbd_genl_reconfigure(struct sk_buff *skb, struct genl_info *info) | |||
1862 | &config->runtime_flags)) | 1880 | &config->runtime_flags)) |
1863 | refcount_inc(&nbd->refs); | 1881 | refcount_inc(&nbd->refs); |
1864 | } | 1882 | } |
1883 | |||
1884 | if (flags & NBD_CFLAG_DISCONNECT_ON_CLOSE) { | ||
1885 | set_bit(NBD_DISCONNECT_ON_CLOSE, | ||
1886 | &config->runtime_flags); | ||
1887 | } else { | ||
1888 | clear_bit(NBD_DISCONNECT_ON_CLOSE, | ||
1889 | &config->runtime_flags); | ||
1890 | } | ||
1865 | } | 1891 | } |
1866 | 1892 | ||
1867 | if (info->attrs[NBD_ATTR_SOCKETS]) { | 1893 | if (info->attrs[NBD_ATTR_SOCKETS]) { |
diff --git a/drivers/block/null_blk.c b/drivers/block/null_blk.c index 7948049f6c43..042c778e5a4e 100644 --- a/drivers/block/null_blk.c +++ b/drivers/block/null_blk.c | |||
@@ -1365,7 +1365,7 @@ static blk_qc_t null_queue_bio(struct request_queue *q, struct bio *bio) | |||
1365 | static enum blk_eh_timer_return null_rq_timed_out_fn(struct request *rq) | 1365 | static enum blk_eh_timer_return null_rq_timed_out_fn(struct request *rq) |
1366 | { | 1366 | { |
1367 | pr_info("null: rq %p timed out\n", rq); | 1367 | pr_info("null: rq %p timed out\n", rq); |
1368 | blk_mq_complete_request(rq); | 1368 | __blk_complete_request(rq); |
1369 | return BLK_EH_DONE; | 1369 | return BLK_EH_DONE; |
1370 | } | 1370 | } |
1371 | 1371 | ||
diff --git a/drivers/lightnvm/Kconfig b/drivers/lightnvm/Kconfig index 10c08982185a..9c03f35d9df1 100644 --- a/drivers/lightnvm/Kconfig +++ b/drivers/lightnvm/Kconfig | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | menuconfig NVM | 5 | menuconfig NVM |
6 | bool "Open-Channel SSD target support" | 6 | bool "Open-Channel SSD target support" |
7 | depends on BLOCK && HAS_DMA && PCI | 7 | depends on BLOCK && PCI |
8 | select BLK_DEV_NVME | 8 | select BLK_DEV_NVME |
9 | help | 9 | help |
10 | Say Y here to get to enable Open-channel SSDs. | 10 | Say Y here to get to enable Open-channel SSDs. |
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 21710a7460c8..46df030b2c3f 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c | |||
@@ -1808,6 +1808,7 @@ static void nvme_set_queue_limits(struct nvme_ctrl *ctrl, | |||
1808 | u32 max_segments = | 1808 | u32 max_segments = |
1809 | (ctrl->max_hw_sectors / (ctrl->page_size >> 9)) + 1; | 1809 | (ctrl->max_hw_sectors / (ctrl->page_size >> 9)) + 1; |
1810 | 1810 | ||
1811 | max_segments = min_not_zero(max_segments, ctrl->max_segments); | ||
1811 | blk_queue_max_hw_sectors(q, ctrl->max_hw_sectors); | 1812 | blk_queue_max_hw_sectors(q, ctrl->max_hw_sectors); |
1812 | blk_queue_max_segments(q, min_t(u32, max_segments, USHRT_MAX)); | 1813 | blk_queue_max_segments(q, min_t(u32, max_segments, USHRT_MAX)); |
1813 | } | 1814 | } |
diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c index b528a2f5826c..41d45a1b5c62 100644 --- a/drivers/nvme/host/fc.c +++ b/drivers/nvme/host/fc.c | |||
@@ -2790,6 +2790,9 @@ nvme_fc_delete_association(struct nvme_fc_ctrl *ctrl) | |||
2790 | /* re-enable the admin_q so anything new can fast fail */ | 2790 | /* re-enable the admin_q so anything new can fast fail */ |
2791 | blk_mq_unquiesce_queue(ctrl->ctrl.admin_q); | 2791 | blk_mq_unquiesce_queue(ctrl->ctrl.admin_q); |
2792 | 2792 | ||
2793 | /* resume the io queues so that things will fast fail */ | ||
2794 | nvme_start_queues(&ctrl->ctrl); | ||
2795 | |||
2793 | nvme_fc_ctlr_inactive_on_rport(ctrl); | 2796 | nvme_fc_ctlr_inactive_on_rport(ctrl); |
2794 | } | 2797 | } |
2795 | 2798 | ||
@@ -2804,9 +2807,6 @@ nvme_fc_delete_ctrl(struct nvme_ctrl *nctrl) | |||
2804 | * waiting for io to terminate | 2807 | * waiting for io to terminate |
2805 | */ | 2808 | */ |
2806 | nvme_fc_delete_association(ctrl); | 2809 | nvme_fc_delete_association(ctrl); |
2807 | |||
2808 | /* resume the io queues so that things will fast fail */ | ||
2809 | nvme_start_queues(nctrl); | ||
2810 | } | 2810 | } |
2811 | 2811 | ||
2812 | static void | 2812 | static void |
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 231807cbc849..0c4a33df3b2f 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h | |||
@@ -170,6 +170,7 @@ struct nvme_ctrl { | |||
170 | u64 cap; | 170 | u64 cap; |
171 | u32 page_size; | 171 | u32 page_size; |
172 | u32 max_hw_sectors; | 172 | u32 max_hw_sectors; |
173 | u32 max_segments; | ||
173 | u16 oncs; | 174 | u16 oncs; |
174 | u16 oacs; | 175 | u16 oacs; |
175 | u16 nssa; | 176 | u16 nssa; |
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index fc33804662e7..ba943f211687 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c | |||
@@ -38,6 +38,13 @@ | |||
38 | 38 | ||
39 | #define SGES_PER_PAGE (PAGE_SIZE / sizeof(struct nvme_sgl_desc)) | 39 | #define SGES_PER_PAGE (PAGE_SIZE / sizeof(struct nvme_sgl_desc)) |
40 | 40 | ||
41 | /* | ||
42 | * These can be higher, but we need to ensure that any command doesn't | ||
43 | * require an sg allocation that needs more than a page of data. | ||
44 | */ | ||
45 | #define NVME_MAX_KB_SZ 4096 | ||
46 | #define NVME_MAX_SEGS 127 | ||
47 | |||
41 | static int use_threaded_interrupts; | 48 | static int use_threaded_interrupts; |
42 | module_param(use_threaded_interrupts, int, 0); | 49 | module_param(use_threaded_interrupts, int, 0); |
43 | 50 | ||
@@ -100,6 +107,8 @@ struct nvme_dev { | |||
100 | struct nvme_ctrl ctrl; | 107 | struct nvme_ctrl ctrl; |
101 | struct completion ioq_wait; | 108 | struct completion ioq_wait; |
102 | 109 | ||
110 | mempool_t *iod_mempool; | ||
111 | |||
103 | /* shadow doorbell buffer support: */ | 112 | /* shadow doorbell buffer support: */ |
104 | u32 *dbbuf_dbs; | 113 | u32 *dbbuf_dbs; |
105 | dma_addr_t dbbuf_dbs_dma_addr; | 114 | dma_addr_t dbbuf_dbs_dma_addr; |
@@ -477,10 +486,7 @@ static blk_status_t nvme_init_iod(struct request *rq, struct nvme_dev *dev) | |||
477 | iod->use_sgl = nvme_pci_use_sgls(dev, rq); | 486 | iod->use_sgl = nvme_pci_use_sgls(dev, rq); |
478 | 487 | ||
479 | if (nseg > NVME_INT_PAGES || size > NVME_INT_BYTES(dev)) { | 488 | if (nseg > NVME_INT_PAGES || size > NVME_INT_BYTES(dev)) { |
480 | size_t alloc_size = nvme_pci_iod_alloc_size(dev, size, nseg, | 489 | iod->sg = mempool_alloc(dev->iod_mempool, GFP_ATOMIC); |
481 | iod->use_sgl); | ||
482 | |||
483 | iod->sg = kmalloc(alloc_size, GFP_ATOMIC); | ||
484 | if (!iod->sg) | 490 | if (!iod->sg) |
485 | return BLK_STS_RESOURCE; | 491 | return BLK_STS_RESOURCE; |
486 | } else { | 492 | } else { |
@@ -526,7 +532,7 @@ static void nvme_free_iod(struct nvme_dev *dev, struct request *req) | |||
526 | } | 532 | } |
527 | 533 | ||
528 | if (iod->sg != iod->inline_sg) | 534 | if (iod->sg != iod->inline_sg) |
529 | kfree(iod->sg); | 535 | mempool_free(iod->sg, dev->iod_mempool); |
530 | } | 536 | } |
531 | 537 | ||
532 | #ifdef CONFIG_BLK_DEV_INTEGRITY | 538 | #ifdef CONFIG_BLK_DEV_INTEGRITY |
@@ -2280,6 +2286,7 @@ static void nvme_pci_free_ctrl(struct nvme_ctrl *ctrl) | |||
2280 | blk_put_queue(dev->ctrl.admin_q); | 2286 | blk_put_queue(dev->ctrl.admin_q); |
2281 | kfree(dev->queues); | 2287 | kfree(dev->queues); |
2282 | free_opal_dev(dev->ctrl.opal_dev); | 2288 | free_opal_dev(dev->ctrl.opal_dev); |
2289 | mempool_destroy(dev->iod_mempool); | ||
2283 | kfree(dev); | 2290 | kfree(dev); |
2284 | } | 2291 | } |
2285 | 2292 | ||
@@ -2289,6 +2296,7 @@ static void nvme_remove_dead_ctrl(struct nvme_dev *dev, int status) | |||
2289 | 2296 | ||
2290 | nvme_get_ctrl(&dev->ctrl); | 2297 | nvme_get_ctrl(&dev->ctrl); |
2291 | nvme_dev_disable(dev, false); | 2298 | nvme_dev_disable(dev, false); |
2299 | nvme_kill_queues(&dev->ctrl); | ||
2292 | if (!queue_work(nvme_wq, &dev->remove_work)) | 2300 | if (!queue_work(nvme_wq, &dev->remove_work)) |
2293 | nvme_put_ctrl(&dev->ctrl); | 2301 | nvme_put_ctrl(&dev->ctrl); |
2294 | } | 2302 | } |
@@ -2333,6 +2341,13 @@ static void nvme_reset_work(struct work_struct *work) | |||
2333 | if (result) | 2341 | if (result) |
2334 | goto out; | 2342 | goto out; |
2335 | 2343 | ||
2344 | /* | ||
2345 | * Limit the max command size to prevent iod->sg allocations going | ||
2346 | * over a single page. | ||
2347 | */ | ||
2348 | dev->ctrl.max_hw_sectors = NVME_MAX_KB_SZ << 1; | ||
2349 | dev->ctrl.max_segments = NVME_MAX_SEGS; | ||
2350 | |||
2336 | result = nvme_init_identify(&dev->ctrl); | 2351 | result = nvme_init_identify(&dev->ctrl); |
2337 | if (result) | 2352 | if (result) |
2338 | goto out; | 2353 | goto out; |
@@ -2405,7 +2420,6 @@ static void nvme_remove_dead_ctrl_work(struct work_struct *work) | |||
2405 | struct nvme_dev *dev = container_of(work, struct nvme_dev, remove_work); | 2420 | struct nvme_dev *dev = container_of(work, struct nvme_dev, remove_work); |
2406 | struct pci_dev *pdev = to_pci_dev(dev->dev); | 2421 | struct pci_dev *pdev = to_pci_dev(dev->dev); |
2407 | 2422 | ||
2408 | nvme_kill_queues(&dev->ctrl); | ||
2409 | if (pci_get_drvdata(pdev)) | 2423 | if (pci_get_drvdata(pdev)) |
2410 | device_release_driver(&pdev->dev); | 2424 | device_release_driver(&pdev->dev); |
2411 | nvme_put_ctrl(&dev->ctrl); | 2425 | nvme_put_ctrl(&dev->ctrl); |
@@ -2509,6 +2523,7 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2509 | int node, result = -ENOMEM; | 2523 | int node, result = -ENOMEM; |
2510 | struct nvme_dev *dev; | 2524 | struct nvme_dev *dev; |
2511 | unsigned long quirks = id->driver_data; | 2525 | unsigned long quirks = id->driver_data; |
2526 | size_t alloc_size; | ||
2512 | 2527 | ||
2513 | node = dev_to_node(&pdev->dev); | 2528 | node = dev_to_node(&pdev->dev); |
2514 | if (node == NUMA_NO_NODE) | 2529 | if (node == NUMA_NO_NODE) |
@@ -2546,6 +2561,23 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2546 | if (result) | 2561 | if (result) |
2547 | goto release_pools; | 2562 | goto release_pools; |
2548 | 2563 | ||
2564 | /* | ||
2565 | * Double check that our mempool alloc size will cover the biggest | ||
2566 | * command we support. | ||
2567 | */ | ||
2568 | alloc_size = nvme_pci_iod_alloc_size(dev, NVME_MAX_KB_SZ, | ||
2569 | NVME_MAX_SEGS, true); | ||
2570 | WARN_ON_ONCE(alloc_size > PAGE_SIZE); | ||
2571 | |||
2572 | dev->iod_mempool = mempool_create_node(1, mempool_kmalloc, | ||
2573 | mempool_kfree, | ||
2574 | (void *) alloc_size, | ||
2575 | GFP_KERNEL, node); | ||
2576 | if (!dev->iod_mempool) { | ||
2577 | result = -ENOMEM; | ||
2578 | goto release_pools; | ||
2579 | } | ||
2580 | |||
2549 | dev_info(dev->ctrl.device, "pci function %s\n", dev_name(&pdev->dev)); | 2581 | dev_info(dev->ctrl.device, "pci function %s\n", dev_name(&pdev->dev)); |
2550 | 2582 | ||
2551 | nvme_get_ctrl(&dev->ctrl); | 2583 | nvme_get_ctrl(&dev->ctrl); |
diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c index c9424da0d23e..9544625c0b7d 100644 --- a/drivers/nvme/host/rdma.c +++ b/drivers/nvme/host/rdma.c | |||
@@ -560,12 +560,6 @@ static void nvme_rdma_free_queue(struct nvme_rdma_queue *queue) | |||
560 | if (!test_and_clear_bit(NVME_RDMA_Q_ALLOCATED, &queue->flags)) | 560 | if (!test_and_clear_bit(NVME_RDMA_Q_ALLOCATED, &queue->flags)) |
561 | return; | 561 | return; |
562 | 562 | ||
563 | if (nvme_rdma_queue_idx(queue) == 0) { | ||
564 | nvme_rdma_free_qe(queue->device->dev, | ||
565 | &queue->ctrl->async_event_sqe, | ||
566 | sizeof(struct nvme_command), DMA_TO_DEVICE); | ||
567 | } | ||
568 | |||
569 | nvme_rdma_destroy_queue_ib(queue); | 563 | nvme_rdma_destroy_queue_ib(queue); |
570 | rdma_destroy_id(queue->cm_id); | 564 | rdma_destroy_id(queue->cm_id); |
571 | } | 565 | } |
@@ -698,7 +692,7 @@ static struct blk_mq_tag_set *nvme_rdma_alloc_tagset(struct nvme_ctrl *nctrl, | |||
698 | set = &ctrl->tag_set; | 692 | set = &ctrl->tag_set; |
699 | memset(set, 0, sizeof(*set)); | 693 | memset(set, 0, sizeof(*set)); |
700 | set->ops = &nvme_rdma_mq_ops; | 694 | set->ops = &nvme_rdma_mq_ops; |
701 | set->queue_depth = nctrl->opts->queue_size; | 695 | set->queue_depth = nctrl->sqsize + 1; |
702 | set->reserved_tags = 1; /* fabric connect */ | 696 | set->reserved_tags = 1; /* fabric connect */ |
703 | set->numa_node = NUMA_NO_NODE; | 697 | set->numa_node = NUMA_NO_NODE; |
704 | set->flags = BLK_MQ_F_SHOULD_MERGE; | 698 | set->flags = BLK_MQ_F_SHOULD_MERGE; |
@@ -734,11 +728,12 @@ out: | |||
734 | static void nvme_rdma_destroy_admin_queue(struct nvme_rdma_ctrl *ctrl, | 728 | static void nvme_rdma_destroy_admin_queue(struct nvme_rdma_ctrl *ctrl, |
735 | bool remove) | 729 | bool remove) |
736 | { | 730 | { |
737 | nvme_rdma_stop_queue(&ctrl->queues[0]); | ||
738 | if (remove) { | 731 | if (remove) { |
739 | blk_cleanup_queue(ctrl->ctrl.admin_q); | 732 | blk_cleanup_queue(ctrl->ctrl.admin_q); |
740 | nvme_rdma_free_tagset(&ctrl->ctrl, ctrl->ctrl.admin_tagset); | 733 | nvme_rdma_free_tagset(&ctrl->ctrl, ctrl->ctrl.admin_tagset); |
741 | } | 734 | } |
735 | nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe, | ||
736 | sizeof(struct nvme_command), DMA_TO_DEVICE); | ||
742 | nvme_rdma_free_queue(&ctrl->queues[0]); | 737 | nvme_rdma_free_queue(&ctrl->queues[0]); |
743 | } | 738 | } |
744 | 739 | ||
@@ -755,11 +750,16 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl, | |||
755 | 750 | ||
756 | ctrl->max_fr_pages = nvme_rdma_get_max_fr_pages(ctrl->device->dev); | 751 | ctrl->max_fr_pages = nvme_rdma_get_max_fr_pages(ctrl->device->dev); |
757 | 752 | ||
753 | error = nvme_rdma_alloc_qe(ctrl->device->dev, &ctrl->async_event_sqe, | ||
754 | sizeof(struct nvme_command), DMA_TO_DEVICE); | ||
755 | if (error) | ||
756 | goto out_free_queue; | ||
757 | |||
758 | if (new) { | 758 | if (new) { |
759 | ctrl->ctrl.admin_tagset = nvme_rdma_alloc_tagset(&ctrl->ctrl, true); | 759 | ctrl->ctrl.admin_tagset = nvme_rdma_alloc_tagset(&ctrl->ctrl, true); |
760 | if (IS_ERR(ctrl->ctrl.admin_tagset)) { | 760 | if (IS_ERR(ctrl->ctrl.admin_tagset)) { |
761 | error = PTR_ERR(ctrl->ctrl.admin_tagset); | 761 | error = PTR_ERR(ctrl->ctrl.admin_tagset); |
762 | goto out_free_queue; | 762 | goto out_free_async_qe; |
763 | } | 763 | } |
764 | 764 | ||
765 | ctrl->ctrl.admin_q = blk_mq_init_queue(&ctrl->admin_tag_set); | 765 | ctrl->ctrl.admin_q = blk_mq_init_queue(&ctrl->admin_tag_set); |
@@ -795,12 +795,6 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl, | |||
795 | if (error) | 795 | if (error) |
796 | goto out_stop_queue; | 796 | goto out_stop_queue; |
797 | 797 | ||
798 | error = nvme_rdma_alloc_qe(ctrl->queues[0].device->dev, | ||
799 | &ctrl->async_event_sqe, sizeof(struct nvme_command), | ||
800 | DMA_TO_DEVICE); | ||
801 | if (error) | ||
802 | goto out_stop_queue; | ||
803 | |||
804 | return 0; | 798 | return 0; |
805 | 799 | ||
806 | out_stop_queue: | 800 | out_stop_queue: |
@@ -811,6 +805,9 @@ out_cleanup_queue: | |||
811 | out_free_tagset: | 805 | out_free_tagset: |
812 | if (new) | 806 | if (new) |
813 | nvme_rdma_free_tagset(&ctrl->ctrl, ctrl->ctrl.admin_tagset); | 807 | nvme_rdma_free_tagset(&ctrl->ctrl, ctrl->ctrl.admin_tagset); |
808 | out_free_async_qe: | ||
809 | nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe, | ||
810 | sizeof(struct nvme_command), DMA_TO_DEVICE); | ||
814 | out_free_queue: | 811 | out_free_queue: |
815 | nvme_rdma_free_queue(&ctrl->queues[0]); | 812 | nvme_rdma_free_queue(&ctrl->queues[0]); |
816 | return error; | 813 | return error; |
@@ -819,7 +816,6 @@ out_free_queue: | |||
819 | static void nvme_rdma_destroy_io_queues(struct nvme_rdma_ctrl *ctrl, | 816 | static void nvme_rdma_destroy_io_queues(struct nvme_rdma_ctrl *ctrl, |
820 | bool remove) | 817 | bool remove) |
821 | { | 818 | { |
822 | nvme_rdma_stop_io_queues(ctrl); | ||
823 | if (remove) { | 819 | if (remove) { |
824 | blk_cleanup_queue(ctrl->ctrl.connect_q); | 820 | blk_cleanup_queue(ctrl->ctrl.connect_q); |
825 | nvme_rdma_free_tagset(&ctrl->ctrl, ctrl->ctrl.tagset); | 821 | nvme_rdma_free_tagset(&ctrl->ctrl, ctrl->ctrl.tagset); |
@@ -888,9 +884,9 @@ static void nvme_rdma_free_ctrl(struct nvme_ctrl *nctrl) | |||
888 | list_del(&ctrl->list); | 884 | list_del(&ctrl->list); |
889 | mutex_unlock(&nvme_rdma_ctrl_mutex); | 885 | mutex_unlock(&nvme_rdma_ctrl_mutex); |
890 | 886 | ||
891 | kfree(ctrl->queues); | ||
892 | nvmf_free_options(nctrl->opts); | 887 | nvmf_free_options(nctrl->opts); |
893 | free_ctrl: | 888 | free_ctrl: |
889 | kfree(ctrl->queues); | ||
894 | kfree(ctrl); | 890 | kfree(ctrl); |
895 | } | 891 | } |
896 | 892 | ||
@@ -949,6 +945,7 @@ static void nvme_rdma_reconnect_ctrl_work(struct work_struct *work) | |||
949 | return; | 945 | return; |
950 | 946 | ||
951 | destroy_admin: | 947 | destroy_admin: |
948 | nvme_rdma_stop_queue(&ctrl->queues[0]); | ||
952 | nvme_rdma_destroy_admin_queue(ctrl, false); | 949 | nvme_rdma_destroy_admin_queue(ctrl, false); |
953 | requeue: | 950 | requeue: |
954 | dev_info(ctrl->ctrl.device, "Failed reconnect attempt %d\n", | 951 | dev_info(ctrl->ctrl.device, "Failed reconnect attempt %d\n", |
@@ -965,12 +962,14 @@ static void nvme_rdma_error_recovery_work(struct work_struct *work) | |||
965 | 962 | ||
966 | if (ctrl->ctrl.queue_count > 1) { | 963 | if (ctrl->ctrl.queue_count > 1) { |
967 | nvme_stop_queues(&ctrl->ctrl); | 964 | nvme_stop_queues(&ctrl->ctrl); |
965 | nvme_rdma_stop_io_queues(ctrl); | ||
968 | blk_mq_tagset_busy_iter(&ctrl->tag_set, | 966 | blk_mq_tagset_busy_iter(&ctrl->tag_set, |
969 | nvme_cancel_request, &ctrl->ctrl); | 967 | nvme_cancel_request, &ctrl->ctrl); |
970 | nvme_rdma_destroy_io_queues(ctrl, false); | 968 | nvme_rdma_destroy_io_queues(ctrl, false); |
971 | } | 969 | } |
972 | 970 | ||
973 | blk_mq_quiesce_queue(ctrl->ctrl.admin_q); | 971 | blk_mq_quiesce_queue(ctrl->ctrl.admin_q); |
972 | nvme_rdma_stop_queue(&ctrl->queues[0]); | ||
974 | blk_mq_tagset_busy_iter(&ctrl->admin_tag_set, | 973 | blk_mq_tagset_busy_iter(&ctrl->admin_tag_set, |
975 | nvme_cancel_request, &ctrl->ctrl); | 974 | nvme_cancel_request, &ctrl->ctrl); |
976 | nvme_rdma_destroy_admin_queue(ctrl, false); | 975 | nvme_rdma_destroy_admin_queue(ctrl, false); |
@@ -1736,6 +1735,7 @@ static void nvme_rdma_shutdown_ctrl(struct nvme_rdma_ctrl *ctrl, bool shutdown) | |||
1736 | { | 1735 | { |
1737 | if (ctrl->ctrl.queue_count > 1) { | 1736 | if (ctrl->ctrl.queue_count > 1) { |
1738 | nvme_stop_queues(&ctrl->ctrl); | 1737 | nvme_stop_queues(&ctrl->ctrl); |
1738 | nvme_rdma_stop_io_queues(ctrl); | ||
1739 | blk_mq_tagset_busy_iter(&ctrl->tag_set, | 1739 | blk_mq_tagset_busy_iter(&ctrl->tag_set, |
1740 | nvme_cancel_request, &ctrl->ctrl); | 1740 | nvme_cancel_request, &ctrl->ctrl); |
1741 | nvme_rdma_destroy_io_queues(ctrl, shutdown); | 1741 | nvme_rdma_destroy_io_queues(ctrl, shutdown); |
@@ -1747,6 +1747,7 @@ static void nvme_rdma_shutdown_ctrl(struct nvme_rdma_ctrl *ctrl, bool shutdown) | |||
1747 | nvme_disable_ctrl(&ctrl->ctrl, ctrl->ctrl.cap); | 1747 | nvme_disable_ctrl(&ctrl->ctrl, ctrl->ctrl.cap); |
1748 | 1748 | ||
1749 | blk_mq_quiesce_queue(ctrl->ctrl.admin_q); | 1749 | blk_mq_quiesce_queue(ctrl->ctrl.admin_q); |
1750 | nvme_rdma_stop_queue(&ctrl->queues[0]); | ||
1750 | blk_mq_tagset_busy_iter(&ctrl->admin_tag_set, | 1751 | blk_mq_tagset_busy_iter(&ctrl->admin_tag_set, |
1751 | nvme_cancel_request, &ctrl->ctrl); | 1752 | nvme_cancel_request, &ctrl->ctrl); |
1752 | blk_mq_unquiesce_queue(ctrl->ctrl.admin_q); | 1753 | blk_mq_unquiesce_queue(ctrl->ctrl.admin_q); |
@@ -1932,11 +1933,6 @@ static struct nvme_ctrl *nvme_rdma_create_ctrl(struct device *dev, | |||
1932 | goto out_free_ctrl; | 1933 | goto out_free_ctrl; |
1933 | } | 1934 | } |
1934 | 1935 | ||
1935 | ret = nvme_init_ctrl(&ctrl->ctrl, dev, &nvme_rdma_ctrl_ops, | ||
1936 | 0 /* no quirks, we're perfect! */); | ||
1937 | if (ret) | ||
1938 | goto out_free_ctrl; | ||
1939 | |||
1940 | INIT_DELAYED_WORK(&ctrl->reconnect_work, | 1936 | INIT_DELAYED_WORK(&ctrl->reconnect_work, |
1941 | nvme_rdma_reconnect_ctrl_work); | 1937 | nvme_rdma_reconnect_ctrl_work); |
1942 | INIT_WORK(&ctrl->err_work, nvme_rdma_error_recovery_work); | 1938 | INIT_WORK(&ctrl->err_work, nvme_rdma_error_recovery_work); |
@@ -1950,14 +1946,19 @@ static struct nvme_ctrl *nvme_rdma_create_ctrl(struct device *dev, | |||
1950 | ctrl->queues = kcalloc(ctrl->ctrl.queue_count, sizeof(*ctrl->queues), | 1946 | ctrl->queues = kcalloc(ctrl->ctrl.queue_count, sizeof(*ctrl->queues), |
1951 | GFP_KERNEL); | 1947 | GFP_KERNEL); |
1952 | if (!ctrl->queues) | 1948 | if (!ctrl->queues) |
1953 | goto out_uninit_ctrl; | 1949 | goto out_free_ctrl; |
1950 | |||
1951 | ret = nvme_init_ctrl(&ctrl->ctrl, dev, &nvme_rdma_ctrl_ops, | ||
1952 | 0 /* no quirks, we're perfect! */); | ||
1953 | if (ret) | ||
1954 | goto out_kfree_queues; | ||
1954 | 1955 | ||
1955 | changed = nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_CONNECTING); | 1956 | changed = nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_CONNECTING); |
1956 | WARN_ON_ONCE(!changed); | 1957 | WARN_ON_ONCE(!changed); |
1957 | 1958 | ||
1958 | ret = nvme_rdma_configure_admin_queue(ctrl, true); | 1959 | ret = nvme_rdma_configure_admin_queue(ctrl, true); |
1959 | if (ret) | 1960 | if (ret) |
1960 | goto out_kfree_queues; | 1961 | goto out_uninit_ctrl; |
1961 | 1962 | ||
1962 | /* sanity check icdoff */ | 1963 | /* sanity check icdoff */ |
1963 | if (ctrl->ctrl.icdoff) { | 1964 | if (ctrl->ctrl.icdoff) { |
@@ -1974,20 +1975,19 @@ static struct nvme_ctrl *nvme_rdma_create_ctrl(struct device *dev, | |||
1974 | goto out_remove_admin_queue; | 1975 | goto out_remove_admin_queue; |
1975 | } | 1976 | } |
1976 | 1977 | ||
1977 | if (opts->queue_size > ctrl->ctrl.maxcmd) { | 1978 | /* only warn if argument is too large here, will clamp later */ |
1978 | /* warn if maxcmd is lower than queue_size */ | ||
1979 | dev_warn(ctrl->ctrl.device, | ||
1980 | "queue_size %zu > ctrl maxcmd %u, clamping down\n", | ||
1981 | opts->queue_size, ctrl->ctrl.maxcmd); | ||
1982 | opts->queue_size = ctrl->ctrl.maxcmd; | ||
1983 | } | ||
1984 | |||
1985 | if (opts->queue_size > ctrl->ctrl.sqsize + 1) { | 1979 | if (opts->queue_size > ctrl->ctrl.sqsize + 1) { |
1986 | /* warn if sqsize is lower than queue_size */ | ||
1987 | dev_warn(ctrl->ctrl.device, | 1980 | dev_warn(ctrl->ctrl.device, |
1988 | "queue_size %zu > ctrl sqsize %u, clamping down\n", | 1981 | "queue_size %zu > ctrl sqsize %u, clamping down\n", |
1989 | opts->queue_size, ctrl->ctrl.sqsize + 1); | 1982 | opts->queue_size, ctrl->ctrl.sqsize + 1); |
1990 | opts->queue_size = ctrl->ctrl.sqsize + 1; | 1983 | } |
1984 | |||
1985 | /* warn if maxcmd is lower than sqsize+1 */ | ||
1986 | if (ctrl->ctrl.sqsize + 1 > ctrl->ctrl.maxcmd) { | ||
1987 | dev_warn(ctrl->ctrl.device, | ||
1988 | "sqsize %u > ctrl maxcmd %u, clamping down\n", | ||
1989 | ctrl->ctrl.sqsize + 1, ctrl->ctrl.maxcmd); | ||
1990 | ctrl->ctrl.sqsize = ctrl->ctrl.maxcmd - 1; | ||
1991 | } | 1991 | } |
1992 | 1992 | ||
1993 | if (opts->nr_io_queues) { | 1993 | if (opts->nr_io_queues) { |
@@ -2013,15 +2013,16 @@ static struct nvme_ctrl *nvme_rdma_create_ctrl(struct device *dev, | |||
2013 | return &ctrl->ctrl; | 2013 | return &ctrl->ctrl; |
2014 | 2014 | ||
2015 | out_remove_admin_queue: | 2015 | out_remove_admin_queue: |
2016 | nvme_rdma_stop_queue(&ctrl->queues[0]); | ||
2016 | nvme_rdma_destroy_admin_queue(ctrl, true); | 2017 | nvme_rdma_destroy_admin_queue(ctrl, true); |
2017 | out_kfree_queues: | ||
2018 | kfree(ctrl->queues); | ||
2019 | out_uninit_ctrl: | 2018 | out_uninit_ctrl: |
2020 | nvme_uninit_ctrl(&ctrl->ctrl); | 2019 | nvme_uninit_ctrl(&ctrl->ctrl); |
2021 | nvme_put_ctrl(&ctrl->ctrl); | 2020 | nvme_put_ctrl(&ctrl->ctrl); |
2022 | if (ret > 0) | 2021 | if (ret > 0) |
2023 | ret = -EIO; | 2022 | ret = -EIO; |
2024 | return ERR_PTR(ret); | 2023 | return ERR_PTR(ret); |
2024 | out_kfree_queues: | ||
2025 | kfree(ctrl->queues); | ||
2025 | out_free_ctrl: | 2026 | out_free_ctrl: |
2026 | kfree(ctrl); | 2027 | kfree(ctrl); |
2027 | return ERR_PTR(ret); | 2028 | return ERR_PTR(ret); |
diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index a03da764ecae..74d4b785d2da 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c | |||
@@ -686,6 +686,14 @@ static void nvmet_start_ctrl(struct nvmet_ctrl *ctrl) | |||
686 | } | 686 | } |
687 | 687 | ||
688 | ctrl->csts = NVME_CSTS_RDY; | 688 | ctrl->csts = NVME_CSTS_RDY; |
689 | |||
690 | /* | ||
691 | * Controllers that are not yet enabled should not really enforce the | ||
692 | * keep alive timeout, but we still want to track a timeout and cleanup | ||
693 | * in case a host died before it enabled the controller. Hence, simply | ||
694 | * reset the keep alive timer when the controller is enabled. | ||
695 | */ | ||
696 | mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ); | ||
689 | } | 697 | } |
690 | 698 | ||
691 | static void nvmet_clear_ctrl(struct nvmet_ctrl *ctrl) | 699 | static void nvmet_clear_ctrl(struct nvmet_ctrl *ctrl) |
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 1da3d71e9f61..13948102ca29 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c | |||
@@ -3592,7 +3592,7 @@ fc_bsg_job_timeout(struct request *req) | |||
3592 | 3592 | ||
3593 | /* the blk_end_sync_io() doesn't check the error */ | 3593 | /* the blk_end_sync_io() doesn't check the error */ |
3594 | if (inflight) | 3594 | if (inflight) |
3595 | blk_mq_complete_request(req); | 3595 | __blk_complete_request(req); |
3596 | return BLK_EH_DONE; | 3596 | return BLK_EH_DONE; |
3597 | } | 3597 | } |
3598 | 3598 | ||
diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h index 0bd432a4d7bd..24251762c20c 100644 --- a/include/linux/backing-dev-defs.h +++ b/include/linux/backing-dev-defs.h | |||
@@ -22,7 +22,6 @@ struct dentry; | |||
22 | */ | 22 | */ |
23 | enum wb_state { | 23 | enum wb_state { |
24 | WB_registered, /* bdi_register() was done */ | 24 | WB_registered, /* bdi_register() was done */ |
25 | WB_shutting_down, /* wb_shutdown() in progress */ | ||
26 | WB_writeback_running, /* Writeback is in progress */ | 25 | WB_writeback_running, /* Writeback is in progress */ |
27 | WB_has_dirty_io, /* Dirty inodes on ->b_{dirty|io|more_io} */ | 26 | WB_has_dirty_io, /* Dirty inodes on ->b_{dirty|io|more_io} */ |
28 | WB_start_all, /* nr_pages == 0 (all) work pending */ | 27 | WB_start_all, /* nr_pages == 0 (all) work pending */ |
@@ -189,6 +188,7 @@ struct backing_dev_info { | |||
189 | #ifdef CONFIG_CGROUP_WRITEBACK | 188 | #ifdef CONFIG_CGROUP_WRITEBACK |
190 | struct radix_tree_root cgwb_tree; /* radix tree of active cgroup wbs */ | 189 | struct radix_tree_root cgwb_tree; /* radix tree of active cgroup wbs */ |
191 | struct rb_root cgwb_congested_tree; /* their congested states */ | 190 | struct rb_root cgwb_congested_tree; /* their congested states */ |
191 | struct mutex cgwb_release_mutex; /* protect shutdown of wb structs */ | ||
192 | #else | 192 | #else |
193 | struct bdi_writeback_congested *wb_congested; | 193 | struct bdi_writeback_congested *wb_congested; |
194 | #endif | 194 | #endif |
diff --git a/include/uapi/linux/nbd.h b/include/uapi/linux/nbd.h index 85a3fb65e40a..20d6cc91435d 100644 --- a/include/uapi/linux/nbd.h +++ b/include/uapi/linux/nbd.h | |||
@@ -53,6 +53,9 @@ enum { | |||
53 | /* These are client behavior specific flags. */ | 53 | /* These are client behavior specific flags. */ |
54 | #define NBD_CFLAG_DESTROY_ON_DISCONNECT (1 << 0) /* delete the nbd device on | 54 | #define NBD_CFLAG_DESTROY_ON_DISCONNECT (1 << 0) /* delete the nbd device on |
55 | disconnect. */ | 55 | disconnect. */ |
56 | #define NBD_CFLAG_DISCONNECT_ON_CLOSE (1 << 1) /* disconnect the nbd device on | ||
57 | * close by last opener. | ||
58 | */ | ||
56 | 59 | ||
57 | /* userspace doesn't need the nbd_device structure */ | 60 | /* userspace doesn't need the nbd_device structure */ |
58 | 61 | ||
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 347cc834c04a..2e5d3df0853d 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c | |||
@@ -359,15 +359,8 @@ static void wb_shutdown(struct bdi_writeback *wb) | |||
359 | spin_lock_bh(&wb->work_lock); | 359 | spin_lock_bh(&wb->work_lock); |
360 | if (!test_and_clear_bit(WB_registered, &wb->state)) { | 360 | if (!test_and_clear_bit(WB_registered, &wb->state)) { |
361 | spin_unlock_bh(&wb->work_lock); | 361 | spin_unlock_bh(&wb->work_lock); |
362 | /* | ||
363 | * Wait for wb shutdown to finish if someone else is just | ||
364 | * running wb_shutdown(). Otherwise we could proceed to wb / | ||
365 | * bdi destruction before wb_shutdown() is finished. | ||
366 | */ | ||
367 | wait_on_bit(&wb->state, WB_shutting_down, TASK_UNINTERRUPTIBLE); | ||
368 | return; | 362 | return; |
369 | } | 363 | } |
370 | set_bit(WB_shutting_down, &wb->state); | ||
371 | spin_unlock_bh(&wb->work_lock); | 364 | spin_unlock_bh(&wb->work_lock); |
372 | 365 | ||
373 | cgwb_remove_from_bdi_list(wb); | 366 | cgwb_remove_from_bdi_list(wb); |
@@ -379,12 +372,6 @@ static void wb_shutdown(struct bdi_writeback *wb) | |||
379 | mod_delayed_work(bdi_wq, &wb->dwork, 0); | 372 | mod_delayed_work(bdi_wq, &wb->dwork, 0); |
380 | flush_delayed_work(&wb->dwork); | 373 | flush_delayed_work(&wb->dwork); |
381 | WARN_ON(!list_empty(&wb->work_list)); | 374 | WARN_ON(!list_empty(&wb->work_list)); |
382 | /* | ||
383 | * Make sure bit gets cleared after shutdown is finished. Matches with | ||
384 | * the barrier provided by test_and_clear_bit() above. | ||
385 | */ | ||
386 | smp_wmb(); | ||
387 | clear_and_wake_up_bit(WB_shutting_down, &wb->state); | ||
388 | } | 375 | } |
389 | 376 | ||
390 | static void wb_exit(struct bdi_writeback *wb) | 377 | static void wb_exit(struct bdi_writeback *wb) |
@@ -508,10 +495,12 @@ static void cgwb_release_workfn(struct work_struct *work) | |||
508 | struct bdi_writeback *wb = container_of(work, struct bdi_writeback, | 495 | struct bdi_writeback *wb = container_of(work, struct bdi_writeback, |
509 | release_work); | 496 | release_work); |
510 | 497 | ||
498 | mutex_lock(&wb->bdi->cgwb_release_mutex); | ||
511 | wb_shutdown(wb); | 499 | wb_shutdown(wb); |
512 | 500 | ||
513 | css_put(wb->memcg_css); | 501 | css_put(wb->memcg_css); |
514 | css_put(wb->blkcg_css); | 502 | css_put(wb->blkcg_css); |
503 | mutex_unlock(&wb->bdi->cgwb_release_mutex); | ||
515 | 504 | ||
516 | fprop_local_destroy_percpu(&wb->memcg_completions); | 505 | fprop_local_destroy_percpu(&wb->memcg_completions); |
517 | percpu_ref_exit(&wb->refcnt); | 506 | percpu_ref_exit(&wb->refcnt); |
@@ -697,6 +686,7 @@ static int cgwb_bdi_init(struct backing_dev_info *bdi) | |||
697 | 686 | ||
698 | INIT_RADIX_TREE(&bdi->cgwb_tree, GFP_ATOMIC); | 687 | INIT_RADIX_TREE(&bdi->cgwb_tree, GFP_ATOMIC); |
699 | bdi->cgwb_congested_tree = RB_ROOT; | 688 | bdi->cgwb_congested_tree = RB_ROOT; |
689 | mutex_init(&bdi->cgwb_release_mutex); | ||
700 | 690 | ||
701 | ret = wb_init(&bdi->wb, bdi, 1, GFP_KERNEL); | 691 | ret = wb_init(&bdi->wb, bdi, 1, GFP_KERNEL); |
702 | if (!ret) { | 692 | if (!ret) { |
@@ -717,7 +707,10 @@ static void cgwb_bdi_unregister(struct backing_dev_info *bdi) | |||
717 | spin_lock_irq(&cgwb_lock); | 707 | spin_lock_irq(&cgwb_lock); |
718 | radix_tree_for_each_slot(slot, &bdi->cgwb_tree, &iter, 0) | 708 | radix_tree_for_each_slot(slot, &bdi->cgwb_tree, &iter, 0) |
719 | cgwb_kill(*slot); | 709 | cgwb_kill(*slot); |
710 | spin_unlock_irq(&cgwb_lock); | ||
720 | 711 | ||
712 | mutex_lock(&bdi->cgwb_release_mutex); | ||
713 | spin_lock_irq(&cgwb_lock); | ||
721 | while (!list_empty(&bdi->wb_list)) { | 714 | while (!list_empty(&bdi->wb_list)) { |
722 | wb = list_first_entry(&bdi->wb_list, struct bdi_writeback, | 715 | wb = list_first_entry(&bdi->wb_list, struct bdi_writeback, |
723 | bdi_node); | 716 | bdi_node); |
@@ -726,6 +719,7 @@ static void cgwb_bdi_unregister(struct backing_dev_info *bdi) | |||
726 | spin_lock_irq(&cgwb_lock); | 719 | spin_lock_irq(&cgwb_lock); |
727 | } | 720 | } |
728 | spin_unlock_irq(&cgwb_lock); | 721 | spin_unlock_irq(&cgwb_lock); |
722 | mutex_unlock(&bdi->cgwb_release_mutex); | ||
729 | } | 723 | } |
730 | 724 | ||
731 | /** | 725 | /** |