|
@@ -600,30 +600,11 @@ static int spc_emulate_inquiry(struct se_cmd *cmd)
|
|
|
{
|
|
|
struct se_device *dev = cmd->se_dev;
|
|
|
struct se_portal_group *tpg = cmd->se_lun->lun_sep->sep_tpg;
|
|
|
- unsigned char *buf, *map_buf;
|
|
|
+ unsigned char *rbuf;
|
|
|
unsigned char *cdb = cmd->t_task_cdb;
|
|
|
+ unsigned char buf[SE_INQUIRY_BUF];
|
|
|
int p, ret;
|
|
|
|
|
|
- map_buf = transport_kmap_data_sg(cmd);
|
|
|
- /*
|
|
|
- * If SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC is not set, then we
|
|
|
- * know we actually allocated a full page. Otherwise, if the
|
|
|
- * data buffer is too small, allocate a temporary buffer so we
|
|
|
- * don't have to worry about overruns in all our INQUIRY
|
|
|
- * emulation handling.
|
|
|
- */
|
|
|
- if (cmd->data_length < SE_INQUIRY_BUF &&
|
|
|
- (cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC)) {
|
|
|
- buf = kzalloc(SE_INQUIRY_BUF, GFP_KERNEL);
|
|
|
- if (!buf) {
|
|
|
- transport_kunmap_data_sg(cmd);
|
|
|
- cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
- } else {
|
|
|
- buf = map_buf;
|
|
|
- }
|
|
|
-
|
|
|
if (dev == tpg->tpg_virt_lun0.lun_se_dev)
|
|
|
buf[0] = 0x3f; /* Not connected */
|
|
|
else
|
|
@@ -655,11 +636,11 @@ static int spc_emulate_inquiry(struct se_cmd *cmd)
|
|
|
ret = -EINVAL;
|
|
|
|
|
|
out:
|
|
|
- if (buf != map_buf) {
|
|
|
- memcpy(map_buf, buf, cmd->data_length);
|
|
|
- kfree(buf);
|
|
|
+ rbuf = transport_kmap_data_sg(cmd);
|
|
|
+ if (rbuf) {
|
|
|
+ memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length));
|
|
|
+ transport_kunmap_data_sg(cmd);
|
|
|
}
|
|
|
- transport_kunmap_data_sg(cmd);
|
|
|
|
|
|
if (!ret)
|
|
|
target_complete_cmd(cmd, GOOD);
|