2 * QEMU Block driver for iSCSI images
4 * Copyright (c) 2010-2011 Ronnie Sahlberg <ronniesahlberg@gmail.com>
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 #include "config-host.h"
28 #include "qemu-common.h"
29 #include "qemu-error.h"
30 #include "block_int.h"
33 #include <iscsi/iscsi.h>
34 #include <iscsi/scsi-lowlevel.h>
37 typedef struct IscsiLun
{
38 struct iscsi_context
*iscsi
;
41 unsigned long num_blocks
;
45 typedef struct IscsiAIOCB
{
46 BlockDriverAIOCB common
;
50 struct scsi_task
*task
;
66 iscsi_abort_task_cb(struct iscsi_context
*iscsi
, int status
, void *command_data
,
72 iscsi_aio_cancel(BlockDriverAIOCB
*blockacb
)
74 IscsiAIOCB
*acb
= (IscsiAIOCB
*)blockacb
;
75 IscsiLun
*iscsilun
= acb
->iscsilun
;
77 acb
->common
.cb(acb
->common
.opaque
, -ECANCELED
);
80 /* send a task mgmt call to the target to cancel the task on the target */
81 iscsi_task_mgmt_abort_task_async(iscsilun
->iscsi
, acb
->task
,
82 iscsi_abort_task_cb
, NULL
);
84 /* then also cancel the task locally in libiscsi */
85 iscsi_scsi_task_cancel(iscsilun
->iscsi
, acb
->task
);
88 static AIOPool iscsi_aio_pool
= {
89 .aiocb_size
= sizeof(IscsiAIOCB
),
90 .cancel
= iscsi_aio_cancel
,
94 static void iscsi_process_read(void *arg
);
95 static void iscsi_process_write(void *arg
);
97 static int iscsi_process_flush(void *arg
)
99 IscsiLun
*iscsilun
= arg
;
101 return iscsi_queue_length(iscsilun
->iscsi
) > 0;
105 iscsi_set_events(IscsiLun
*iscsilun
)
107 struct iscsi_context
*iscsi
= iscsilun
->iscsi
;
110 /* We always register a read handler. */
112 ev
|= iscsi_which_events(iscsi
);
113 if (ev
!= iscsilun
->events
) {
114 qemu_aio_set_fd_handler(iscsi_get_fd(iscsi
),
116 (ev
& POLLOUT
) ? iscsi_process_write
: NULL
,
122 /* If we just added an event, the callback might be delayed
123 * unless we call qemu_notify_event().
125 if (ev
& ~iscsilun
->events
) {
128 iscsilun
->events
= ev
;
132 iscsi_process_read(void *arg
)
134 IscsiLun
*iscsilun
= arg
;
135 struct iscsi_context
*iscsi
= iscsilun
->iscsi
;
137 iscsi_service(iscsi
, POLLIN
);
138 iscsi_set_events(iscsilun
);
142 iscsi_process_write(void *arg
)
144 IscsiLun
*iscsilun
= arg
;
145 struct iscsi_context
*iscsi
= iscsilun
->iscsi
;
147 iscsi_service(iscsi
, POLLOUT
);
148 iscsi_set_events(iscsilun
);
153 iscsi_schedule_bh(QEMUBHFunc
*cb
, IscsiAIOCB
*acb
)
155 acb
->bh
= qemu_bh_new(cb
, acb
);
157 error_report("oom: could not create iscsi bh");
161 qemu_bh_schedule(acb
->bh
);
166 iscsi_readv_writev_bh_cb(void *p
)
170 qemu_bh_delete(acb
->bh
);
172 if (acb
->canceled
== 0) {
173 acb
->common
.cb(acb
->common
.opaque
, acb
->status
);
176 qemu_aio_release(acb
);
181 iscsi_aio_write10_cb(struct iscsi_context
*iscsi
, int status
,
182 void *command_data
, void *opaque
)
184 IscsiAIOCB
*acb
= opaque
;
186 trace_iscsi_aio_write10_cb(iscsi
, status
, acb
, acb
->canceled
);
190 if (acb
->canceled
!= 0) {
191 qemu_aio_release(acb
);
192 scsi_free_scsi_task(acb
->task
);
199 error_report("Failed to write10 data to iSCSI lun. %s",
200 iscsi_get_error(iscsi
));
204 iscsi_schedule_bh(iscsi_readv_writev_bh_cb
, acb
);
205 scsi_free_scsi_task(acb
->task
);
209 static int64_t sector_qemu2lun(int64_t sector
, IscsiLun
*iscsilun
)
211 return sector
* BDRV_SECTOR_SIZE
/ iscsilun
->block_size
;
214 static BlockDriverAIOCB
*
215 iscsi_aio_writev(BlockDriverState
*bs
, int64_t sector_num
,
216 QEMUIOVector
*qiov
, int nb_sectors
,
217 BlockDriverCompletionFunc
*cb
,
220 IscsiLun
*iscsilun
= bs
->opaque
;
221 struct iscsi_context
*iscsi
= iscsilun
->iscsi
;
226 /* set FUA on writes when cache mode is write through */
227 if (!(bs
->open_flags
& BDRV_O_CACHE_WB
)) {
231 acb
= qemu_aio_get(&iscsi_aio_pool
, bs
, cb
, opaque
);
232 trace_iscsi_aio_writev(iscsi
, sector_num
, nb_sectors
, opaque
, acb
);
234 acb
->iscsilun
= iscsilun
;
239 /* XXX we should pass the iovec to write10 to avoid the extra copy */
240 /* this will allow us to get rid of 'buf' completely */
241 size
= nb_sectors
* BDRV_SECTOR_SIZE
;
242 acb
->buf
= g_malloc(size
);
243 qemu_iovec_to_buffer(acb
->qiov
, acb
->buf
);
244 acb
->task
= iscsi_write10_task(iscsi
, iscsilun
->lun
, acb
->buf
, size
,
245 sector_qemu2lun(sector_num
, iscsilun
),
246 fua
, 0, iscsilun
->block_size
,
247 iscsi_aio_write10_cb
, acb
);
248 if (acb
->task
== NULL
) {
249 error_report("iSCSI: Failed to send write10 command. %s",
250 iscsi_get_error(iscsi
));
252 qemu_aio_release(acb
);
256 iscsi_set_events(iscsilun
);
262 iscsi_aio_read10_cb(struct iscsi_context
*iscsi
, int status
,
263 void *command_data
, void *opaque
)
265 IscsiAIOCB
*acb
= opaque
;
267 trace_iscsi_aio_read10_cb(iscsi
, status
, acb
, acb
->canceled
);
269 if (acb
->canceled
!= 0) {
270 qemu_aio_release(acb
);
271 scsi_free_scsi_task(acb
->task
);
278 error_report("Failed to read10 data from iSCSI lun. %s",
279 iscsi_get_error(iscsi
));
283 iscsi_schedule_bh(iscsi_readv_writev_bh_cb
, acb
);
284 scsi_free_scsi_task(acb
->task
);
288 static BlockDriverAIOCB
*
289 iscsi_aio_readv(BlockDriverState
*bs
, int64_t sector_num
,
290 QEMUIOVector
*qiov
, int nb_sectors
,
291 BlockDriverCompletionFunc
*cb
,
294 IscsiLun
*iscsilun
= bs
->opaque
;
295 struct iscsi_context
*iscsi
= iscsilun
->iscsi
;
297 size_t qemu_read_size
, lun_read_size
;
300 qemu_read_size
= BDRV_SECTOR_SIZE
* (size_t)nb_sectors
;
302 acb
= qemu_aio_get(&iscsi_aio_pool
, bs
, cb
, opaque
);
303 trace_iscsi_aio_readv(iscsi
, sector_num
, nb_sectors
, opaque
, acb
);
305 acb
->iscsilun
= iscsilun
;
309 acb
->read_size
= qemu_read_size
;
312 /* If LUN blocksize is bigger than BDRV_BLOCK_SIZE a read from QEMU
313 * may be misaligned to the LUN, so we may need to read some extra
316 acb
->read_offset
= 0;
317 if (iscsilun
->block_size
> BDRV_SECTOR_SIZE
) {
318 uint64_t bdrv_offset
= BDRV_SECTOR_SIZE
* sector_num
;
320 acb
->read_offset
= bdrv_offset
% iscsilun
->block_size
;
323 lun_read_size
= (qemu_read_size
+ iscsilun
->block_size
324 + acb
->read_offset
- 1)
325 / iscsilun
->block_size
* iscsilun
->block_size
;
326 acb
->task
= iscsi_read10_task(iscsi
, iscsilun
->lun
,
327 sector_qemu2lun(sector_num
, iscsilun
),
328 lun_read_size
, iscsilun
->block_size
,
329 iscsi_aio_read10_cb
, acb
);
330 if (acb
->task
== NULL
) {
331 error_report("iSCSI: Failed to send read10 command. %s",
332 iscsi_get_error(iscsi
));
333 qemu_aio_release(acb
);
337 for (i
= 0; i
< acb
->qiov
->niov
; i
++) {
338 scsi_task_add_data_in_buffer(acb
->task
,
339 acb
->qiov
->iov
[i
].iov_len
,
340 acb
->qiov
->iov
[i
].iov_base
);
343 iscsi_set_events(iscsilun
);
350 iscsi_synccache10_cb(struct iscsi_context
*iscsi
, int status
,
351 void *command_data
, void *opaque
)
353 IscsiAIOCB
*acb
= opaque
;
355 if (acb
->canceled
!= 0) {
356 qemu_aio_release(acb
);
357 scsi_free_scsi_task(acb
->task
);
364 error_report("Failed to sync10 data on iSCSI lun. %s",
365 iscsi_get_error(iscsi
));
369 iscsi_schedule_bh(iscsi_readv_writev_bh_cb
, acb
);
370 scsi_free_scsi_task(acb
->task
);
374 static BlockDriverAIOCB
*
375 iscsi_aio_flush(BlockDriverState
*bs
,
376 BlockDriverCompletionFunc
*cb
, void *opaque
)
378 IscsiLun
*iscsilun
= bs
->opaque
;
379 struct iscsi_context
*iscsi
= iscsilun
->iscsi
;
382 acb
= qemu_aio_get(&iscsi_aio_pool
, bs
, cb
, opaque
);
384 acb
->iscsilun
= iscsilun
;
387 acb
->task
= iscsi_synchronizecache10_task(iscsi
, iscsilun
->lun
,
389 iscsi_synccache10_cb
,
391 if (acb
->task
== NULL
) {
392 error_report("iSCSI: Failed to send synchronizecache10 command. %s",
393 iscsi_get_error(iscsi
));
394 qemu_aio_release(acb
);
398 iscsi_set_events(iscsilun
);
404 iscsi_unmap_cb(struct iscsi_context
*iscsi
, int status
,
405 void *command_data
, void *opaque
)
407 IscsiAIOCB
*acb
= opaque
;
409 if (acb
->canceled
!= 0) {
410 qemu_aio_release(acb
);
411 scsi_free_scsi_task(acb
->task
);
418 error_report("Failed to unmap data on iSCSI lun. %s",
419 iscsi_get_error(iscsi
));
423 iscsi_schedule_bh(iscsi_readv_writev_bh_cb
, acb
);
424 scsi_free_scsi_task(acb
->task
);
428 static BlockDriverAIOCB
*
429 iscsi_aio_discard(BlockDriverState
*bs
,
430 int64_t sector_num
, int nb_sectors
,
431 BlockDriverCompletionFunc
*cb
, void *opaque
)
433 IscsiLun
*iscsilun
= bs
->opaque
;
434 struct iscsi_context
*iscsi
= iscsilun
->iscsi
;
436 struct unmap_list list
[1];
438 acb
= qemu_aio_get(&iscsi_aio_pool
, bs
, cb
, opaque
);
440 acb
->iscsilun
= iscsilun
;
443 list
[0].lba
= sector_qemu2lun(sector_num
, iscsilun
);
444 list
[0].num
= nb_sectors
* BDRV_SECTOR_SIZE
/ iscsilun
->block_size
;
446 acb
->task
= iscsi_unmap_task(iscsi
, iscsilun
->lun
,
450 if (acb
->task
== NULL
) {
451 error_report("iSCSI: Failed to send unmap command. %s",
452 iscsi_get_error(iscsi
));
453 qemu_aio_release(acb
);
457 iscsi_set_events(iscsilun
);
463 iscsi_getlength(BlockDriverState
*bs
)
465 IscsiLun
*iscsilun
= bs
->opaque
;
468 len
= iscsilun
->num_blocks
;
469 len
*= iscsilun
->block_size
;
475 iscsi_readcapacity16_cb(struct iscsi_context
*iscsi
, int status
,
476 void *command_data
, void *opaque
)
478 struct IscsiTask
*itask
= opaque
;
479 struct scsi_readcapacity16
*rc16
;
480 struct scsi_task
*task
= command_data
;
483 error_report("iSCSI: Failed to read capacity of iSCSI lun. %s",
484 iscsi_get_error(iscsi
));
487 scsi_free_scsi_task(task
);
491 rc16
= scsi_datain_unmarshall(task
);
493 error_report("iSCSI: Failed to unmarshall readcapacity16 data.");
496 scsi_free_scsi_task(task
);
500 itask
->iscsilun
->block_size
= rc16
->block_length
;
501 itask
->iscsilun
->num_blocks
= rc16
->returned_lba
+ 1;
502 itask
->bs
->total_sectors
= itask
->iscsilun
->num_blocks
*
503 itask
->iscsilun
->block_size
/ BDRV_SECTOR_SIZE
;
507 scsi_free_scsi_task(task
);
511 iscsi_connect_cb(struct iscsi_context
*iscsi
, int status
, void *command_data
,
514 struct IscsiTask
*itask
= opaque
;
515 struct scsi_task
*task
;
523 task
= iscsi_readcapacity16_task(iscsi
, itask
->iscsilun
->lun
,
524 iscsi_readcapacity16_cb
, opaque
);
526 error_report("iSCSI: failed to send readcapacity16 command.");
533 static int parse_chap(struct iscsi_context
*iscsi
, const char *target
)
537 const char *user
= NULL
;
538 const char *password
= NULL
;
540 list
= qemu_find_opts("iscsi");
545 opts
= qemu_opts_find(list
, target
);
547 opts
= QTAILQ_FIRST(&list
->head
);
553 user
= qemu_opt_get(opts
, "user");
558 password
= qemu_opt_get(opts
, "password");
560 error_report("CHAP username specified but no password was given");
564 if (iscsi_set_initiator_username_pwd(iscsi
, user
, password
)) {
565 error_report("Failed to set initiator username and password");
572 static void parse_header_digest(struct iscsi_context
*iscsi
, const char *target
)
576 const char *digest
= NULL
;
578 list
= qemu_find_opts("iscsi");
583 opts
= qemu_opts_find(list
, target
);
585 opts
= QTAILQ_FIRST(&list
->head
);
591 digest
= qemu_opt_get(opts
, "header-digest");
596 if (!strcmp(digest
, "CRC32C")) {
597 iscsi_set_header_digest(iscsi
, ISCSI_HEADER_DIGEST_CRC32C
);
598 } else if (!strcmp(digest
, "NONE")) {
599 iscsi_set_header_digest(iscsi
, ISCSI_HEADER_DIGEST_NONE
);
600 } else if (!strcmp(digest
, "CRC32C-NONE")) {
601 iscsi_set_header_digest(iscsi
, ISCSI_HEADER_DIGEST_CRC32C_NONE
);
602 } else if (!strcmp(digest
, "NONE-CRC32C")) {
603 iscsi_set_header_digest(iscsi
, ISCSI_HEADER_DIGEST_NONE_CRC32C
);
605 error_report("Invalid header-digest setting : %s", digest
);
609 static char *parse_initiator_name(const char *target
)
613 const char *name
= NULL
;
615 list
= qemu_find_opts("iscsi");
617 return g_strdup("iqn.2008-11.org.linux-kvm");
620 opts
= qemu_opts_find(list
, target
);
622 opts
= QTAILQ_FIRST(&list
->head
);
624 return g_strdup("iqn.2008-11.org.linux-kvm");
628 name
= qemu_opt_get(opts
, "initiator-name");
630 return g_strdup("iqn.2008-11.org.linux-kvm");
633 return g_strdup(name
);
637 * We support iscsi url's on the form
638 * iscsi://[<username>%<password>@]<host>[:<port>]/<targetname>/<lun>
640 static int iscsi_open(BlockDriverState
*bs
, const char *filename
, int flags
)
642 IscsiLun
*iscsilun
= bs
->opaque
;
643 struct iscsi_context
*iscsi
= NULL
;
644 struct iscsi_url
*iscsi_url
= NULL
;
645 struct IscsiTask task
;
646 char *initiator_name
= NULL
;
649 if ((BDRV_SECTOR_SIZE
% 512) != 0) {
650 error_report("iSCSI: Invalid BDRV_SECTOR_SIZE. "
651 "BDRV_SECTOR_SIZE(%lld) is not a multiple "
652 "of 512", BDRV_SECTOR_SIZE
);
656 iscsi_url
= iscsi_parse_full_url(iscsi
, filename
);
657 if (iscsi_url
== NULL
) {
658 error_report("Failed to parse URL : %s %s", filename
,
659 iscsi_get_error(iscsi
));
664 memset(iscsilun
, 0, sizeof(IscsiLun
));
666 initiator_name
= parse_initiator_name(iscsi_url
->target
);
668 iscsi
= iscsi_create_context(initiator_name
);
670 error_report("iSCSI: Failed to create iSCSI context.");
675 if (iscsi_set_targetname(iscsi
, iscsi_url
->target
)) {
676 error_report("iSCSI: Failed to set target name.");
681 if (iscsi_url
->user
!= NULL
) {
682 ret
= iscsi_set_initiator_username_pwd(iscsi
, iscsi_url
->user
,
685 error_report("Failed to set initiator username and password");
691 /* check if we got CHAP username/password via the options */
692 if (parse_chap(iscsi
, iscsi_url
->target
) != 0) {
693 error_report("iSCSI: Failed to set CHAP user/password");
698 if (iscsi_set_session_type(iscsi
, ISCSI_SESSION_NORMAL
) != 0) {
699 error_report("iSCSI: Failed to set session type to normal.");
704 iscsi_set_header_digest(iscsi
, ISCSI_HEADER_DIGEST_NONE_CRC32C
);
706 /* check if we got HEADER_DIGEST via the options */
707 parse_header_digest(iscsi
, iscsi_url
->target
);
709 task
.iscsilun
= iscsilun
;
714 iscsilun
->iscsi
= iscsi
;
715 iscsilun
->lun
= iscsi_url
->lun
;
717 if (iscsi_full_connect_async(iscsi
, iscsi_url
->portal
, iscsi_url
->lun
,
718 iscsi_connect_cb
, &task
)
720 error_report("iSCSI: Failed to start async connect.");
725 while (!task
.complete
) {
726 iscsi_set_events(iscsilun
);
729 if (task
.status
!= 0) {
730 error_report("iSCSI: Failed to connect to LUN : %s",
731 iscsi_get_error(iscsi
));
736 if (iscsi_url
!= NULL
) {
737 iscsi_destroy_url(iscsi_url
);
742 if (initiator_name
!= NULL
) {
743 g_free(initiator_name
);
745 if (iscsi_url
!= NULL
) {
746 iscsi_destroy_url(iscsi_url
);
749 iscsi_destroy_context(iscsi
);
751 memset(iscsilun
, 0, sizeof(IscsiLun
));
755 static void iscsi_close(BlockDriverState
*bs
)
757 IscsiLun
*iscsilun
= bs
->opaque
;
758 struct iscsi_context
*iscsi
= iscsilun
->iscsi
;
760 qemu_aio_set_fd_handler(iscsi_get_fd(iscsi
), NULL
, NULL
, NULL
, NULL
);
761 iscsi_destroy_context(iscsi
);
762 memset(iscsilun
, 0, sizeof(IscsiLun
));
765 static BlockDriver bdrv_iscsi
= {
766 .format_name
= "iscsi",
767 .protocol_name
= "iscsi",
769 .instance_size
= sizeof(IscsiLun
),
770 .bdrv_file_open
= iscsi_open
,
771 .bdrv_close
= iscsi_close
,
773 .bdrv_getlength
= iscsi_getlength
,
775 .bdrv_aio_readv
= iscsi_aio_readv
,
776 .bdrv_aio_writev
= iscsi_aio_writev
,
777 .bdrv_aio_flush
= iscsi_aio_flush
,
779 .bdrv_aio_discard
= iscsi_aio_discard
,
782 static void iscsi_block_init(void)
784 bdrv_register(&bdrv_iscsi
);
787 block_init(iscsi_block_init
);