| From abe1043e83dc129aeb30ceb6cb78406531e4ffa7 Mon Sep 17 00:00:00 2001 |
| From: Sagi Grimberg <sagi@grimberg.me> |
| Date: Fri, 2 Nov 2018 11:22:13 -0700 |
| Subject: nvme: make sure ns head inherits underlying device limits |
| |
| [ Upstream commit 8f676b8508c250bbe255096522fdefb73f1ea0b9 ] |
| |
| Whenever we update ns_head info, we need to make sure it is still |
| compatible with all underlying backing devices because although nvme |
| multipath doesn't have any explicit use of these limits, other devices |
| can still be stacked on top of it which may rely on the underlying limits. |
| Start with unlimited stacking limits, and every info update iterate over |
| siblings and adjust queue limits. |
| |
| Signed-off-by: Sagi Grimberg <sagi@grimberg.me> |
| Signed-off-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/nvme/host/core.c | 4 +++- |
| drivers/nvme/host/multipath.c | 1 + |
| 2 files changed, 4 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c |
| index 6bb9908bf46f..0ba301f7e8b4 100644 |
| --- a/drivers/nvme/host/core.c |
| +++ b/drivers/nvme/host/core.c |
| @@ -1519,8 +1519,10 @@ static void __nvme_revalidate_disk(struct gendisk *disk, struct nvme_id_ns *id) |
| if (ns->ndev) |
| nvme_nvm_update_nvm_info(ns); |
| #ifdef CONFIG_NVME_MULTIPATH |
| - if (ns->head->disk) |
| + if (ns->head->disk) { |
| nvme_update_disk_info(ns->head->disk, ns, id); |
| + blk_queue_stack_limits(ns->head->disk->queue, ns->queue); |
| + } |
| #endif |
| } |
| |
| diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c |
| index b71c9ad1bf45..c27af277e14e 100644 |
| --- a/drivers/nvme/host/multipath.c |
| +++ b/drivers/nvme/host/multipath.c |
| @@ -257,6 +257,7 @@ int nvme_mpath_alloc_disk(struct nvme_ctrl *ctrl, struct nvme_ns_head *head) |
| blk_queue_flag_set(QUEUE_FLAG_NONROT, q); |
| /* set to a default value for 512 until disk is validated */ |
| blk_queue_logical_block_size(q, 512); |
| + blk_set_stacking_limits(&q->limits); |
| |
| /* we need to propagate up the VMC settings */ |
| if (ctrl->vwc & NVME_CTRL_VWC_PRESENT) |
| -- |
| 2.17.1 |
| |