+/*
+ * function: zfcp_qdio_reqid_check
+ *
+ * purpose: checks for valid reqids or unsolicited status
+ *
+ * returns: 0 - valid request id or unsolicited status
+ * !0 - otherwise
+ */
+int
+zfcp_qdio_reqid_check(struct zfcp_adapter *adapter, void *sbale_addr)
+{
+ struct zfcp_fsf_req *fsf_req;
+
+ /* invalid (per convention used in this driver) */
+ if (unlikely(!sbale_addr)) {
+ ZFCP_LOG_NORMAL("bug: invalid reqid\n");
+ return -EINVAL;
+ }
+
+ /* valid request id and thus (hopefully :) valid fsf_req address */
+ fsf_req = (struct zfcp_fsf_req *) sbale_addr;
+
+ /* serialize with zfcp_fsf_req_dismiss_all */
+ spin_lock(&adapter->fsf_req_list_lock);
+ if (list_empty(&adapter->fsf_req_list_head)) {
+ spin_unlock(&adapter->fsf_req_list_lock);
+ return 0;
+ }
+ list_del(&fsf_req->list);
+ atomic_dec(&adapter->fsf_reqs_active);
+ spin_unlock(&adapter->fsf_req_list_lock);
+
+ if (unlikely(adapter != fsf_req->adapter)) {
+ ZFCP_LOG_NORMAL("bug: invalid reqid (fsf_req=%p, "
+ "fsf_req->adapter=%p, adapter=%p)\n",
+ fsf_req, fsf_req->adapter, adapter);
+ return -EINVAL;
+ }
+
+ /* finish the FSF request */
+ zfcp_fsf_req_complete(fsf_req);
+
+ return 0;
+}
+