aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/target_core_pscsi.c
diff options
context:
space:
mode:
authorAndy Grover <agrover@redhat.com>2011-07-20 15:13:28 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2011-07-22 05:37:48 -0400
commit05d1c7c0d0db4cc25548d9aadebb416888a82327 (patch)
tree290243526d188a7f6a683b0e13a63c7207471fa1 /drivers/target/target_core_pscsi.c
parente22a7f075226c51f3f71b922e9eeb4f99fac1475 (diff)
target: Make all control CDBs scatter-gather
Previously, some control CDBs did not allocate memory in pages for their data buffer, but just did a kmalloc. This patch makes all cdbs allocate pages. This has the benefit of streamlining some paths that had to behave differently when we used two allocation methods. The downside is that all accesses to the data buffer need to kmap it before use, and need to handle data in page-sized chunks if more than a page is needed for a given command's data buffer. Finally, note that cdbs with no data buffers are handled a little differently. Before, SCSI_NON_DATA_CDBs would not call get_mem at all (they'd be in the final else in transport_allocate_resources) but now these will make it into generic_get_mem, but just not allocate any buffers. Signed-off-by: Andy Grover <agrover@redhat.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target/target_core_pscsi.c')
-rw-r--r--drivers/target/target_core_pscsi.c32
1 files changed, 3 insertions, 29 deletions
diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c
index 3574c520a5f4..d9569242e3dc 100644
--- a/drivers/target/target_core_pscsi.c
+++ b/drivers/target/target_core_pscsi.c
@@ -695,7 +695,7 @@ static int pscsi_transport_complete(struct se_task *task)
695 695
696 if (task->task_se_cmd->se_deve->lun_flags & 696 if (task->task_se_cmd->se_deve->lun_flags &
697 TRANSPORT_LUNFLAGS_READ_ONLY) { 697 TRANSPORT_LUNFLAGS_READ_ONLY) {
698 unsigned char *buf = task->task_se_cmd->t_task_buf; 698 unsigned char *buf = transport_kmap_first_data_page(task->task_se_cmd);
699 699
700 if (cdb[0] == MODE_SENSE_10) { 700 if (cdb[0] == MODE_SENSE_10) {
701 if (!(buf[3] & 0x80)) 701 if (!(buf[3] & 0x80))
@@ -704,6 +704,8 @@ static int pscsi_transport_complete(struct se_task *task)
704 if (!(buf[2] & 0x80)) 704 if (!(buf[2] & 0x80))
705 buf[2] |= 0x80; 705 buf[2] |= 0x80;
706 } 706 }
707
708 transport_kunmap_first_data_page(task->task_se_cmd);
707 } 709 }
708 } 710 }
709after_mode_sense: 711after_mode_sense:
@@ -1246,33 +1248,6 @@ static int pscsi_map_task_SG(struct se_task *task)
1246 return 0; 1248 return 0;
1247} 1249}
1248 1250
1249/* pscsi_map_task_non_SG():
1250 *
1251 *
1252 */
1253static int pscsi_map_task_non_SG(struct se_task *task)
1254{
1255 struct se_cmd *cmd = task->task_se_cmd;
1256 struct pscsi_plugin_task *pt = PSCSI_TASK(task);
1257 struct pscsi_dev_virt *pdv = task->se_dev->dev_ptr;
1258 int ret = 0;
1259
1260 if (pscsi_blk_get_request(task) < 0)
1261 return PYX_TRANSPORT_LU_COMM_FAILURE;
1262
1263 if (!task->task_size)
1264 return 0;
1265
1266 ret = blk_rq_map_kern(pdv->pdv_sd->request_queue,
1267 pt->pscsi_req, cmd->t_task_buf,
1268 task->task_size, GFP_KERNEL);
1269 if (ret < 0) {
1270 printk(KERN_ERR "PSCSI: blk_rq_map_kern() failed: %d\n", ret);
1271 return PYX_TRANSPORT_LU_COMM_FAILURE;
1272 }
1273 return 0;
1274}
1275
1276static int pscsi_CDB_none(struct se_task *task) 1251static int pscsi_CDB_none(struct se_task *task)
1277{ 1252{
1278 return pscsi_blk_get_request(task); 1253 return pscsi_blk_get_request(task);
@@ -1392,7 +1367,6 @@ static struct se_subsystem_api pscsi_template = {
1392 .owner = THIS_MODULE, 1367 .owner = THIS_MODULE,
1393 .transport_type = TRANSPORT_PLUGIN_PHBA_PDEV, 1368 .transport_type = TRANSPORT_PLUGIN_PHBA_PDEV,
1394 .cdb_none = pscsi_CDB_none, 1369 .cdb_none = pscsi_CDB_none,
1395 .map_task_non_SG = pscsi_map_task_non_SG,
1396 .map_task_SG = pscsi_map_task_SG, 1370 .map_task_SG = pscsi_map_task_SG,
1397 .attach_hba = pscsi_attach_hba, 1371 .attach_hba = pscsi_attach_hba,
1398 .detach_hba = pscsi_detach_hba, 1372 .detach_hba = pscsi_detach_hba,