diff options
author | Mike Christie <michaelc@cs.wisc.edu> | 2008-01-31 14:36:53 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-02-07 19:02:37 -0500 |
commit | 8b1d03434ee44b08c57f50403eaeab099facebf5 (patch) | |
tree | 48d7c5aeb3b765284dcc3d8685ed6ea6aed350cb /drivers/scsi | |
parent | 322d739da83bbff0309c202181f79c08d9534880 (diff) |
[SCSI] libiscsi: fix session age rollover and remove cid encoding
The session age mask is only 4 bits, but session->age is 32. When
it gets larger then 15 and we try to or the bits some bits get
dropped and the check for session age in iscsi_verify_itt is useless.
The ISCSI_CID_MASK related bits are also useless since cid is always
one.
Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/libiscsi.c | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 10ba76285852..59f8445eab0d 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c | |||
@@ -160,7 +160,7 @@ static int iscsi_prep_scsi_cmd_pdu(struct iscsi_cmd_task *ctask) | |||
160 | hdr->opcode = ISCSI_OP_SCSI_CMD; | 160 | hdr->opcode = ISCSI_OP_SCSI_CMD; |
161 | hdr->flags = ISCSI_ATTR_SIMPLE; | 161 | hdr->flags = ISCSI_ATTR_SIMPLE; |
162 | int_to_scsilun(sc->device->lun, (struct scsi_lun *)hdr->lun); | 162 | int_to_scsilun(sc->device->lun, (struct scsi_lun *)hdr->lun); |
163 | hdr->itt = build_itt(ctask->itt, conn->id, session->age); | 163 | hdr->itt = build_itt(ctask->itt, session->age); |
164 | hdr->data_length = cpu_to_be32(scsi_bufflen(sc)); | 164 | hdr->data_length = cpu_to_be32(scsi_bufflen(sc)); |
165 | hdr->cmdsn = cpu_to_be32(session->cmdsn); | 165 | hdr->cmdsn = cpu_to_be32(session->cmdsn); |
166 | session->cmdsn++; | 166 | session->cmdsn++; |
@@ -705,14 +705,6 @@ int iscsi_verify_itt(struct iscsi_conn *conn, struct iscsi_hdr *hdr, | |||
705 | return ISCSI_ERR_BAD_ITT; | 705 | return ISCSI_ERR_BAD_ITT; |
706 | } | 706 | } |
707 | 707 | ||
708 | if (((__force u32)hdr->itt & ISCSI_CID_MASK) != | ||
709 | (conn->id << ISCSI_CID_SHIFT)) { | ||
710 | iscsi_conn_printk(KERN_ERR, conn, | ||
711 | "iscsi: received itt %x, expected " | ||
712 | "CID (%x)\n", | ||
713 | (__force u32)hdr->itt, conn->id); | ||
714 | return ISCSI_ERR_BAD_ITT; | ||
715 | } | ||
716 | itt = get_itt(hdr->itt); | 708 | itt = get_itt(hdr->itt); |
717 | } else | 709 | } else |
718 | itt = ~0U; | 710 | itt = ~0U; |
@@ -776,7 +768,7 @@ static void iscsi_prep_mtask(struct iscsi_conn *conn, | |||
776 | */ | 768 | */ |
777 | nop->cmdsn = cpu_to_be32(session->cmdsn); | 769 | nop->cmdsn = cpu_to_be32(session->cmdsn); |
778 | if (hdr->itt != RESERVED_ITT) { | 770 | if (hdr->itt != RESERVED_ITT) { |
779 | hdr->itt = build_itt(mtask->itt, conn->id, session->age); | 771 | hdr->itt = build_itt(mtask->itt, session->age); |
780 | /* | 772 | /* |
781 | * TODO: We always use immediate, so we never hit this. | 773 | * TODO: We always use immediate, so we never hit this. |
782 | * If we start to send tmfs or nops as non-immediate then | 774 | * If we start to send tmfs or nops as non-immediate then |
@@ -2036,6 +2028,8 @@ int iscsi_conn_start(struct iscsi_cls_conn *cls_conn) | |||
2036 | conn->stop_stage = 0; | 2028 | conn->stop_stage = 0; |
2037 | conn->tmf_state = TMF_INITIAL; | 2029 | conn->tmf_state = TMF_INITIAL; |
2038 | session->age++; | 2030 | session->age++; |
2031 | if (session->age == 16) | ||
2032 | session->age = 0; | ||
2039 | break; | 2033 | break; |
2040 | case STOP_CONN_TERM: | 2034 | case STOP_CONN_TERM: |
2041 | conn->stop_stage = 0; | 2035 | conn->stop_stage = 0; |