/* FSF request status (this does not have a common part) */
 #define ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT     0x00000002
-#define ZFCP_STATUS_FSFREQ_COMPLETED           0x00000004
 #define ZFCP_STATUS_FSFREQ_ERROR               0x00000008
 #define ZFCP_STATUS_FSFREQ_CLEANUP             0x00000010
 #define ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED      0x00000040
        u8                     sbale_curr;     /* current SBALE during creation
                                                  of request */
        u8                      sbal_response;  /* SBAL used in interrupt */
-       wait_queue_head_t      completion_wq;  /* can be used by a routine
+       struct completion       completion;     /* can be used by a routine
                                                  to wait for completion */
        u32                     status;        /* status of this request */
        u32                    fsf_command;    /* FSF Command copy */
 
 
        if (req->erp_action)
                zfcp_erp_notify(req->erp_action, 0);
-       req->status |= ZFCP_STATUS_FSFREQ_COMPLETED;
 
        if (likely(req->status & ZFCP_STATUS_FSFREQ_CLEANUP))
                zfcp_fsf_req_free(req);
        else
-       /* notify initiator waiting for the requests completion */
-       /*
-        * FIXME: Race! We must not access fsf_req here as it might have been
-        * cleaned up already due to the set ZFCP_STATUS_FSFREQ_COMPLETED
-        * flag. It's an improbable case. But, we have the same paranoia for
-        * the cleanup flag already.
-        * Might better be handled using complete()?
-        * (setting the flag and doing wakeup ought to be atomic
-        *  with regard to checking the flag as long as waitqueue is
-        *  part of the to be released structure)
-        */
-               wake_up(&req->completion_wq);
+               complete(&req->completion);
 }
 
 /**
 
        INIT_LIST_HEAD(&req->list);
        init_timer(&req->timer);
-       init_waitqueue_head(&req->completion_wq);
+       init_completion(&req->completion);
 
        req->adapter = adapter;
        req->fsf_command = fsf_cmd;
        retval = zfcp_fsf_req_send(req);
        spin_unlock_bh(&adapter->req_q_lock);
        if (!retval)
-               wait_event(req->completion_wq,
-                          req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
+               wait_for_completion(&req->completion);
 
        zfcp_fsf_req_free(req);
        return retval;
        spin_unlock_bh(&adapter->req_q_lock);
 
        if (!retval)
-               wait_event(req->completion_wq,
-                          req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
+               wait_for_completion(&req->completion);
+
        zfcp_fsf_req_free(req);
 
        return retval;
        spin_unlock_bh(&adapter->req_q_lock);
 
        if (!retval) {
-               wait_event(req->completion_wq,
-                          req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
+               wait_for_completion(&req->completion);
                return req;
        }
        return ERR_PTR(retval);
 
        if (!abrt_req)
                return FAILED;
 
-       wait_event(abrt_req->completion_wq,
-                  abrt_req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
+       wait_for_completion(&abrt_req->completion);
 
        if (abrt_req->status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED)
                dbf_tag = "okay";
        if (!fsf_req)
                return FAILED;
 
-       wait_event(fsf_req->completion_wq,
-                  fsf_req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
+       wait_for_completion(&fsf_req->completion);
 
        if (fsf_req->status & ZFCP_STATUS_FSFREQ_TMFUNCFAILED) {
                zfcp_scsi_dbf_event_devreset("fail", tm_flags, unit, scpnt);