From: Arne R. <arn...@xi...> - 2005-11-28 16:35:36
|
Hi, the following patch will avoid data digest calculation for PDUs whose data has been skipped already for various reasons, because a) IET will crash under certain circumstances, e.g. a Data Out for an inexistent SCSI command arrives and is consequently skipped - this will hit the assert() in digest_data(). b) we're not interested in the digest, anyway ;-) Arne diff -ruN r1267.local/kernel/digest.c r1267.ddfix/kernel/digest.c --- r1267.local/kernel/digest.c 2005-11-22 00:41:34.000000000 +0100 +++ r1267.ddfix/kernel/digest.c 2005-11-28 17:03:59.000000000 +0100 @@ -233,15 +233,22 @@ int digest_rx_data(struct iscsi_cmnd *cmnd) { struct tio *tio; + struct iscsi_cmnd *scsi_cmnd; + struct iscsi_data_out_hdr *req; u32 offset, crc; - if (cmnd_opcode(cmnd) == ISCSI_OP_SCSI_DATA_OUT) { - struct iscsi_cmnd *scsi_cmnd = cmnd->req; - struct iscsi_data_out_hdr *req = (struct iscsi_data_out_hdr *)&cmnd->pdu.bhs; - + switch (cmnd_opcode(cmnd)) { + case ISCSI_OP_SCSI_REJECT: + case ISCSI_OP_PDU_REJECT: + case ISCSI_OP_DATA_REJECT: + return 0; + case ISCSI_OP_SCSI_DATA_OUT: + scsi_cmnd = cmnd->req; + req = (struct iscsi_data_out_hdr *)&cmnd->pdu.bhs; tio = scsi_cmnd->tio; offset = be32_to_cpu(req->buffer_offset); - } else { + break; + default: tio = cmnd->tio; offset = 0; } |