]> err.no Git - linux-2.6/blobdiff - drivers/scsi/iscsi_tcp.c
Merge branch 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband
[linux-2.6] / drivers / scsi / iscsi_tcp.c
index 13411ca3d64852a3593837bd0a97ad7beb955d47..4fea3e4edaa7148803fcfa8bbe49c83a538bcb51 100644 (file)
@@ -49,7 +49,7 @@ MODULE_AUTHOR("Dmitry Yusupov <dmitry_yus@yahoo.com>, "
              "Alex Aizman <itn780@yahoo.com>");
 MODULE_DESCRIPTION("iSCSI/TCP data-path");
 MODULE_LICENSE("GPL");
-
+MODULE_VERSION("0:4.409");
 /* #define DEBUG_TCP */
 /* #define DEBUG_SCSI */
 #define DEBUG_ASSERT
@@ -672,34 +672,6 @@ iscsi_hdr_recv(struct iscsi_conn *conn)
                        else
                                rc = ISCSI_ERR_PROTO;
                        break;
-               case ISCSI_OP_NOOP_IN:
-               case ISCSI_OP_TEXT_RSP:
-               case ISCSI_OP_LOGOUT_RSP:
-               case ISCSI_OP_ASYNC_EVENT:
-               case ISCSI_OP_REJECT:
-                       rc = iscsi_check_assign_cmdsn(session,
-                                                (struct iscsi_nopin*)hdr);
-                       if (rc)
-                               break;
-
-                       /* update ExpStatSN */
-                       conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1;
-                       if (!conn->in.datalen) {
-                               struct iscsi_mgmt_task *mtask;
-
-                               rc = iscsi_recv_pdu(iscsi_handle(conn), hdr,
-                                                   NULL, 0);
-                               mtask = (struct iscsi_mgmt_task *)
-                                       session->mgmt_cmds[conn->in.itt -
-                                               ISCSI_MGMT_ITT_OFFSET];
-                               if (conn->login_mtask != mtask) {
-                                       spin_lock(&session->lock);
-                                       __kfifo_put(session->mgmtpool.queue,
-                                           (void*)&mtask, sizeof(void*));
-                                       spin_unlock(&session->lock);
-                               }
-                       }
-                       break;
                default:
                        rc = ISCSI_ERR_BAD_OPCODE;
                        break;
@@ -718,6 +690,7 @@ iscsi_hdr_recv(struct iscsi_conn *conn)
                switch(conn->in.opcode) {
                case ISCSI_OP_LOGIN_RSP:
                case ISCSI_OP_TEXT_RSP:
+               case ISCSI_OP_LOGOUT_RSP: 
                        rc = iscsi_check_assign_cmdsn(session,
                                                 (struct iscsi_nopin*)hdr);
                        if (rc)
@@ -758,20 +731,59 @@ iscsi_hdr_recv(struct iscsi_conn *conn)
                        }
                        spin_unlock(&session->lock);
                        break;
+               case ISCSI_OP_NOOP_IN: 
+                       if (hdr->ttt != ISCSI_RESERVED_TAG) {
+                               rc = ISCSI_ERR_PROTO;
+                               break;
+                       }
+                       rc = iscsi_check_assign_cmdsn(session, 
+                                               (struct iscsi_nopin*)hdr);
+                       if (rc)
+                               break;
+                       conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1;
+
+                       if (!conn->in.datalen) {
+                               struct iscsi_mgmt_task *mtask;
+
+                               rc = iscsi_recv_pdu(iscsi_handle(conn), hdr,
+                                                   NULL, 0);
+                               mtask = (struct iscsi_mgmt_task *)
+                                       session->mgmt_cmds[conn->in.itt -
+                                                       ISCSI_MGMT_ITT_OFFSET];
+                               if (conn->login_mtask != mtask) {
+                                       spin_lock(&session->lock);
+                                       __kfifo_put(session->mgmtpool.queue,
+                                                 (void*)&mtask, sizeof(void*));
+                                       spin_unlock(&session->lock);
+                               }
+                       }
+                       break;
                default:
                        rc = ISCSI_ERR_BAD_OPCODE;
                        break;
                }
        } else if (conn->in.itt == ISCSI_RESERVED_TAG) {
-               if (conn->in.opcode == ISCSI_OP_NOOP_IN && !conn->in.datalen) {
-                       rc = iscsi_check_assign_cmdsn(session,
+               switch(conn->in.opcode) {
+               case ISCSI_OP_NOOP_IN:
+                       if (!conn->in.datalen) {
+                               rc = iscsi_check_assign_cmdsn(session,
                                                 (struct iscsi_nopin*)hdr);
-                       if (!rc)
-                               rc = iscsi_recv_pdu(iscsi_handle(conn),
-                                                   hdr, NULL, 0);
-               }
-               else
+                               if (!rc && hdr->ttt != ISCSI_RESERVED_TAG)
+                                       rc = iscsi_recv_pdu(iscsi_handle(conn),
+                                                           hdr, NULL, 0);
+                       } else 
+                               rc = ISCSI_ERR_PROTO;
+                       break;
+               case ISCSI_OP_REJECT:
+                       /* we need sth like iscsi_reject_rsp()*/
+               case ISCSI_OP_ASYNC_EVENT:
+                       /* we need sth like iscsi_async_event_rsp() */
+                       rc = ISCSI_ERR_BAD_OPCODE;
+                       break;
+               default:
                        rc = ISCSI_ERR_BAD_OPCODE;
+                       break;
+               }
        } else
                rc = ISCSI_ERR_BAD_ITT;