Lines Matching +full:bl +full:- +full:name
4 * Copyright (c) 2010-2011 Ronnie Sahlberg <ronniesahlberg@gmail.com>
5 * Copyright (c) 2012-2017 Peter Lieven <pl@kamp.de>
32 #include "qemu/config-file.h"
33 #include "qemu/error-report.h"
36 #include "block/block-io.h"
46 #include "qapi/qapi-commands-machine.h"
57 #include <iscsi/scsi-lowlevel.h>
78 struct scsi_inquiry_block_limits bl; member
83 * unallocated pages (iscsilun->lprz) we can directly return zeros instead
143 /* this threshold is a trade-off knob to choose between
159 qemu_bh_delete(acb->bh); in iscsi_bh_cb()
161 acb->common.cb(acb->common.opaque, acb->status); in iscsi_bh_cb()
163 if (acb->task != NULL) { in iscsi_bh_cb()
164 scsi_free_scsi_task(acb->task); in iscsi_bh_cb()
165 acb->task = NULL; in iscsi_bh_cb()
174 if (acb->bh) { in iscsi_schedule_bh()
177 acb->bh = aio_bh_new(acb->iscsilun->aio_context, iscsi_bh_cb, acb); in iscsi_schedule_bh()
178 qemu_bh_schedule(acb->bh); in iscsi_schedule_bh()
187 iTask->complete = 1; in iscsi_co_generic_bh_cb()
188 aio_co_wake(iTask->co); in iscsi_co_generic_bh_cb()
194 iTask->complete = 1; in iscsi_retry_timer_expired()
195 if (iTask->co) { in iscsi_retry_timer_expired()
196 aio_co_wake(iTask->co); in iscsi_retry_timer_expired()
202 return -mean * log((double)rand() / RAND_MAX); in exp_random()
230 return scsi_sense_to_errno(sense->key, in iscsi_translate_sense()
231 (sense->ascq & 0xFF00) >> 8, in iscsi_translate_sense()
232 sense->ascq & 0xFF); in iscsi_translate_sense()
243 iTask->status = status; in iscsi_co_generic_cb()
244 iTask->do_retry = 0; in iscsi_co_generic_cb()
245 iTask->err_code = 0; in iscsi_co_generic_cb()
246 iTask->task = task; in iscsi_co_generic_cb()
249 iTask->err_code = -EIO; in iscsi_co_generic_cb()
250 if (iTask->retries++ < ISCSI_CMD_RETRIES) { in iscsi_co_generic_cb()
255 exp_random(iscsi_retry_times[iTask->retries - 1]); in iscsi_co_generic_cb()
260 iTask->iscsilun->request_timed_out = true; in iscsi_co_generic_cb()
264 iTask->retries, retry_time, in iscsi_co_generic_cb()
266 aio_timer_init(iTask->iscsilun->aio_context, in iscsi_co_generic_cb()
267 &iTask->retry_timer, QEMU_CLOCK_REALTIME, in iscsi_co_generic_cb()
269 timer_mod(&iTask->retry_timer, in iscsi_co_generic_cb()
271 iTask->do_retry = 1; in iscsi_co_generic_cb()
274 int error = iscsi_translate_sense(&task->sense); in iscsi_co_generic_cb()
278 iTask->do_retry = 1; in iscsi_co_generic_cb()
280 iTask->err_code = -error; in iscsi_co_generic_cb()
281 iTask->err_str = g_strdup(iscsi_get_error(iscsi)); in iscsi_co_generic_cb()
287 if (iTask->co) { in iscsi_co_generic_cb()
288 replay_bh_schedule_oneshot_event(iTask->iscsilun->aio_context, in iscsi_co_generic_cb()
291 iTask->complete = 1; in iscsi_co_generic_cb()
314 if (!acb->bh) { in iscsi_abort_task_cb()
316 iscsi_scsi_cancel_task(iscsi, acb->task); in iscsi_abort_task_cb()
326 IscsiLun *iscsilun = acb->iscsilun; in iscsi_aio_cancel()
328 WITH_QEMU_LOCK_GUARD(&iscsilun->mutex) { in iscsi_aio_cancel()
331 if (acb->cancelled || acb->status != -EINPROGRESS) { in iscsi_aio_cancel()
335 acb->cancelled = true; in iscsi_aio_cancel()
340 if (iscsi_task_mgmt_abort_task_async(iscsilun->iscsi, acb->task, in iscsi_aio_cancel()
361 struct iscsi_context *iscsi = iscsilun->iscsi; in iscsi_set_events()
364 if (ev != iscsilun->events) { in iscsi_set_events()
365 aio_set_fd_handler(iscsilun->aio_context, iscsi_get_fd(iscsi), in iscsi_set_events()
370 iscsilun->events = ev; in iscsi_set_events()
378 WITH_QEMU_LOCK_GUARD(&iscsilun->mutex) { in iscsi_timed_check_events()
380 iscsi_service(iscsilun->iscsi, 0); in iscsi_timed_check_events()
382 if (iscsilun->request_timed_out) { in iscsi_timed_check_events()
383 iscsilun->request_timed_out = false; in iscsi_timed_check_events()
384 iscsi_reconnect(iscsilun->iscsi); in iscsi_timed_check_events()
394 timer_mod(iscsilun->event_timer, in iscsi_timed_check_events()
402 struct iscsi_context *iscsi = iscsilun->iscsi; in iscsi_process_read()
404 qemu_mutex_lock(&iscsilun->mutex); in iscsi_process_read()
407 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_process_read()
414 struct iscsi_context *iscsi = iscsilun->iscsi; in iscsi_process_write()
416 qemu_mutex_lock(&iscsilun->mutex); in iscsi_process_write()
419 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_process_write()
424 return sector * iscsilun->block_size / BDRV_SECTOR_SIZE; in sector_lun2qemu()
429 return sector * BDRV_SECTOR_SIZE / iscsilun->block_size; in sector_qemu2lun()
435 if (offset % iscsilun->block_size || bytes % iscsilun->block_size) { in is_byte_request_lun_aligned()
437 "iscsilun->block_size %u, offset %" PRIi64 in is_byte_request_lun_aligned()
439 iscsilun->block_size, offset, bytes); in is_byte_request_lun_aligned()
456 g_free(iscsilun->allocmap); in iscsi_allocmap_free()
457 g_free(iscsilun->allocmap_valid); in iscsi_allocmap_free()
458 iscsilun->allocmap = NULL; in iscsi_allocmap_free()
459 iscsilun->allocmap_valid = NULL; in iscsi_allocmap_free()
467 assert(iscsilun->cluster_size); in iscsi_allocmap_init()
468 iscsilun->allocmap_size = in iscsi_allocmap_init()
469 DIV_ROUND_UP(iscsilun->num_blocks * iscsilun->block_size, in iscsi_allocmap_init()
470 iscsilun->cluster_size); in iscsi_allocmap_init()
472 iscsilun->allocmap = bitmap_try_new(iscsilun->allocmap_size); in iscsi_allocmap_init()
473 if (!iscsilun->allocmap) { in iscsi_allocmap_init()
474 return -ENOMEM; in iscsi_allocmap_init()
484 iscsilun->allocmap_valid = bitmap_try_new(iscsilun->allocmap_size); in iscsi_allocmap_init()
485 if (!iscsilun->allocmap_valid) { in iscsi_allocmap_init()
488 return -ENOMEM; in iscsi_allocmap_init()
500 if (iscsilun->allocmap == NULL) { in iscsi_allocmap_update()
504 assert(iscsilun->cluster_size); in iscsi_allocmap_update()
505 cl_num_expanded = offset / iscsilun->cluster_size; in iscsi_allocmap_update()
507 iscsilun->cluster_size) - cl_num_expanded; in iscsi_allocmap_update()
509 cl_num_shrunk = DIV_ROUND_UP(offset, iscsilun->cluster_size); in iscsi_allocmap_update()
510 nb_cls_shrunk = (offset + bytes) / iscsilun->cluster_size - cl_num_shrunk; in iscsi_allocmap_update()
512 bitmap_set(iscsilun->allocmap, cl_num_expanded, nb_cls_expanded); in iscsi_allocmap_update()
515 bitmap_clear(iscsilun->allocmap, cl_num_shrunk, nb_cls_shrunk); in iscsi_allocmap_update()
519 if (iscsilun->allocmap_valid == NULL) { in iscsi_allocmap_update()
524 bitmap_set(iscsilun->allocmap_valid, cl_num_shrunk, nb_cls_shrunk); in iscsi_allocmap_update()
527 bitmap_clear(iscsilun->allocmap_valid, cl_num_expanded, in iscsi_allocmap_update()
557 if (iscsilun->allocmap) { in iscsi_allocmap_invalidate()
558 bitmap_zero(iscsilun->allocmap, iscsilun->allocmap_size); in iscsi_allocmap_invalidate()
560 if (iscsilun->allocmap_valid) { in iscsi_allocmap_invalidate()
561 bitmap_zero(iscsilun->allocmap_valid, iscsilun->allocmap_size); in iscsi_allocmap_invalidate()
570 if (iscsilun->allocmap == NULL) { in iscsi_allocmap_is_allocated()
573 assert(iscsilun->cluster_size); in iscsi_allocmap_is_allocated()
574 size = DIV_ROUND_UP(offset + bytes, iscsilun->cluster_size); in iscsi_allocmap_is_allocated()
575 return !(find_next_bit(iscsilun->allocmap, size, in iscsi_allocmap_is_allocated()
576 offset / iscsilun->cluster_size) == size); in iscsi_allocmap_is_allocated()
583 if (iscsilun->allocmap_valid == NULL) { in iscsi_allocmap_is_valid()
586 assert(iscsilun->cluster_size); in iscsi_allocmap_is_valid()
587 size = DIV_ROUND_UP(offset + bytes, iscsilun->cluster_size); in iscsi_allocmap_is_valid()
588 return (find_next_zero_bit(iscsilun->allocmap_valid, size, in iscsi_allocmap_is_valid()
589 offset / iscsilun->cluster_size) == size); in iscsi_allocmap_is_valid()
595 while (!iTask->complete) { in iscsi_co_wait_for_task()
597 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_co_wait_for_task()
599 qemu_mutex_lock(&iscsilun->mutex); in iscsi_co_wait_for_task()
607 IscsiLun *iscsilun = bs->opaque; in iscsi_co_writev()
615 assert(iscsilun->dpofua); in iscsi_co_writev()
618 return -EINVAL; in iscsi_co_writev()
621 if (bs->bl.max_transfer) { in iscsi_co_writev()
622 assert(nb_sectors << BDRV_SECTOR_BITS <= bs->bl.max_transfer); in iscsi_co_writev()
628 qemu_mutex_lock(&iscsilun->mutex); in iscsi_co_writev()
630 if (iscsilun->use_16_for_rw) { in iscsi_co_writev()
632 iTask.task = iscsi_write16_iov_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_writev()
633 NULL, num_sectors * iscsilun->block_size, in iscsi_co_writev()
634 iscsilun->block_size, 0, 0, fua, 0, 0, in iscsi_co_writev()
636 (struct scsi_iovec *)iov->iov, iov->niov); in iscsi_co_writev()
638 iTask.task = iscsi_write10_iov_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_writev()
639 NULL, num_sectors * iscsilun->block_size, in iscsi_co_writev()
640 iscsilun->block_size, 0, 0, fua, 0, 0, in iscsi_co_writev()
642 (struct scsi_iovec *)iov->iov, iov->niov); in iscsi_co_writev()
645 iTask.task = iscsi_write16_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_writev()
646 NULL, num_sectors * iscsilun->block_size, in iscsi_co_writev()
647 iscsilun->block_size, 0, 0, fua, 0, 0, in iscsi_co_writev()
650 iTask.task = iscsi_write10_task(iscsilun->iscsi, iscsilun->lun, lba,
651 NULL, num_sectors * iscsilun->block_size,
652 iscsilun->block_size, 0, 0, fua, 0, 0,
657 qemu_mutex_unlock(&iscsilun->mutex);
658 return -ENOMEM;
661 scsi_task_set_iov_out(iTask.task, (struct scsi_iovec *) iov->iov,
662 iov->niov);
689 qemu_mutex_unlock(&iscsilun->mutex);
702 IscsiLun *iscsilun = bs->opaque; in iscsi_co_block_status()
711 assert(QEMU_IS_ALIGNED(offset | bytes, iscsilun->block_size)); in iscsi_co_block_status()
721 if (!iscsilun->lbpme) { in iscsi_co_block_status()
725 lba = offset / iscsilun->block_size; in iscsi_co_block_status()
726 max_bytes = (iscsilun->num_blocks - lba) * iscsilun->block_size; in iscsi_co_block_status()
728 qemu_mutex_lock(&iscsilun->mutex); in iscsi_co_block_status()
730 if (iscsi_get_lba_status_task(iscsilun->iscsi, iscsilun->lun, in iscsi_co_block_status()
733 ret = -ENOMEM; in iscsi_co_block_status()
758 if (lbas == NULL || lbas->num_descriptors == 0) { in iscsi_co_block_status()
759 ret = -EIO; in iscsi_co_block_status()
763 lbasd = &lbas->descriptors[0]; in iscsi_co_block_status()
765 if (lba != lbasd->lba) { in iscsi_co_block_status()
766 ret = -EIO; in iscsi_co_block_status()
770 *pnum = MIN((int64_t) lbasd->num_blocks * iscsilun->block_size, max_bytes); in iscsi_co_block_status()
772 if (lbasd->provisioning == SCSI_PROVISIONING_TYPE_DEALLOCATED || in iscsi_co_block_status()
773 lbasd->provisioning == SCSI_PROVISIONING_TYPE_ANCHORED) { in iscsi_co_block_status()
775 if (iscsilun->lbprz) { in iscsi_co_block_status()
787 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_co_block_status()
803 IscsiLun *iscsilun = bs->opaque; in iscsi_co_readv()
810 return -EINVAL; in iscsi_co_readv()
813 if (bs->bl.max_transfer) { in iscsi_co_readv()
814 assert(nb_sectors << BDRV_SECTOR_BITS <= bs->bl.max_transfer); in iscsi_co_readv()
824 qemu_iovec_memset(iov, 0, 0x00, iov->size); in iscsi_co_readv()
839 assert(iscsilun->cluster_size); in iscsi_co_readv()
840 head = (sector_num * BDRV_SECTOR_SIZE) % iscsilun->cluster_size; in iscsi_co_readv()
842 sector_num * BDRV_SECTOR_SIZE - head, in iscsi_co_readv()
851 qemu_iovec_memset(iov, 0, 0x00, iov->size); in iscsi_co_readv()
860 qemu_mutex_lock(&iscsilun->mutex); in iscsi_co_readv()
862 if (iscsilun->use_16_for_rw) { in iscsi_co_readv()
864 iTask.task = iscsi_read16_iov_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_readv()
865 num_sectors * iscsilun->block_size, in iscsi_co_readv()
866 iscsilun->block_size, 0, 0, 0, 0, 0, in iscsi_co_readv()
868 (struct scsi_iovec *)iov->iov, iov->niov); in iscsi_co_readv()
870 iTask.task = iscsi_read10_iov_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_readv()
871 num_sectors * iscsilun->block_size, in iscsi_co_readv()
872 iscsilun->block_size, in iscsi_co_readv()
875 (struct scsi_iovec *)iov->iov, iov->niov); in iscsi_co_readv()
878 iTask.task = iscsi_read16_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_readv()
879 num_sectors * iscsilun->block_size, in iscsi_co_readv()
880 iscsilun->block_size, 0, 0, 0, 0, 0, in iscsi_co_readv()
883 iTask.task = iscsi_read10_task(iscsilun->iscsi, iscsilun->lun, lba,
884 num_sectors * iscsilun->block_size,
885 iscsilun->block_size,
891 qemu_mutex_unlock(&iscsilun->mutex);
892 return -ENOMEM;
895 scsi_task_set_iov_in(iTask.task, (struct scsi_iovec *) iov->iov, iov->niov);
915 qemu_mutex_unlock(&iscsilun->mutex);
922 IscsiLun *iscsilun = bs->opaque; in iscsi_co_flush()
927 qemu_mutex_lock(&iscsilun->mutex); in iscsi_co_flush()
929 if (iscsi_synchronizecache10_task(iscsilun->iscsi, iscsilun->lun, 0, 0, 0, in iscsi_co_flush()
931 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_co_flush()
932 return -ENOMEM; in iscsi_co_flush()
952 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_co_flush()
966 if (!acb->bh) { in iscsi_aio_ioctl_cb()
967 acb->status = -ECANCELED; in iscsi_aio_ioctl_cb()
973 acb->status = 0; in iscsi_aio_ioctl_cb()
977 acb->status = -iscsi_translate_sense(&acb->task->sense); in iscsi_aio_ioctl_cb()
980 acb->ioh->driver_status = 0; in iscsi_aio_ioctl_cb()
981 acb->ioh->host_status = 0; in iscsi_aio_ioctl_cb()
982 acb->ioh->resid = 0; in iscsi_aio_ioctl_cb()
983 acb->ioh->status = status; in iscsi_aio_ioctl_cb()
987 if (status == SCSI_STATUS_CHECK_CONDITION && acb->task->datain.size >= 2) { in iscsi_aio_ioctl_cb()
990 acb->ioh->driver_status |= SG_ERR_DRIVER_SENSE; in iscsi_aio_ioctl_cb()
992 acb->ioh->sb_len_wr = acb->task->datain.size - 2; in iscsi_aio_ioctl_cb()
993 ss = MIN(acb->ioh->mx_sb_len, acb->ioh->sb_len_wr); in iscsi_aio_ioctl_cb()
994 memcpy(acb->ioh->sbp, &acb->task->datain.data[2], ss); in iscsi_aio_ioctl_cb()
1004 qemu_bh_delete(acb->bh); in iscsi_ioctl_bh_completion()
1005 acb->common.cb(acb->common.opaque, acb->ret); in iscsi_ioctl_bh_completion()
1011 BlockDriverState *bs = acb->common.bs; in iscsi_ioctl_handle_emulated()
1012 IscsiLun *iscsilun = bs->opaque; in iscsi_ioctl_handle_emulated()
1020 ((struct sg_scsi_id *)buf)->scsi_type = iscsilun->type; in iscsi_ioctl_handle_emulated()
1023 ret = -EINVAL; in iscsi_ioctl_handle_emulated()
1025 assert(!acb->bh); in iscsi_ioctl_handle_emulated()
1026 acb->bh = aio_bh_new(bdrv_get_aio_context(bs), in iscsi_ioctl_handle_emulated()
1028 acb->ret = ret; in iscsi_ioctl_handle_emulated()
1029 qemu_bh_schedule(acb->bh); in iscsi_ioctl_handle_emulated()
1036 IscsiLun *iscsilun = bs->opaque; in iscsi_aio_ioctl()
1037 struct iscsi_context *iscsi = iscsilun->iscsi; in iscsi_aio_ioctl()
1043 acb->iscsilun = iscsilun; in iscsi_aio_ioctl()
1044 acb->bh = NULL; in iscsi_aio_ioctl()
1045 acb->status = -EINPROGRESS; in iscsi_aio_ioctl()
1046 acb->ioh = buf; in iscsi_aio_ioctl()
1047 acb->cancelled = false; in iscsi_aio_ioctl()
1051 return &acb->common; in iscsi_aio_ioctl()
1054 if (acb->ioh->cmd_len > SCSI_CDB_MAX_SIZE) { in iscsi_aio_ioctl()
1056 acb->ioh->cmd_len, SCSI_CDB_MAX_SIZE); in iscsi_aio_ioctl()
1062 acb->task = malloc(sizeof(struct scsi_task)); in iscsi_aio_ioctl()
1063 if (acb->task == NULL) { in iscsi_aio_ioctl()
1069 memset(acb->task, 0, sizeof(struct scsi_task)); in iscsi_aio_ioctl()
1071 switch (acb->ioh->dxfer_direction) { in iscsi_aio_ioctl()
1073 acb->task->xfer_dir = SCSI_XFER_WRITE; in iscsi_aio_ioctl()
1076 acb->task->xfer_dir = SCSI_XFER_READ; in iscsi_aio_ioctl()
1079 acb->task->xfer_dir = SCSI_XFER_NONE; in iscsi_aio_ioctl()
1083 acb->task->cdb_size = acb->ioh->cmd_len; in iscsi_aio_ioctl()
1084 memcpy(&acb->task->cdb[0], acb->ioh->cmdp, acb->ioh->cmd_len); in iscsi_aio_ioctl()
1085 acb->task->expxferlen = acb->ioh->dxfer_len; in iscsi_aio_ioctl()
1088 qemu_mutex_lock(&iscsilun->mutex); in iscsi_aio_ioctl()
1089 if (acb->task->xfer_dir == SCSI_XFER_WRITE) { in iscsi_aio_ioctl()
1090 if (acb->ioh->iovec_count == 0) { in iscsi_aio_ioctl()
1091 data.data = acb->ioh->dxferp; in iscsi_aio_ioctl()
1092 data.size = acb->ioh->dxfer_len; in iscsi_aio_ioctl()
1094 scsi_task_set_iov_out(acb->task, in iscsi_aio_ioctl()
1095 (struct scsi_iovec *) acb->ioh->dxferp, in iscsi_aio_ioctl()
1096 acb->ioh->iovec_count); in iscsi_aio_ioctl()
1100 if (iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task, in iscsi_aio_ioctl()
1104 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_aio_ioctl()
1105 scsi_free_scsi_task(acb->task); in iscsi_aio_ioctl()
1111 if (acb->task->xfer_dir == SCSI_XFER_READ) { in iscsi_aio_ioctl()
1112 if (acb->ioh->iovec_count == 0) { in iscsi_aio_ioctl()
1113 scsi_task_add_data_in_buffer(acb->task, in iscsi_aio_ioctl()
1114 acb->ioh->dxfer_len, in iscsi_aio_ioctl()
1115 acb->ioh->dxferp); in iscsi_aio_ioctl()
1117 scsi_task_set_iov_in(acb->task, in iscsi_aio_ioctl()
1118 (struct scsi_iovec *) acb->ioh->dxferp, in iscsi_aio_ioctl()
1119 acb->ioh->iovec_count); in iscsi_aio_ioctl()
1124 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_aio_ioctl()
1126 return &acb->common; in iscsi_aio_ioctl()
1134 IscsiLun *iscsilun = bs->opaque; in iscsi_co_getlength()
1137 len = iscsilun->num_blocks; in iscsi_co_getlength()
1138 len *= iscsilun->block_size; in iscsi_co_getlength()
1147 IscsiLun *iscsilun = bs->opaque; in iscsi_co_pdiscard()
1153 return -ENOTSUP; in iscsi_co_pdiscard()
1156 if (!iscsilun->lbp.lbpu) { in iscsi_co_pdiscard()
1165 assert(bytes / iscsilun->block_size <= UINT32_MAX); in iscsi_co_pdiscard()
1167 list.lba = offset / iscsilun->block_size; in iscsi_co_pdiscard()
1168 list.num = bytes / iscsilun->block_size; in iscsi_co_pdiscard()
1171 qemu_mutex_lock(&iscsilun->mutex); in iscsi_co_pdiscard()
1173 if (iscsi_unmap_task(iscsilun->iscsi, iscsilun->lun, 0, 0, &list, 1, in iscsi_co_pdiscard()
1175 r = -ENOMEM; in iscsi_co_pdiscard()
1208 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_co_pdiscard()
1217 IscsiLun *iscsilun = bs->opaque; in iscsi_co_pwrite_zeroes()
1221 bool use_16_for_ws = iscsilun->use_16_for_rw; in iscsi_co_pwrite_zeroes()
1225 return -ENOTSUP; in iscsi_co_pwrite_zeroes()
1229 if (!use_16_for_ws && !iscsilun->lbp.lbpws10) { in iscsi_co_pwrite_zeroes()
1233 if (use_16_for_ws && !iscsilun->lbp.lbpws) { in iscsi_co_pwrite_zeroes()
1237 use_16_for_ws = iscsilun->use_16_for_rw; in iscsi_co_pwrite_zeroes()
1241 if (!(flags & BDRV_REQ_MAY_UNMAP) && !iscsilun->has_write_same) { in iscsi_co_pwrite_zeroes()
1243 return -ENOTSUP; in iscsi_co_pwrite_zeroes()
1246 lba = offset / iscsilun->block_size; in iscsi_co_pwrite_zeroes()
1247 nb_blocks = bytes / iscsilun->block_size; in iscsi_co_pwrite_zeroes()
1249 if (iscsilun->zeroblock == NULL) { in iscsi_co_pwrite_zeroes()
1250 iscsilun->zeroblock = g_try_malloc0(iscsilun->block_size); in iscsi_co_pwrite_zeroes()
1251 if (iscsilun->zeroblock == NULL) { in iscsi_co_pwrite_zeroes()
1252 return -ENOMEM; in iscsi_co_pwrite_zeroes()
1256 qemu_mutex_lock(&iscsilun->mutex); in iscsi_co_pwrite_zeroes()
1265 iTask.task = iscsi_writesame16_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_pwrite_zeroes()
1266 iscsilun->zeroblock, iscsilun->block_size, in iscsi_co_pwrite_zeroes()
1275 iTask.task = iscsi_writesame10_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_pwrite_zeroes()
1276 iscsilun->zeroblock, iscsilun->block_size, in iscsi_co_pwrite_zeroes()
1281 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_co_pwrite_zeroes()
1282 return -ENOMEM; in iscsi_co_pwrite_zeroes()
1288 iTask.task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST && in iscsi_co_pwrite_zeroes()
1289 (iTask.task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE || in iscsi_co_pwrite_zeroes()
1290 iTask.task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_FIELD_IN_CDB)) { in iscsi_co_pwrite_zeroes()
1292 iscsilun->has_write_same = false; in iscsi_co_pwrite_zeroes()
1294 r = -ENOTSUP; in iscsi_co_pwrite_zeroes()
1323 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_co_pwrite_zeroes()
1341 secretid = qemu_opt_get(opts, "password-secret"); in apply_chap()
1344 error_setg(errp, "'password' and 'password-secret' properties are " in apply_chap()
1359 "use 'password-secret' instead"); in apply_chap()
1374 digest = qemu_opt_get(opts, "header-digest"); in apply_header_digest()
1381 } else if (!strcmp(digest, "crc32c-none")) { in apply_header_digest()
1383 } else if (!strcmp(digest, "none-crc32c")) { in apply_header_digest()
1386 error_setg(errp, "Invalid header-digest setting : %s", digest); in apply_header_digest()
1392 const char *name; in get_initiator_name() local
1396 name = qemu_opt_get(opts, "initiator-name"); in get_initiator_name()
1397 if (name) { in get_initiator_name()
1398 return g_strdup(name); in get_initiator_name()
1402 if (strcmp(uuid_info->UUID, UUID_NONE) == 0) { in get_initiator_name()
1403 name = qemu_get_vm_name(); in get_initiator_name()
1405 name = uuid_info->UUID; in get_initiator_name()
1407 iscsi_name = g_strdup_printf("iqn.2008-11.org.linux-kvm%s%s", in get_initiator_name()
1408 name ? ":" : "", name ? name : ""); in get_initiator_name()
1417 QEMU_LOCK_GUARD(&iscsilun->mutex); in iscsi_nop_timed_event()
1418 if (iscsi_get_nops_in_flight(iscsilun->iscsi) >= MAX_NOP_FAILURES) { in iscsi_nop_timed_event()
1420 iscsilun->request_timed_out = true; in iscsi_nop_timed_event()
1421 } else if (iscsi_nop_out_async(iscsilun->iscsi, NULL, NULL, 0, NULL) != 0) { in iscsi_nop_timed_event()
1422 error_report("iSCSI: failed to sent NOP-Out. Disabling NOP messages."); in iscsi_nop_timed_event()
1426 timer_mod(iscsilun->nop_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + NOP_INTERVAL); in iscsi_nop_timed_event()
1443 switch (iscsilun->type) { in iscsi_readcapacity_sync()
1445 task = iscsi_readcapacity16_sync(iscsilun->iscsi, iscsilun->lun); in iscsi_readcapacity_sync()
1446 if (task != NULL && task->status == SCSI_STATUS_GOOD) { in iscsi_readcapacity_sync()
1451 iscsilun->block_size = rc16->block_length; in iscsi_readcapacity_sync()
1452 iscsilun->num_blocks = rc16->returned_lba + 1; in iscsi_readcapacity_sync()
1453 iscsilun->lbpme = !!rc16->lbpme; in iscsi_readcapacity_sync()
1454 iscsilun->lbprz = !!rc16->lbprz; in iscsi_readcapacity_sync()
1455 iscsilun->use_16_for_rw = (rc16->returned_lba > 0xffffffff); in iscsi_readcapacity_sync()
1459 if (task != NULL && task->status == SCSI_STATUS_CHECK_CONDITION in iscsi_readcapacity_sync()
1460 && task->sense.key == SCSI_SENSE_UNIT_ATTENTION) { in iscsi_readcapacity_sync()
1465 task = iscsi_readcapacity10_sync(iscsilun->iscsi, iscsilun->lun, 0, 0); in iscsi_readcapacity_sync()
1466 if (task != NULL && task->status == SCSI_STATUS_GOOD) { in iscsi_readcapacity_sync()
1471 iscsilun->block_size = rc10->block_size; in iscsi_readcapacity_sync()
1472 if (rc10->lba == 0) { in iscsi_readcapacity_sync()
1474 iscsilun->num_blocks = 0; in iscsi_readcapacity_sync()
1476 iscsilun->num_blocks = rc10->lba + 1; in iscsi_readcapacity_sync()
1484 } while (task != NULL && task->status == SCSI_STATUS_CHECK_CONDITION in iscsi_readcapacity_sync()
1485 && task->sense.key == SCSI_SENSE_UNIT_ATTENTION in iscsi_readcapacity_sync()
1486 && retries-- > 0); in iscsi_readcapacity_sync()
1488 if (task == NULL || task->status != SCSI_STATUS_GOOD) { in iscsi_readcapacity_sync()
1490 } else if (!iscsilun->block_size || in iscsi_readcapacity_sync()
1491 iscsilun->block_size % BDRV_SECTOR_SIZE) { in iscsi_readcapacity_sync()
1493 "block size of %d.", iscsilun->block_size); in iscsi_readcapacity_sync()
1506 if (task == NULL || task->status != SCSI_STATUS_GOOD) { in iscsi_do_inquiry()
1510 if (full_size > task->datain.size) { in iscsi_do_inquiry()
1515 if (task == NULL || task->status != SCSI_STATUS_GOOD) { in iscsi_do_inquiry()
1540 IscsiLun *iscsilun = bs->opaque; in iscsi_detach_aio_context()
1542 aio_set_fd_handler(iscsilun->aio_context, iscsi_get_fd(iscsilun->iscsi), in iscsi_detach_aio_context()
1544 iscsilun->events = 0; in iscsi_detach_aio_context()
1546 if (iscsilun->nop_timer) { in iscsi_detach_aio_context()
1547 timer_free(iscsilun->nop_timer); in iscsi_detach_aio_context()
1548 iscsilun->nop_timer = NULL; in iscsi_detach_aio_context()
1550 if (iscsilun->event_timer) { in iscsi_detach_aio_context()
1551 timer_free(iscsilun->event_timer); in iscsi_detach_aio_context()
1552 iscsilun->event_timer = NULL; in iscsi_detach_aio_context()
1559 IscsiLun *iscsilun = bs->opaque; in iscsi_attach_aio_context()
1561 iscsilun->aio_context = new_context; in iscsi_attach_aio_context()
1565 iscsilun->nop_timer = aio_timer_new(iscsilun->aio_context, in iscsi_attach_aio_context()
1568 timer_mod(iscsilun->nop_timer, in iscsi_attach_aio_context()
1573 iscsilun->event_timer = aio_timer_new(iscsilun->aio_context, in iscsi_attach_aio_context()
1576 timer_mod(iscsilun->event_timer, in iscsi_attach_aio_context()
1584 iscsilun->write_protected = false; in iscsi_modesense_sync()
1585 iscsilun->dpofua = false; in iscsi_modesense_sync()
1587 task = iscsi_modesense6_sync(iscsilun->iscsi, iscsilun->lun, in iscsi_modesense_sync()
1592 iscsi_get_error(iscsilun->iscsi)); in iscsi_modesense_sync()
1596 if (task->status != SCSI_STATUS_GOOD) { in iscsi_modesense_sync()
1603 iscsi_get_error(iscsilun->iscsi)); in iscsi_modesense_sync()
1606 iscsilun->write_protected = ms->device_specific_parameter & 0x80; in iscsi_modesense_sync()
1607 iscsilun->dpofua = ms->device_specific_parameter & 0x10; in iscsi_modesense_sync()
1629 opts = QTAILQ_FIRST(&list->head); in iscsi_parse_iscsi_option()
1645 password_secret = qemu_opt_get(opts, "password-secret"); in iscsi_parse_iscsi_option()
1647 qdict_set_default_str(options, "password-secret", password_secret); in iscsi_parse_iscsi_option()
1650 initiator_name = qemu_opt_get(opts, "initiator-name"); in iscsi_parse_iscsi_option()
1652 qdict_set_default_str(options, "initiator-name", initiator_name); in iscsi_parse_iscsi_option()
1655 header_digest = qemu_opt_get(opts, "header-digest"); in iscsi_parse_iscsi_option()
1657 /* -iscsi takes upper case values, but QAPI only supports lower case in iscsi_parse_iscsi_option()
1659 char *qapi_value = g_ascii_strdown(header_digest, -1); in iscsi_parse_iscsi_option()
1660 qdict_set_default_str(options, "header-digest", qapi_value); in iscsi_parse_iscsi_option()
1688 switch (iscsi_url->transport) { in iscsi_parse_filename()
1697 iscsi_url->transport); in iscsi_parse_filename()
1705 qdict_set_default_str(options, "portal", iscsi_url->portal); in iscsi_parse_filename()
1706 qdict_set_default_str(options, "target", iscsi_url->target); in iscsi_parse_filename()
1708 lun_str = g_strdup_printf("%d", iscsi_url->lun); in iscsi_parse_filename()
1712 /* User/password from -iscsi take precedence over those from the URL */ in iscsi_parse_filename()
1713 iscsi_parse_iscsi_option(iscsi_url->target, options); in iscsi_parse_filename()
1715 if (iscsi_url->user[0] != '\0') { in iscsi_parse_filename()
1716 qdict_set_default_str(options, "user", iscsi_url->user); in iscsi_parse_filename()
1717 qdict_set_default_str(options, "password", iscsi_url->passwd); in iscsi_parse_filename()
1724 .name = "iscsi",
1728 .name = "transport",
1732 .name = "portal",
1736 .name = "target",
1740 .name = "user",
1744 .name = "password",
1748 .name = "password-secret",
1752 .name = "lun",
1756 .name = "initiator-name",
1760 .name = "header-digest",
1764 .name = "timeout",
1776 for (desig = inq_di->designators; desig; desig = desig->next) { in iscsi_save_designator()
1777 if (desig->association || in iscsi_save_designator()
1778 desig->designator_type > SCSI_DESIGNATOR_TYPE_NAA) { in iscsi_save_designator()
1782 if (!copy || copy->designator_type < desig->designator_type) { in iscsi_save_designator()
1787 lun->dd = g_new(struct scsi_inquiry_device_designator, 1); in iscsi_save_designator()
1788 *lun->dd = *copy; in iscsi_save_designator()
1789 lun->dd->next = NULL; in iscsi_save_designator()
1790 lun->dd->designator = g_malloc(copy->designator_length); in iscsi_save_designator()
1791 memcpy(lun->dd->designator, copy->designator, copy->designator_length); in iscsi_save_designator()
1798 IscsiLun *iscsilun = bs->opaque; in iscsi_open()
1814 ret = -EINVAL; in iscsi_open()
1825 ret = -EINVAL; in iscsi_open()
1839 ret = -EINVAL; in iscsi_open()
1850 ret = -ENOMEM; in iscsi_open()
1856 ret = -EINVAL; in iscsi_open()
1861 error_setg(errp, "iSCSI: Failed to set target name."); in iscsi_open()
1862 ret = -EINVAL; in iscsi_open()
1870 ret = -EINVAL; in iscsi_open()
1876 ret = -EINVAL; in iscsi_open()
1884 ret = -EINVAL; in iscsi_open()
1901 ret = -EINVAL; in iscsi_open()
1905 iscsilun->iscsi = iscsi; in iscsi_open()
1906 iscsilun->aio_context = bdrv_get_aio_context(bs); in iscsi_open()
1907 iscsilun->lun = lun; in iscsi_open()
1908 iscsilun->has_write_same = true; in iscsi_open()
1910 task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 0, 0, in iscsi_open()
1913 ret = -EINVAL; in iscsi_open()
1916 iscsilun->type = inq->periperal_device_type; in iscsi_open()
1921 if (iscsilun->dpofua) { in iscsi_open()
1922 bs->supported_write_flags = BDRV_REQ_FUA; in iscsi_open()
1926 if (iscsilun->type == TYPE_DISK && (flags & BDRV_O_RDWR) && in iscsi_open()
1927 iscsilun->write_protected) { in iscsi_open()
1940 ret = -EINVAL; in iscsi_open()
1943 bs->total_sectors = sector_lun2qemu(iscsilun->num_blocks, iscsilun); in iscsi_open()
1945 /* We don't have any emulation for devices other than disks and CD-ROMs, so in iscsi_open()
1949 if (iscsilun->type != TYPE_DISK && iscsilun->type != TYPE_ROM) { in iscsi_open()
1950 bs->sg = true; in iscsi_open()
1953 task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 1, in iscsi_open()
1957 ret = -EINVAL; in iscsi_open()
1960 for (i = 0; i < inq_vpd->num_pages; i++) { in iscsi_open()
1965 switch (inq_vpd->pages[i]) { in iscsi_open()
1967 inq_task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 1, in iscsi_open()
1971 ret = -EINVAL; in iscsi_open()
1974 memcpy(&iscsilun->lbp, inq_lbp, in iscsi_open()
1979 inq_task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 1, in iscsi_open()
1983 ret = -EINVAL; in iscsi_open()
1986 memcpy(&iscsilun->bl, inq_bl, in iscsi_open()
1991 inq_task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 1, in iscsi_open()
1995 ret = -EINVAL; in iscsi_open()
2008 qemu_mutex_init(&iscsilun->mutex); in iscsi_open()
2009 iscsi_attach_aio_context(bs, iscsilun->aio_context); in iscsi_open()
2014 if (iscsilun->bl.opt_unmap_gran * iscsilun->block_size >= 4 * 1024 && in iscsi_open()
2015 iscsilun->bl.opt_unmap_gran * iscsilun->block_size <= 16 * 1024 * 1024) { in iscsi_open()
2016 iscsilun->cluster_size = iscsilun->bl.opt_unmap_gran * in iscsi_open()
2017 iscsilun->block_size; in iscsi_open()
2018 if (iscsilun->lbprz) { in iscsi_open()
2023 if (iscsilun->lbprz && iscsilun->lbp.lbpws) { in iscsi_open()
2024 bs->supported_zero_flags = BDRV_REQ_MAY_UNMAP; in iscsi_open()
2049 IscsiLun *iscsilun = bs->opaque; in iscsi_close()
2050 struct iscsi_context *iscsi = iscsilun->iscsi; in iscsi_close()
2057 if (iscsilun->dd) { in iscsi_close()
2058 g_free(iscsilun->dd->designator); in iscsi_close()
2059 g_free(iscsilun->dd); in iscsi_close()
2061 g_free(iscsilun->zeroblock); in iscsi_close()
2063 qemu_mutex_destroy(&iscsilun->mutex); in iscsi_close()
2072 IscsiLun *iscsilun = bs->opaque; in iscsi_refresh_limits()
2073 uint64_t max_xfer_len = iscsilun->use_16_for_rw ? 0xffffffff : 0xffff; in iscsi_refresh_limits()
2074 unsigned int block_size = MAX(BDRV_SECTOR_SIZE, iscsilun->block_size); in iscsi_refresh_limits()
2076 assert(iscsilun->block_size >= BDRV_SECTOR_SIZE || bdrv_is_sg(bs)); in iscsi_refresh_limits()
2078 bs->bl.request_alignment = block_size; in iscsi_refresh_limits()
2080 if (iscsilun->bl.max_xfer_len) { in iscsi_refresh_limits()
2081 max_xfer_len = MIN(max_xfer_len, iscsilun->bl.max_xfer_len); in iscsi_refresh_limits()
2085 bs->bl.max_transfer = max_xfer_len * iscsilun->block_size; in iscsi_refresh_limits()
2088 if (iscsilun->lbp.lbpu) { in iscsi_refresh_limits()
2089 bs->bl.max_pdiscard = in iscsi_refresh_limits()
2090 MIN_NON_ZERO(iscsilun->bl.max_unmap * iscsilun->block_size, in iscsi_refresh_limits()
2091 (uint64_t)UINT32_MAX * iscsilun->block_size); in iscsi_refresh_limits()
2092 bs->bl.pdiscard_alignment = in iscsi_refresh_limits()
2093 iscsilun->bl.opt_unmap_gran * iscsilun->block_size; in iscsi_refresh_limits()
2095 bs->bl.pdiscard_alignment = iscsilun->block_size; in iscsi_refresh_limits()
2098 bs->bl.max_pwrite_zeroes = in iscsi_refresh_limits()
2099 MIN_NON_ZERO(iscsilun->bl.max_ws_len * iscsilun->block_size, in iscsi_refresh_limits()
2100 max_xfer_len * iscsilun->block_size); in iscsi_refresh_limits()
2102 if (iscsilun->lbp.lbpws) { in iscsi_refresh_limits()
2103 bs->bl.pwrite_zeroes_alignment = in iscsi_refresh_limits()
2104 iscsilun->bl.opt_unmap_gran * iscsilun->block_size; in iscsi_refresh_limits()
2106 bs->bl.pwrite_zeroes_alignment = iscsilun->block_size; in iscsi_refresh_limits()
2108 if (iscsilun->bl.opt_xfer_len && in iscsi_refresh_limits()
2109 iscsilun->bl.opt_xfer_len < INT_MAX / block_size) { in iscsi_refresh_limits()
2110 bs->bl.opt_transfer = pow2floor(iscsilun->bl.opt_xfer_len * in iscsi_refresh_limits()
2111 iscsilun->block_size); in iscsi_refresh_limits()
2115 /* Note that this will not re-establish a connection with an iSCSI target - it
2120 IscsiLun *iscsilun = state->bs->opaque; in iscsi_reopen_prepare()
2122 if (state->flags & BDRV_O_RDWR && iscsilun->write_protected) { in iscsi_reopen_prepare()
2123 error_setg(errp, "Cannot open a write protected LUN as read-write"); in iscsi_reopen_prepare()
2124 return -EACCES; in iscsi_reopen_prepare()
2131 IscsiLun *iscsilun = reopen_state->bs->opaque; in iscsi_reopen_commit()
2134 if (iscsilun->allocmap != NULL) { in iscsi_reopen_commit()
2135 iscsi_allocmap_init(iscsilun, reopen_state->flags); in iscsi_reopen_commit()
2143 IscsiLun *iscsilun = bs->opaque; in iscsi_co_truncate()
2150 return -ENOTSUP; in iscsi_co_truncate()
2153 if (iscsilun->type != TYPE_DISK) { in iscsi_co_truncate()
2154 error_setg(errp, "Cannot resize non-disk iSCSI devices"); in iscsi_co_truncate()
2155 return -ENOTSUP; in iscsi_co_truncate()
2161 return -EIO; in iscsi_co_truncate()
2167 return -ENOTSUP; in iscsi_co_truncate()
2170 return -EINVAL; in iscsi_co_truncate()
2173 if (iscsilun->allocmap != NULL) { in iscsi_co_truncate()
2174 iscsi_allocmap_init(iscsilun, bs->open_flags); in iscsi_co_truncate()
2183 IscsiLun *iscsilun = bs->opaque; in iscsi_co_get_info()
2184 bdi->cluster_size = iscsilun->cluster_size; in iscsi_co_get_info()
2191 IscsiLun *iscsilun = bs->opaque; in iscsi_co_invalidate_cache()
2212 task->cdb[0] = EXTENDED_COPY; in iscsi_xcopy_task()
2213 task->cdb[10] = (param_len >> 24) & 0xFF; in iscsi_xcopy_task()
2214 task->cdb[11] = (param_len >> 16) & 0xFF; in iscsi_xcopy_task()
2215 task->cdb[12] = (param_len >> 8) & 0xFF; in iscsi_xcopy_task()
2216 task->cdb[13] = param_len & 0xFF; in iscsi_xcopy_task()
2217 task->cdb_size = 16; in iscsi_xcopy_task()
2218 task->xfer_dir = SCSI_XFER_WRITE; in iscsi_xcopy_task()
2219 task->expxferlen = param_len; in iscsi_xcopy_task()
2226 struct scsi_inquiry_device_designator *dd = lun->dd; in iscsi_populate_target_desc()
2230 desc[4] = dd->code_set; in iscsi_populate_target_desc()
2231 desc[5] = (dd->designator_type & 0xF) in iscsi_populate_target_desc()
2232 | ((dd->association & 3) << 4); in iscsi_populate_target_desc()
2233 desc[7] = dd->designator_length; in iscsi_populate_target_desc()
2234 memcpy(desc + 8, dd->designator, MIN(dd->designator_length, 20)); in iscsi_populate_target_desc()
2237 desc[29] = (lun->block_size >> 16) & 0xFF; in iscsi_populate_target_desc()
2238 desc[30] = (lun->block_size >> 8) & 0xFF; in iscsi_populate_target_desc()
2239 desc[31] = lun->block_size & 0xFF; in iscsi_populate_target_desc()
2249 hdr[3] = (XCOPY_BLK2BLK_SEG_DESC_SIZE - 4 /* SEG_DESC_SRC_INDEX_OFFSET */) & 0xFF; in iscsi_xcopy_desc_hdr()
2313 data->size = XCOPY_DESC_OFFSET + in iscsi_xcopy_data()
2316 data->data = g_malloc0(data->size); in iscsi_xcopy_data()
2317 buf = data->data; in iscsi_xcopy_data()
2341 IscsiLun *dst_lun = dst->bs->opaque; in iscsi_co_copy_range_to()
2348 if (src->bs->drv->bdrv_co_copy_range_to != iscsi_co_copy_range_to) { in iscsi_co_copy_range_to()
2349 return -ENOTSUP; in iscsi_co_copy_range_to()
2351 src_lun = src->bs->opaque; in iscsi_co_copy_range_to()
2353 if (!src_lun->dd || !dst_lun->dd) { in iscsi_co_copy_range_to()
2354 return -ENOTSUP; in iscsi_co_copy_range_to()
2357 return -ENOTSUP; in iscsi_co_copy_range_to()
2360 return -ENOTSUP; in iscsi_co_copy_range_to()
2362 if (dst_lun->block_size != src_lun->block_size || in iscsi_co_copy_range_to()
2363 !dst_lun->block_size) { in iscsi_co_copy_range_to()
2364 return -ENOTSUP; in iscsi_co_copy_range_to()
2367 block_size = dst_lun->block_size; in iscsi_co_copy_range_to()
2369 return -ENOTSUP; in iscsi_co_copy_range_to()
2379 qemu_mutex_lock(&dst_lun->mutex); in iscsi_co_copy_range_to()
2382 if (iscsi_scsi_command_async(dst_lun->iscsi, dst_lun->lun, in iscsi_co_copy_range_to()
2386 r = -EIO; in iscsi_co_copy_range_to()
2406 qemu_mutex_unlock(&dst_lun->mutex); in iscsi_co_copy_range_to()
2418 "password-secret",
2420 "initiator-name",
2421 "header-digest",