Just because our target supports TP the initiator doesn't have. Handle short block limit VPD requests even if TP is supported. Signed-off-by: Christoph Hellwig <hch@xxxxxx> Index: lio-core-2.6/drivers/target/target_core_cdb.c =================================================================== --- lio-core-2.6.orig/drivers/target/target_core_cdb.c 2010-11-09 12:12:21.908196346 +0100 +++ lio-core-2.6/drivers/target/target_core_cdb.c 2010-11-09 12:15:14.691529680 +0100 @@ -497,20 +497,18 @@ target_emulate_evpd_b0(struct se_cmd *cm if (DEV_ATTRIB(dev)->emulate_tpu || DEV_ATTRIB(dev)->emulate_tpws) have_tp = 1; - if (have_tp) { - if (cmd->data_length < (0x3c + 4)) { - printk(KERN_INFO "Received data_length: %u" - " too small for TPE=1 EVPD 0xb0\n", - cmd->data_length); - return -1; - } - } else { - if (cmd->data_length < (0x10 + 4)) { - printk(KERN_INFO "Received data_length: %u" - " too small for TPE=1 EVPD 0xb0\n", - cmd->data_length); - return -1; - } + if (cmd->data_length < (0x10 + 4)) { + printk(KERN_INFO "Received data_length: %u" + " too small for EVPD 0xb0\n", + cmd->data_length); + return -1; + } + + if (have_tp && cmd->data_length < (0x3c + 4)) { + printk(KERN_INFO "Received data_length: %u" + " too small for TPE=1 EVPD 0xb0\n", + cmd->data_length); + have_tp = 0; } buf[0] = dev->transport->get_device_type(dev); @@ -532,7 +530,11 @@ target_emulate_evpd_b0(struct se_cmd *cm */ put_unaligned_be32(DEV_ATTRIB(dev)->optimal_sectors, &buf[12]); - if (!have_tp) + /* + * Exit now if we don't support TP or the initiator sent a too + * short buffer. + */ + if (!have_tp || cmd->data_length < (0x3c + 4)) return 0; /* -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html