[SCSI] libfc: fix fc_els_resp_type to correct display of CT responses
authorJoe Eykholt <jeykholt@cisco.com>
Tue, 3 Nov 2009 19:49:00 +0000 (11:49 -0800)
committerJames Bottomley <James.Bottomley@suse.de>
Fri, 4 Dec 2009 18:01:17 +0000 (12:01 -0600)
Local port debug messages were using fc_els_resp_type() which showed
all CT responses as rejects.

Handle CT responses correctly based by inspecting fh_type.

I decided not to rename the function to keep the patch smaller.
We could call it just fc_resp_type() or fc_elsct_resp_type().

Signed-off-by: Joe Eykholt <jeykholt@cisco.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/libfc/fc_elsct.c

index 01be43f80f34741083d11c6c859f6c0fbe7b8bd0..53748724f2c52e55b8aa93ebf8bd9cfc554a7015 100644 (file)
@@ -90,6 +90,9 @@ EXPORT_SYMBOL(fc_elsct_init);
 const char *fc_els_resp_type(struct fc_frame *fp)
 {
        const char *msg;
+       struct fc_frame_header *fh;
+       struct fc_ct_hdr *ct;
+
        if (IS_ERR(fp)) {
                switch (-PTR_ERR(fp)) {
                case FC_NO_ERR:
@@ -106,15 +109,41 @@ const char *fc_els_resp_type(struct fc_frame *fp)
                        break;
                }
        } else {
-               switch (fc_frame_payload_op(fp)) {
-               case ELS_LS_ACC:
-                       msg = "accept";
+               fh = fc_frame_header_get(fp);
+               switch (fh->fh_type) {
+               case FC_TYPE_ELS:
+                       switch (fc_frame_payload_op(fp)) {
+                       case ELS_LS_ACC:
+                               msg = "accept";
+                               break;
+                       case ELS_LS_RJT:
+                               msg = "reject";
+                               break;
+                       default:
+                               msg = "response unknown ELS";
+                               break;
+                       }
                        break;
-               case ELS_LS_RJT:
-                       msg = "reject";
+               case FC_TYPE_CT:
+                       ct = fc_frame_payload_get(fp, sizeof(*ct));
+                       if (ct) {
+                               switch (ntohs(ct->ct_cmd)) {
+                               case FC_FS_ACC:
+                                       msg = "CT accept";
+                                       break;
+                               case FC_FS_RJT:
+                                       msg = "CT reject";
+                                       break;
+                               default:
+                                       msg = "response unknown CT";
+                                       break;
+                               }
+                       } else {
+                               msg = "short CT response";
+                       }
                        break;
                default:
-                       msg = "response unknown ELS";
+                       msg = "response not ELS or CT";
                        break;
                }
        }