void readcapacity10_cb(struct iscsi_context *iscsi, int status, void *command_data, void *private_data) { struct client_state *clnt = (struct client_state *)private_data; struct scsi_task *task = command_data; struct scsi_readcapacity10 *rc10; int full_size; if (status == ISCSI_STATUS_CHECK_CONDITION) { printf("Readcapacity10 failed with sense key:%d ascq:%04x\n", task->sense.key, task->sense.ascq); exit(10); } full_size = scsi_datain_getfullsize(task); if (full_size < task->datain.size) { printf("not enough data for full size readcapacity10\n"); exit(10); } rc10 = scsi_datain_unmarshall(task); if (rc10 == NULL) { printf("failed to unmarshall readcapacity10 data\n"); exit(10); } clnt->block_size = rc10->block_size; printf("READCAPACITY10 successful. Size:%d blocks blocksize:%d. Read first block\n", rc10->lba, rc10->block_size); free(rc10); if (iscsi_read10_async(iscsi, clnt->lun, read10_cb, 0, clnt->block_size, clnt->block_size, private_data) != 0) { printf("failed to send read10 command\n"); exit(10); } }
void fill_read_queue(struct client *client) { int num_blocks; while(client->in_flight < max_in_flight && client->pos < client->src_num_blocks) { client->in_flight++; num_blocks = client->src_num_blocks - client->pos; if (num_blocks > blocks_per_io) { num_blocks = blocks_per_io; } if (iscsi_read10_async(client->src_iscsi, client->src_lun, client->pos, num_blocks * client->src_blocksize, client->src_blocksize, read10_cb, client) != 0) { printf("failed to send read10 command\n"); exit(10); } client->pos += num_blocks; } }