/* When a request has been completed either from the FCP adapter, or it has been dismissed due to a queue shutdown, this function is called to process the completion status and trigger further events related to the FSF request.  */
static void zfcp_fsf_req_complete(struct zfcp_fsf_req *req)
/* When a request has been completed either from the FCP adapter, or it has been dismissed due to a queue shutdown, this function is called to process the completion status and trigger further events related to the FSF request.  */
static void zfcp_fsf_req_complete(struct zfcp_fsf_req *req)
{
	if (unlikely(req->fsf_command == FSF_QTCB_UNSOLICITED_STATUS)) {
		zfcp_fsf_status_read_handler(req);
		return;
	}
	del_timer(&req->timer);
	zfcp_fsf_protstatus_eval(req);
	zfcp_fsf_fsfstatus_eval(req);
	req->handler(req);
	if (req->erp_action)
		zfcp_erp_notify(req->erp_action, 0);
	if (likely(req->status & ZFCP_STATUS_FSFREQ_CLEANUP))
		zfcp_fsf_req_free(req);
	else
		complete(&req->completion);
}