From: Dave Marquardt <[email protected]> Allocate and initialize the asynchronous sub-queue required for receiving full and extended FPIN events from VIOS.
Modify ibmvfc_alloc_channels() to allocate async_scrq using ibmvfc_alloc_queue() with IBMVFC_SUB_CRQ_FMT format. Update error handling to properly clean up async_scrq on allocation failures. Update ibmvfc_channel_setup() to pass async_subq_handle to VIOS during channel setup, and ibmvfc_channel_setup_done() to store the VIOS cookie for the async sub-queue. Modify ibmvfc_release_channels() to free async_scrq resources during cleanup. Signed-off-by: Dave Marquardt <[email protected]> --- drivers/scsi/ibmvscsi/ibmvfc-core.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/drivers/scsi/ibmvscsi/ibmvfc-core.c b/drivers/scsi/ibmvscsi/ibmvfc-core.c index aec953f29e55..06898a407d07 100644 --- a/drivers/scsi/ibmvscsi/ibmvfc-core.c +++ b/drivers/scsi/ibmvscsi/ibmvfc-core.c @@ -6726,6 +6726,17 @@ static int ibmvfc_alloc_channels(struct ibmvfc_host *vhost, if (!channels->scrqs) return -ENOMEM; + channels->async_scrq = kzalloc_obj(*channels->async_scrq, GFP_KERNEL); + if (!channels->async_scrq) { + rc = -ENOMEM; + goto free_scrqs; + } + + rc = ibmvfc_alloc_queue(vhost, channels->async_scrq, + IBMVFC_SUB_CRQ_FMT); + if (rc) + goto free_async; + for (i = 0; i < channels->max_queues; i++) { scrq = &channels->scrqs[i]; rc = ibmvfc_alloc_queue(vhost, scrq, IBMVFC_SUB_CRQ_FMT); @@ -6734,13 +6745,21 @@ static int ibmvfc_alloc_channels(struct ibmvfc_host *vhost, scrq = &channels->scrqs[j - 1]; ibmvfc_free_queue(vhost, scrq); } - kfree(channels->scrqs); - channels->scrqs = NULL; + ibmvfc_free_queue(vhost, channels->async_scrq); channels->active_queues = 0; - return rc; + goto free_async; } } + return rc; + +free_async: + kfree(channels->async_scrq); + channels->async_scrq = NULL; +free_scrqs: + kfree(channels->scrqs); + channels->scrqs = NULL; + return rc; } @@ -6782,8 +6801,15 @@ static void ibmvfc_release_channels(struct ibmvfc_host *vhost, kfree(channels->scrqs); channels->scrqs = NULL; + channels->active_queues = 0; } + + if (channels->async_scrq) { + ibmvfc_free_queue(vhost, channels->async_scrq); + kfree(channels->async_scrq); + channels->async_scrq = NULL; + } } static void ibmvfc_release_sub_crqs(struct ibmvfc_host *vhost) -- 2.55.0
