}
 }
 
-static int zfcp_fsf_sbal_check(struct zfcp_adapter *adapter)
+static int zfcp_fsf_sbal_available(struct zfcp_adapter *adapter)
 {
-       struct zfcp_qdio_queue *req_q = &adapter->req_q;
-
-       spin_lock_bh(&adapter->req_q_lock);
-       if (atomic_read(&req_q->count))
+       if (atomic_read(&adapter->req_q.count) > 0)
                return 1;
-       spin_unlock_bh(&adapter->req_q_lock);
+       atomic_inc(&adapter->qdio_outb_full);
        return 0;
 }
 
-static int zfcp_fsf_sbal_available(struct zfcp_adapter *adapter)
-{
-       unsigned int count = atomic_read(&adapter->req_q.count);
-       if (!count)
-               atomic_inc(&adapter->qdio_outb_full);
-       return count > 0;
-}
-
 static int zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter)
+       __releases(&adapter->req_q_lock)
+       __acquires(&adapter->req_q_lock)
 {
+       struct zfcp_qdio_queue *req_q = &adapter->req_q;
        long ret;
 
+       if (atomic_read(&req_q->count) <= -REQUEST_LIST_SIZE)
+               return -EIO;
+       if (atomic_read(&req_q->count) > 0)
+               return 0;
+
+       atomic_dec(&req_q->count);
        spin_unlock_bh(&adapter->req_q_lock);
        ret = wait_event_interruptible_timeout(adapter->request_wq,
-                                       zfcp_fsf_sbal_check(adapter), 5 * HZ);
+                                       atomic_read(&req_q->count) >= 0,
+                                       5 * HZ);
+       spin_lock_bh(&adapter->req_q_lock);
+       atomic_inc(&req_q->count);
+
        if (ret > 0)
                return 0;
        if (!ret)
                atomic_inc(&adapter->qdio_outb_full);
-
-       spin_lock_bh(&adapter->req_q_lock);
        return -EIO;
 }