VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / drivers / s390 / scsi / zfcp_fsf.c
index 85120ce..79451af 100644 (file)
@@ -29,7 +29,7 @@
  */
 
 /* this drivers version (do not edit !!! generated and updated by cvs) */
-#define ZFCP_FSF_C_REVISION "$Revision: 1.47 $"
+#define ZFCP_FSF_C_REVISION "$Revision: 1.55 $"
 
 #include "zfcp_ext.h"
 
@@ -180,8 +180,7 @@ zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter)
                ZFCP_LOG_DEBUG("fsf req list of adapter %s not yet empty\n",
                               zfcp_get_busid_by_adapter(adapter));
                /* wait for woken intiators to clean up their requests */
-               set_current_state(TASK_UNINTERRUPTIBLE);
-               schedule_timeout(ZFCP_FSFREQ_CLEANUP_TIMEOUT);
+               msleep(jiffies_to_msecs(ZFCP_FSFREQ_CLEANUP_TIMEOUT));
        }
 
        /* consistency check */
@@ -2620,6 +2619,7 @@ zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action)
 {
        int retval = 0;
        unsigned long lock_flags;
+       volatile struct qdio_buffer_element *sbale;
 
        /* setup new FSF request */
        retval = zfcp_fsf_req_create(erp_action->adapter,
@@ -2636,6 +2636,11 @@ zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action)
                goto out;
        }
 
+       sbale = zfcp_qdio_sbale_req(erp_action->fsf_req,
+                                   erp_action->fsf_req->sbal_curr, 0);
+       sbale[0].flags |= SBAL_FLAGS0_TYPE_READ;
+       sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY;
+
        /* mark port as being closed */
        atomic_set_mask(ZFCP_STATUS_PORT_PHYS_CLOSING,
                        &erp_action->port->status);
@@ -3997,15 +4002,14 @@ zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *fsf_req)
        scpnt->result |= fcp_rsp_iu->scsi_status;
        if (unlikely(fcp_rsp_iu->scsi_status)) {
                /* DEBUG */
-               ZFCP_LOG_NORMAL("status for SCSI Command:\n");
-               ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL,
+               ZFCP_LOG_DEBUG("status for SCSI Command:\n");
+               ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG,
                              scpnt->cmnd, scpnt->cmd_len);
-
-               ZFCP_LOG_NORMAL("SCSI status code 0x%x\n",
+               ZFCP_LOG_DEBUG("SCSI status code 0x%x\n",
                                fcp_rsp_iu->scsi_status);
-               ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL,
+               ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG,
                              (void *) fcp_rsp_iu, sizeof (struct fcp_rsp_iu));
-               ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL,
+               ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG,
                              zfcp_get_fcp_sns_info_ptr(fcp_rsp_iu),
                              fcp_rsp_iu->fcp_sns_len);
        }
@@ -4718,14 +4722,14 @@ zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter, int req_flags,
                      unsigned long *lock_flags)
 {
         int condition;
-        unsigned long timeout = ZFCP_SBAL_TIMEOUT;
         struct zfcp_qdio_queue *req_queue = &adapter->request_queue;
 
         if (unlikely(req_flags & ZFCP_WAIT_FOR_SBAL)) {
-                ZFCP_WAIT_EVENT_TIMEOUT(adapter->request_wq, timeout,
-                                        (condition =
-                                         (zfcp_fsf_req_create_sbal_check)
-                                         (lock_flags, req_queue, 1)));
+                wait_event_interruptible_timeout(adapter->request_wq,
+                                                (condition =
+                                                 zfcp_fsf_req_create_sbal_check
+                                                 (lock_flags, req_queue, 1)),
+                                                ZFCP_SBAL_TIMEOUT);
                 if (!condition) {
                         return -EIO;
                }
@@ -4782,6 +4786,17 @@ zfcp_fsf_req_create(struct zfcp_adapter *adapter, u32 fsf_cmd, int req_flags,
                 goto failed_sbals;
        }
 
+       /*
+        * We hold queue_lock here. Check if QDIOUP is set and let request fail
+        * if it is not set (see also *_open_qdio and *_close_qdio).
+        */
+
+       if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status)) {
+               write_unlock_irqrestore(&req_queue->queue_lock, *lock_flags);
+               ret = -EIO;
+               goto failed_sbals;
+       }
+
        fsf_req->adapter = adapter;     /* pointer to "parent" adapter */
        fsf_req->fsf_command = fsf_cmd;
        fsf_req->sbal_number = 1;