target: fix block limits VPD emulation
Subsystems (2)
RFC PATCH 1/1 target: fix block limits VPD emulation
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 <[email protected]>
drivers/target/target_core_cdb.c +17 -15
@@ -497,20 +497,18 @@ target_emulate_evpd_b0(struct se_cmd *cmif (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 ;/*
Quoted 4 lines · Christoph Hellwig
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 <[email protected]>
Postel's law +1 for hch. Commited as 462bc6c.
Thanks!
--nab
Quoted 51 lines
Index:
lio-core-2.6/drivers/target/target_core_cdb.c
===================================================================drivers/target/target_core_cdb.c +17
-15@@ -497,20 +497,18 @@ target_emulate_evpd_b0(struct se_cmd *cmif (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 ;/*