Skip to content

Commit

Permalink
target: remove SCF_EMULATE_CDB_ASYNC
Browse files Browse the repository at this point in the history
All ->execute_task instances now need to complete the I/O explicitly,
which can either happen synchronously or asynchronously.

Note that a lot of the CDB emulations appear to return success even if
some lowlevel operations failed.  Given that this is an existing issue
this patch doesn't change that fact.

(nab: Adding missing switch breaks in PR-IN + PR_OUT)

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
  • Loading branch information
Christoph Hellwig authored and Nicholas Bellinger committed Nov 4, 2011
1 parent 6ed5a55 commit d29a5b6
Show file tree
Hide file tree
Showing 6 changed files with 142 additions and 100 deletions.
5 changes: 4 additions & 1 deletion drivers/target/target_core_alua.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,8 @@ int target_emulate_report_target_port_groups(struct se_task *task)

transport_kunmap_first_data_page(cmd);

task->task_scsi_status = GOOD;
transport_complete_task(task, 1);
return 0;
}

Expand Down Expand Up @@ -343,7 +345,8 @@ int target_emulate_set_target_port_groups(struct se_task *task)

out:
transport_kunmap_first_data_page(cmd);

task->task_scsi_status = GOOD;
transport_complete_task(task, 1);
return 0;
}

Expand Down
58 changes: 40 additions & 18 deletions drivers/target/target_core_cdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -688,8 +688,10 @@ target_emulate_inquiry(struct se_task *task)
unsigned char *cdb = cmd->t_task_cdb;
int p, ret;

if (!(cdb[1] & 0x1))
return target_emulate_inquiry_std(cmd);
if (!(cdb[1] & 0x1)) {
ret = target_emulate_inquiry_std(cmd);
goto out;
}

/*
* Make sure we at least have 4 bytes of INQUIRY response
Expand All @@ -708,17 +710,25 @@ target_emulate_inquiry(struct se_task *task)

buf[0] = dev->transport->get_device_type(dev);

for (p = 0; p < ARRAY_SIZE(evpd_handlers); ++p)
for (p = 0; p < ARRAY_SIZE(evpd_handlers); ++p) {
if (cdb[2] == evpd_handlers[p].page) {
buf[1] = cdb[2];
ret = evpd_handlers[p].emulate(cmd, buf);
transport_kunmap_first_data_page(cmd);
return ret;
goto out_unmap;
}
}

transport_kunmap_first_data_page(cmd);
pr_err("Unknown VPD Code: 0x%02x\n", cdb[2]);
return -EINVAL;
ret = -EINVAL;

out_unmap:
transport_kunmap_first_data_page(cmd);
out:
if (!ret) {
task->task_scsi_status = GOOD;
transport_complete_task(task, 1);
}
return ret;
}

static int
Expand Down Expand Up @@ -753,6 +763,8 @@ target_emulate_readcapacity(struct se_task *task)

transport_kunmap_first_data_page(cmd);

task->task_scsi_status = GOOD;
transport_complete_task(task, 1);
return 0;
}

Expand Down Expand Up @@ -787,6 +799,8 @@ target_emulate_readcapacity_16(struct se_task *task)

transport_kunmap_first_data_page(cmd);

task->task_scsi_status = GOOD;
transport_complete_task(task, 1);
return 0;
}

Expand Down Expand Up @@ -1000,6 +1014,8 @@ target_emulate_modesense(struct se_task *task)
memcpy(rbuf, buf, offset);
transport_kunmap_first_data_page(cmd);

task->task_scsi_status = GOOD;
transport_complete_task(task, 1);
return 0;
}

Expand Down Expand Up @@ -1065,7 +1081,8 @@ target_emulate_request_sense(struct se_task *task)

end:
transport_kunmap_first_data_page(cmd);

task->task_scsi_status = GOOD;
transport_complete_task(task, 1);
return 0;
}

Expand Down Expand Up @@ -1122,7 +1139,10 @@ target_emulate_unmap(struct se_task *task)

err:
transport_kunmap_first_data_page(cmd);

if (!ret) {
task->task_scsi_status = GOOD;
transport_complete_task(task, 1);
}
return ret;
}

Expand Down Expand Up @@ -1171,6 +1191,8 @@ target_emulate_write_same(struct se_task *task)
return ret;
}

task->task_scsi_status = GOOD;
transport_complete_task(task, 1);
return 0;
}

Expand All @@ -1189,6 +1211,14 @@ target_emulate_synchronize_cache(struct se_task *task)
return 0;
}

static int
target_emulate_noop(struct se_task *task)
{
task->task_scsi_status = GOOD;
transport_complete_task(task, 1);
return 0;
}

int
transport_emulate_control_cdb(struct se_task *task)
{
Expand Down Expand Up @@ -1259,6 +1289,7 @@ transport_emulate_control_cdb(struct se_task *task)
case TEST_UNIT_READY:
case VERIFY:
case WRITE_FILEMARKS:
ret = target_emulate_noop(task);
break;
default:
pr_err("Unsupported SCSI Opcode: 0x%02x for %s\n",
Expand All @@ -1268,15 +1299,6 @@ transport_emulate_control_cdb(struct se_task *task)

if (ret < 0)
return ret;
/*
* Handle the successful completion here unless a caller
* has explictly requested an asychronous completion.
*/
if (!(cmd->se_cmd_flags & SCF_EMULATE_CDB_ASYNC)) {
task->task_scsi_status = GOOD;
transport_complete_task(task, 1);
}

return PYX_TRANSPORT_SENT_TO_TRANSPORT;
}

Expand Down
2 changes: 2 additions & 0 deletions drivers/target/target_core_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -705,6 +705,8 @@ int target_report_luns(struct se_task *se_task)
buf[2] = ((lun_count >> 8) & 0xff);
buf[3] = (lun_count & 0xff);

se_task->task_scsi_status = GOOD;
transport_complete_task(se_task, 1);
return PYX_TRANSPORT_SENT_TO_TRANSPORT;
}

Expand Down
Loading

0 comments on commit d29a5b6

Please sign in to comment.