examples/dd: split out duplicate read capacity code
Use a helper function, rather than having duplicate source and destination READ CAPACITY logic. Signed-off-by: David Disseldorp <ddiss@suse.de>
This commit is contained in:
@@ -477,14 +477,56 @@ void cscd_param_check(struct iscsi_context *iscsi,
|
|||||||
scsi_free_scsi_task(task);
|
scsi_free_scsi_task(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void readcap(struct iscsi_context *iscsi, int lun, int use_16,
|
||||||
|
int *_blocksize, uint64_t *_num_blocks)
|
||||||
|
{
|
||||||
|
struct scsi_task *task;
|
||||||
|
|
||||||
|
if (use_16) {
|
||||||
|
struct scsi_readcapacity16 *rc16;
|
||||||
|
|
||||||
|
task = iscsi_readcapacity16_sync(iscsi, lun);
|
||||||
|
if (task == NULL || task->status != SCSI_STATUS_GOOD) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"failed to send readcapacity command\n");
|
||||||
|
exit(10);
|
||||||
|
}
|
||||||
|
rc16 = scsi_datain_unmarshall(task);
|
||||||
|
if (rc16 == NULL) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"failed to unmarshall readcapacity16 data\n");
|
||||||
|
exit(10);
|
||||||
|
}
|
||||||
|
*_blocksize = rc16->block_length;
|
||||||
|
*_num_blocks = rc16->returned_lba + 1;
|
||||||
|
} else {
|
||||||
|
struct scsi_readcapacity10 *rc10;
|
||||||
|
|
||||||
|
task = iscsi_readcapacity10_sync(iscsi, lun, 0, 0);
|
||||||
|
if (task == NULL || task->status != SCSI_STATUS_GOOD) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"failed to send readcapacity command\n");
|
||||||
|
exit(10);
|
||||||
|
}
|
||||||
|
rc10 = scsi_datain_unmarshall(task);
|
||||||
|
if (rc10 == NULL) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"failed to unmarshall readcapacity10 data\n");
|
||||||
|
exit(10);
|
||||||
|
}
|
||||||
|
*_blocksize = rc10->block_size;
|
||||||
|
*_num_blocks = rc10->lba;
|
||||||
|
}
|
||||||
|
|
||||||
|
scsi_free_scsi_task(task);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
char *src_url = NULL;
|
char *src_url = NULL;
|
||||||
char *dst_url = NULL;
|
char *dst_url = NULL;
|
||||||
struct iscsi_url *iscsi_url;
|
struct iscsi_url *iscsi_url;
|
||||||
struct scsi_task *task;
|
|
||||||
struct scsi_readcapacity10 *rc10;
|
|
||||||
struct scsi_readcapacity16 *rc16;
|
|
||||||
int c;
|
int c;
|
||||||
struct pollfd pfd[2];
|
struct pollfd pfd[2];
|
||||||
struct client client;
|
struct client client;
|
||||||
@@ -586,35 +628,8 @@ int main(int argc, char *argv[])
|
|||||||
client.src_lun = iscsi_url->lun;
|
client.src_lun = iscsi_url->lun;
|
||||||
iscsi_destroy_url(iscsi_url);
|
iscsi_destroy_url(iscsi_url);
|
||||||
|
|
||||||
if (client.use_16_for_rw) {
|
readcap(client.src_iscsi, client.src_lun, client.use_16_for_rw,
|
||||||
task = iscsi_readcapacity16_sync(client.src_iscsi, client.src_lun);
|
&client.src_blocksize, &client.src_num_blocks);
|
||||||
if (task == NULL || task->status != SCSI_STATUS_GOOD) {
|
|
||||||
fprintf(stderr, "failed to send readcapacity command\n");
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
rc16 = scsi_datain_unmarshall(task);
|
|
||||||
if (rc16 == NULL) {
|
|
||||||
fprintf(stderr, "failed to unmarshall readcapacity16 data\n");
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
client.src_blocksize = rc16->block_length;
|
|
||||||
client.src_num_blocks = rc16->returned_lba + 1;
|
|
||||||
scsi_free_scsi_task(task);
|
|
||||||
} else {
|
|
||||||
task = iscsi_readcapacity10_sync(client.src_iscsi, client.src_lun, 0, 0);
|
|
||||||
if (task == NULL || task->status != SCSI_STATUS_GOOD) {
|
|
||||||
fprintf(stderr, "failed to send readcapacity command\n");
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
rc10 = scsi_datain_unmarshall(task);
|
|
||||||
if (rc10 == NULL) {
|
|
||||||
fprintf(stderr, "failed to unmarshall readcapacity10 data\n");
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
client.src_blocksize = rc10->block_size;
|
|
||||||
client.src_num_blocks = rc10->lba;
|
|
||||||
scsi_free_scsi_task(task);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client.use_xcopy) {
|
if (client.use_xcopy) {
|
||||||
cscd_ident_inq(client.src_iscsi, client.src_lun,
|
cscd_ident_inq(client.src_iscsi, client.src_lun,
|
||||||
@@ -645,35 +660,8 @@ int main(int argc, char *argv[])
|
|||||||
client.dst_lun = iscsi_url->lun;
|
client.dst_lun = iscsi_url->lun;
|
||||||
iscsi_destroy_url(iscsi_url);
|
iscsi_destroy_url(iscsi_url);
|
||||||
|
|
||||||
if (client.use_16_for_rw) {
|
readcap(client.dst_iscsi, client.dst_lun, client.use_16_for_rw,
|
||||||
task = iscsi_readcapacity16_sync(client.dst_iscsi, client.dst_lun);
|
&client.dst_blocksize, &client.dst_num_blocks);
|
||||||
if (task == NULL || task->status != SCSI_STATUS_GOOD) {
|
|
||||||
fprintf(stderr, "failed to send readcapacity command\n");
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
rc16 = scsi_datain_unmarshall(task);
|
|
||||||
if (rc16 == NULL) {
|
|
||||||
fprintf(stderr, "failed to unmarshall readcapacity16 data\n");
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
client.dst_blocksize = rc16->block_length;
|
|
||||||
client.dst_num_blocks = rc16->returned_lba + 1;
|
|
||||||
scsi_free_scsi_task(task);
|
|
||||||
} else {
|
|
||||||
task = iscsi_readcapacity10_sync(client.dst_iscsi, client.dst_lun, 0, 0);
|
|
||||||
if (task == NULL || task->status != SCSI_STATUS_GOOD) {
|
|
||||||
fprintf(stderr, "failed to send readcapacity command\n");
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
rc10 = scsi_datain_unmarshall(task);
|
|
||||||
if (rc10 == NULL) {
|
|
||||||
fprintf(stderr, "failed to unmarshall readcapacity10 data\n");
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
client.dst_blocksize = rc10->block_size;
|
|
||||||
client.dst_num_blocks = rc10->lba;
|
|
||||||
scsi_free_scsi_task(task);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client.use_xcopy) {
|
if (client.use_xcopy) {
|
||||||
cscd_ident_inq(client.dst_iscsi, client.dst_lun,
|
cscd_ident_inq(client.dst_iscsi, client.dst_lun,
|
||||||
|
|||||||
Reference in New Issue
Block a user