[SCSI] zfcp: Update FC pass-through support
authorChristof Schmitt <christof.schmitt@de.ibm.com>
Fri, 15 May 2009 11:18:22 +0000 (13:18 +0200)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Fri, 12 Jun 2009 19:20:06 +0000 (14:20 -0500)
Don't access the block layer request, get the payload length instead
from the FC job. Simplify access to the zfcp_port, only the d_id is
required, if the port is no longer accessed later. This is possible
when the els_handler does not access the port pointer from the ELS
request.

Reviewed-by: Swen Schillig <swen@vnet.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/s390/scsi/zfcp_fc.c
drivers/s390/scsi/zfcp_fsf.c

index da10e0df68798ad27a7f7010eb390097972d184a..538c68dc7bb8f30df3798deb86c8afb7fb792f00 100644 (file)
@@ -704,7 +704,7 @@ static void zfcp_fc_generic_els_handler(unsigned long data)
        }
 
        reply->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK;
-       reply->reply_payload_rcv_len = blk_rq_bytes(job->req->next_rq);
+       reply->reply_payload_rcv_len = job->reply_payload.payload_len;
 
 out:
        job->state_flags = FC_RQST_STATE_DONE;
@@ -736,15 +736,12 @@ int zfcp_fc_execute_els_fc_job(struct fc_bsg_job *job)
                read_lock_irq(&zfcp_data.config_lock);
                port = rport->dd_data;
                if (port)
-                       zfcp_port_get(port);
+                       els_fc_job->els.d_id = port->d_id;
                read_unlock_irq(&zfcp_data.config_lock);
                if (!port) {
                        kfree(els_fc_job);
                        return -EINVAL;
                }
-               els_fc_job->els.port = port;
-               els_fc_job->els.d_id = port->d_id;
-               zfcp_port_put(port);
        } else {
                port_did = job->request->rqst_data.h_els.port_id;
                els_fc_job->els.d_id = (port_did[0] << 16) +
@@ -772,8 +769,8 @@ static void zfcp_fc_generic_ct_handler(unsigned long data)
 
        job->reply->reply_data.ctels_reply.status = ct_fc_job->ct.status ?
                                FC_CTELS_STATUS_REJECT : FC_CTELS_STATUS_OK;
+       job->reply->reply_payload_rcv_len = job->reply_payload.payload_len;
        job->state_flags = FC_RQST_STATE_DONE;
-       job->reply->reply_payload_rcv_len = blk_rq_bytes(job->req->next_rq);
        job->job_done(job);
 
        zfcp_wka_port_put(ct_fc_job->ct.wka_port);
index e6dae3744e7981c348ddd554dbdf6dd27049c98f..c57658f3d34f60a9f8c49bb57ccb7c157b9ddb8b 100644 (file)
@@ -1146,7 +1146,8 @@ static void zfcp_fsf_send_els_handler(struct zfcp_fsf_req *req)
        case FSF_RESPONSE_SIZE_TOO_LARGE:
                break;
        case FSF_ACCESS_DENIED:
-               zfcp_fsf_access_denied_port(req, port);
+               if (port)
+                       zfcp_fsf_access_denied_port(req, port);
                break;
        case FSF_SBAL_MISMATCH:
                /* should never occure, avoided in zfcp_fsf_send_els */