From dc577d554a274b79a6ad05e9e1ac20c320200599 Mon Sep 17 00:00:00 2001 From: Christof Schmitt Date: Fri, 15 May 2009 13:18:22 +0200 Subject: [SCSI] zfcp: Update FC pass-through support 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 Signed-off-by: Christof Schmitt Signed-off-by: James Bottomley --- drivers/s390/scsi/zfcp_fc.c | 9 +++------ drivers/s390/scsi/zfcp_fsf.c | 3 ++- 2 files changed, 5 insertions(+), 7 deletions(-) (limited to 'drivers/s390') diff --git a/drivers/s390/scsi/zfcp_fc.c b/drivers/s390/scsi/zfcp_fc.c index da10e0df6879..538c68dc7bb8 100644 --- a/drivers/s390/scsi/zfcp_fc.c +++ b/drivers/s390/scsi/zfcp_fc.c @@ -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); diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index e6dae3744e79..c57658f3d34f 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c @@ -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 */ -- cgit v1.2.1