Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=fdf234527a070f6fc89f3ec5ee4ae1b263e59939
Commit:     fdf234527a070f6fc89f3ec5ee4ae1b263e59939
Parent:     ba1724202aafed4bbc4a239ac6fb433f454fddea
Author:     Christof Schmitt <[EMAIL PROTECTED]>
AuthorDate: Thu Dec 20 12:30:27 2007 +0100
Committer:  James Bottomley <[EMAIL PROTECTED]>
CommitDate: Fri Jan 11 18:29:07 2008 -0600

    [SCSI] zfcp: Hold queue lock when checking port/unit handle for task 
management cmd
    
    We need to hold the queue-lock when checking whether we still have a valid
    unit/port handle for the task management command, i.e whether we can issue 
this
    request for this unit/port. If the error recovery is about to close this
    unit/port, then it competes for the queue-lock. If the close request issued 
by
    the error recovery wins, then it is guaranteed that this unit/port has been
    blocked for other requests.
    
    Signed-off-by: Christof Schmitt <[EMAIL PROTECTED]>
    Signed-off-by: Martin Peschke <[EMAIL PROTECTED]>
    Signed-off-by: James Bottomley <[EMAIL PROTECTED]>
---
 drivers/s390/scsi/zfcp_fsf.c |   26 +++++++++-----------------
 1 files changed, 9 insertions(+), 17 deletions(-)

diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c
index 17c251c..fe57941 100644
--- a/drivers/s390/scsi/zfcp_fsf.c
+++ b/drivers/s390/scsi/zfcp_fsf.c
@@ -3774,6 +3774,10 @@ zfcp_fsf_send_fcp_command_task_management(struct 
zfcp_adapter *adapter,
                goto out;
        }
 
+       if (unlikely(!atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED,
+                       &unit->status)))
+               goto unit_blocked;
+
        /*
         * Used to decide on proper handler in the return path,
         * could be either zfcp_fsf_send_fcp_command_task_handler or
@@ -3807,25 +3811,13 @@ zfcp_fsf_send_fcp_command_task_management(struct 
zfcp_adapter *adapter,
 
        zfcp_fsf_start_timer(fsf_req, ZFCP_SCSI_ER_TIMEOUT);
        retval = zfcp_fsf_req_send(fsf_req);
-       if (retval) {
-               ZFCP_LOG_INFO("error: Could not send an FCP-command (task "
-                             "management) on adapter %s, port 0x%016Lx for "
-                             "unit LUN 0x%016Lx\n",
-                             zfcp_get_busid_by_adapter(adapter),
-                             unit->port->wwpn,
-                             unit->fcp_lun);
-               zfcp_fsf_req_free(fsf_req);
-               fsf_req = NULL;
+       if (!retval)
                goto out;
-       }
 
-       ZFCP_LOG_TRACE("Send FCP Command (task management function) initiated "
-                      "(adapter %s, port 0x%016Lx, unit 0x%016Lx, "
-                      "tm_flags=0x%x)\n",
-                      zfcp_get_busid_by_adapter(adapter),
-                      unit->port->wwpn,
-                      unit->fcp_lun,
-                      tm_flags);
+ unit_blocked:
+       zfcp_fsf_req_free(fsf_req);
+       fsf_req = NULL;
+
  out:
        write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags);
        return fsf_req;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to