nvme-fc: set max_segments to lldd max value
authorJames Smart <jsmart2021@gmail.com>
Tue, 14 Jul 2020 19:03:36 +0000 (12:03 -0700)
committerChristoph Hellwig <hch@lst.de>
Wed, 29 Jul 2020 05:45:20 +0000 (07:45 +0200)
Currently the FC transport is set max_hw_sectors based on the lldds
max sgl segment count. However, the block queue max segments is
set based on the controller's max_segments count, which the transport
does not set.  As such, the lldd is receiving sgl lists that are
exceeding its max segment count.

Set the controller max segment count and derive max_hw_sectors from
the max segment count.

Signed-off-by: James Smart <jsmart2021@gmail.com>
Reviewed-by: Max Gurtovoy <maxg@mellanox.com>
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Reviewed-by: Ewan D. Milne <emilne@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/fc.c

index b27c54dc6683ed30574cc1eb139590c1672917ff..eae43bb444e03888c6c149874cab431c6e724763 100644 (file)
@@ -3002,8 +3002,9 @@ nvme_fc_create_association(struct nvme_fc_ctrl *ctrl)
        if (ret)
                goto out_disconnect_admin_queue;
 
-       ctrl->ctrl.max_hw_sectors =
-               (ctrl->lport->ops->max_sgl_segments - 1) << (PAGE_SHIFT - 9);
+       ctrl->ctrl.max_segments = ctrl->lport->ops->max_sgl_segments;
+       ctrl->ctrl.max_hw_sectors = ctrl->ctrl.max_segments <<
+                                               (ilog2(SZ_4K) - 9);
 
        blk_mq_unquiesce_queue(ctrl->ctrl.admin_q);