Convert all scsi task functions to use iovectors.

This commit is contained in:
Ronnie Sahlberg
2012-11-25 18:45:36 -08:00
parent 3ac9fdcbff
commit e86703b3aa
+214 -126
View File
@@ -530,8 +530,8 @@ iscsi_testunitready_task(struct iscsi_context *iscsi, int lun,
"testunitready cdb."); "testunitready cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -559,8 +559,8 @@ iscsi_reportluns_task(struct iscsi_context *iscsi, int report_type,
return NULL; return NULL;
} }
/* report luns are always sent to lun 0 */ /* report luns are always sent to lun 0 */
if (iscsi_scsi_command_async(iscsi, 0, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, 0, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -581,8 +581,8 @@ iscsi_inquiry_task(struct iscsi_context *iscsi, int lun, int evpd,
"inquiry cdb."); "inquiry cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -602,8 +602,8 @@ iscsi_readcapacity10_task(struct iscsi_context *iscsi, int lun, int lba,
"readcapacity10 cdb."); "readcapacity10 cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -623,8 +623,8 @@ iscsi_readcapacity16_task(struct iscsi_context *iscsi, int lun,
"readcapacity16 cdb."); "readcapacity16 cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -645,8 +645,8 @@ iscsi_get_lba_status_task(struct iscsi_context *iscsi, int lun,
"get-lba-status cdb."); "get-lba-status cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -673,8 +673,8 @@ iscsi_read6_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
"read6 cdb."); "read6 cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -703,8 +703,8 @@ iscsi_read10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
"read10 cdb."); "read10 cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -733,8 +733,8 @@ iscsi_read12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
"read12 cdb."); "read12 cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -763,8 +763,8 @@ iscsi_read16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
"read16 cdb."); "read16 cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -807,7 +807,7 @@ iscsi_write10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
NULL, private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -822,7 +822,6 @@ iscsi_write12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data outdata;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -837,12 +836,21 @@ iscsi_write12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
"write12 cdb."); "write12 cdb.");
return NULL; return NULL;
} }
if (data != NULL) {
struct scsi_iovec *iov;
outdata.data = data; iov = scsi_malloc(task, sizeof(struct scsi_iovec));
outdata.size = datalen; if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, &outdata, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -857,7 +865,6 @@ iscsi_write16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data outdata;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -872,12 +879,21 @@ iscsi_write16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
"write16 cdb."); "write16 cdb.");
return NULL; return NULL;
} }
if (data != NULL) {
struct scsi_iovec *iov;
outdata.data = data; iov = scsi_malloc(task, sizeof(struct scsi_iovec));
outdata.size = datalen; if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, &outdata, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -892,7 +908,6 @@ iscsi_orwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data outdata;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -907,12 +922,21 @@ iscsi_orwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
"orwrite cdb."); "orwrite cdb.");
return NULL; return NULL;
} }
if (data != NULL) {
struct scsi_iovec *iov;
outdata.data = data; iov = scsi_malloc(task, sizeof(struct scsi_iovec));
outdata.size = datalen; if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, &outdata, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -927,7 +951,6 @@ iscsi_compareandwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data outdata;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -942,12 +965,21 @@ iscsi_compareandwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
"compareandwrite cdb."); "compareandwrite cdb.");
return NULL; return NULL;
} }
if (data != NULL) {
struct scsi_iovec *iov;
outdata.data = data; iov = scsi_malloc(task, sizeof(struct scsi_iovec));
outdata.size = datalen; if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, &outdata, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -962,7 +994,6 @@ iscsi_writeverify10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data outdata;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -977,12 +1008,21 @@ iscsi_writeverify10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
"writeverify10 cdb."); "writeverify10 cdb.");
return NULL; return NULL;
} }
if (data != NULL) {
struct scsi_iovec *iov;
outdata.data = data; iov = scsi_malloc(task, sizeof(struct scsi_iovec));
outdata.size = datalen; if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, &outdata, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -997,7 +1037,6 @@ iscsi_writeverify12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data outdata;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -1012,12 +1051,21 @@ iscsi_writeverify12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
"writeverify12 cdb."); "writeverify12 cdb.");
return NULL; return NULL;
} }
if (data != NULL) {
struct scsi_iovec *iov;
outdata.data = data; iov = scsi_malloc(task, sizeof(struct scsi_iovec));
outdata.size = datalen; if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, &outdata, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1032,7 +1080,6 @@ iscsi_writeverify16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data outdata;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -1047,12 +1094,21 @@ iscsi_writeverify16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
"writeverify16 cdb."); "writeverify16 cdb.");
return NULL; return NULL;
} }
if (data != NULL) {
struct scsi_iovec *iov;
outdata.data = data; iov = scsi_malloc(task, sizeof(struct scsi_iovec));
outdata.size = datalen; if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, &outdata, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1066,7 +1122,6 @@ iscsi_verify10_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data outdata;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -1080,13 +1135,21 @@ iscsi_verify10_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
"verify10 cdb."); "verify10 cdb.");
return NULL; return NULL;
} }
if (data != NULL) {
struct scsi_iovec *iov;
/* We only transfer data if BYTCHK is true */ iov = scsi_malloc(task, sizeof(struct scsi_iovec));
outdata.data = bytchk ? data : NULL; if (iov == NULL) {
outdata.size = bytchk ? datalen : 0; scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, &outdata, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1100,7 +1163,6 @@ iscsi_verify12_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data outdata;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -1114,13 +1176,21 @@ iscsi_verify12_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
"verify12 cdb."); "verify12 cdb.");
return NULL; return NULL;
} }
if (data != NULL) {
struct scsi_iovec *iov;
/* We only transfer data if BYTCHK is true */ iov = scsi_malloc(task, sizeof(struct scsi_iovec));
outdata.data = bytchk ? data : NULL; if (iov == NULL) {
outdata.size = bytchk ? datalen : 0; scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, &outdata, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1134,7 +1204,6 @@ iscsi_verify16_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data outdata;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -1148,13 +1217,21 @@ iscsi_verify16_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
"verify16 cdb."); "verify16 cdb.");
return NULL; return NULL;
} }
if (data != NULL) {
struct scsi_iovec *iov;
/* We only transfer data if BYTCHK is true */ iov = scsi_malloc(task, sizeof(struct scsi_iovec));
outdata.data = bytchk ? data : NULL; if (iov == NULL) {
outdata.size = bytchk ? datalen : 0; scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, &outdata, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1177,8 +1254,8 @@ iscsi_modesense6_task(struct iscsi_context *iscsi, int lun, int dbd, int pc,
"modesense6 cdb."); "modesense6 cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1201,8 +1278,8 @@ iscsi_startstopunit_task(struct iscsi_context *iscsi, int lun,
"startstopunit cdb."); "startstopunit cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1223,8 +1300,8 @@ iscsi_preventallow_task(struct iscsi_context *iscsi, int lun,
"PreventAllowMediumRemoval cdb."); "PreventAllowMediumRemoval cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1246,8 +1323,8 @@ iscsi_synchronizecache10_task(struct iscsi_context *iscsi, int lun, int lba,
"synchronizecache10 cdb."); "synchronizecache10 cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1269,8 +1346,8 @@ iscsi_synchronizecache16_task(struct iscsi_context *iscsi, int lun, uint64_t lba
"synchronizecache16 cdb."); "synchronizecache16 cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1291,8 +1368,8 @@ iscsi_prefetch10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
"prefetch10 cdb."); "prefetch10 cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1313,8 +1390,8 @@ iscsi_prefetch16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
"prefetch16 cdb."); "prefetch16 cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1331,7 +1408,6 @@ iscsi_writesame10_task(struct iscsi_context *iscsi, int lun,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data outdata;
task = scsi_cdb_writesame10(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks); task = scsi_cdb_writesame10(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks);
if (task == NULL) { if (task == NULL) {
@@ -1340,25 +1416,28 @@ iscsi_writesame10_task(struct iscsi_context *iscsi, int lun,
return NULL; return NULL;
} }
if (datalen) { if (data != NULL) {
outdata.data = data; struct scsi_iovec *iov;
outdata.size = datalen;
task->expxferlen = datalen;
if (iscsi_scsi_command_async(iscsi, lun, task, cb, &outdata, iov = scsi_malloc(task, sizeof(struct scsi_iovec));
private_data) != 0) { if (iov == NULL) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
task->expxferlen = datalen;
} else { } else {
task->expxferlen = 0; task->expxferlen = 0;
task->xfer_dir = SCSI_XFER_NONE; task->xfer_dir = SCSI_XFER_NONE;
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
}
} }
return task; return task;
@@ -1373,7 +1452,6 @@ iscsi_writesame16_task(struct iscsi_context *iscsi, int lun,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data outdata;
task = scsi_cdb_writesame16(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks); task = scsi_cdb_writesame16(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks);
if (task == NULL) { if (task == NULL) {
@@ -1382,25 +1460,29 @@ iscsi_writesame16_task(struct iscsi_context *iscsi, int lun,
return NULL; return NULL;
} }
if (datalen) { if (data != NULL) {
outdata.data = data; struct scsi_iovec *iov;
outdata.size = datalen;
task->expxferlen = datalen;
if (iscsi_scsi_command_async(iscsi, lun, task, cb, &outdata, iov = scsi_malloc(task, sizeof(struct scsi_iovec));
private_data) != 0) { if (iov == NULL) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
task->expxferlen = datalen;
} else { } else {
task->expxferlen = 0; task->expxferlen = 0;
task->xfer_dir = SCSI_XFER_NONE; task->xfer_dir = SCSI_XFER_NONE;
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
}
} }
return task; return task;
@@ -1412,7 +1494,7 @@ iscsi_unmap_task(struct iscsi_context *iscsi, int lun, int anchor, int group,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data outdata; struct scsi_iovec *iov;
unsigned char *data; unsigned char *data;
int xferlen; int xferlen;
int i; int i;
@@ -1441,11 +1523,17 @@ iscsi_unmap_task(struct iscsi_context *iscsi, int lun, int anchor, int group,
scsi_set_uint32(&data[8 + 16 * i + 8], list[0].num); scsi_set_uint32(&data[8 + 16 * i + 8], list[0].num);
} }
outdata.data = data; iov = scsi_malloc(task, sizeof(struct scsi_iovec));
outdata.size = xferlen; if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = xferlen;
scsi_task_set_iov_out(task, iov, 1);
if (iscsi_scsi_command_async(iscsi, lun, task, cb, &outdata, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1492,8 +1580,8 @@ iscsi_readtoc_task(struct iscsi_context *iscsi, int lun, int msf,
"read TOC cdb."); "read TOC cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1513,8 +1601,8 @@ iscsi_reserve6_task(struct iscsi_context *iscsi, int lun,
"reserve6 cdb."); "reserve6 cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1534,8 +1622,8 @@ iscsi_release6_task(struct iscsi_context *iscsi, int lun,
"release6 cdb."); "release6 cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1556,8 +1644,8 @@ iscsi_report_supported_opcodes_task(struct iscsi_context *iscsi,
"Maintenance In/Read Supported Op Codes cdb."); "Maintenance In/Read Supported Op Codes cdb.");
return NULL; return NULL;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
private_data) != 0) { NULL, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }