xref: /openbmc/qemu/block/iscsi.c (revision d8f8a860f2403533fc73f541122c65a34b21e42f)
1 /*
2  * QEMU Block driver for iSCSI images
3  *
4  * Copyright (c) 2010-2011 Ronnie Sahlberg <ronniesahlberg@gmail.com>
5  *
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:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
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
22  * THE SOFTWARE.
23  */
24 
25 #include "config-host.h"
26 
27 #include <poll.h>
28 #include <arpa/inet.h>
29 #include "qemu-common.h"
30 #include "qemu-error.h"
31 #include "block_int.h"
32 #include "trace.h"
33 #include "hw/scsi-defs.h"
34 
35 #include <iscsi/iscsi.h>
36 #include <iscsi/scsi-lowlevel.h>
37 
38 #ifdef __linux__
39 #include <scsi/sg.h>
40 #include <hw/scsi-defs.h>
41 #endif
42 
43 typedef struct IscsiLun {
44     struct iscsi_context *iscsi;
45     int lun;
46     enum scsi_inquiry_peripheral_device_type type;
47     int block_size;
48     uint64_t num_blocks;
49     int events;
50 } IscsiLun;
51 
52 typedef struct IscsiAIOCB {
53     BlockDriverAIOCB common;
54     QEMUIOVector *qiov;
55     QEMUBH *bh;
56     IscsiLun *iscsilun;
57     struct scsi_task *task;
58     uint8_t *buf;
59     int status;
60     int canceled;
61     size_t read_size;
62     size_t read_offset;
63 #ifdef __linux__
64     sg_io_hdr_t *ioh;
65 #endif
66 } IscsiAIOCB;
67 
68 struct IscsiTask {
69     IscsiLun *iscsilun;
70     BlockDriverState *bs;
71     int status;
72     int complete;
73 };
74 
75 static void
76 iscsi_bh_cb(void *p)
77 {
78     IscsiAIOCB *acb = p;
79 
80     qemu_bh_delete(acb->bh);
81 
82     if (acb->canceled == 0) {
83         acb->common.cb(acb->common.opaque, acb->status);
84     }
85 
86     if (acb->task != NULL) {
87         scsi_free_scsi_task(acb->task);
88         acb->task = NULL;
89     }
90 
91     qemu_aio_release(acb);
92 }
93 
94 static void
95 iscsi_schedule_bh(IscsiAIOCB *acb)
96 {
97     if (acb->bh) {
98         return;
99     }
100     acb->bh = qemu_bh_new(iscsi_bh_cb, acb);
101     qemu_bh_schedule(acb->bh);
102 }
103 
104 
105 static void
106 iscsi_abort_task_cb(struct iscsi_context *iscsi, int status, void *command_data,
107                     void *private_data)
108 {
109     IscsiAIOCB *acb = private_data;
110 
111     acb->status = -ECANCELED;
112     iscsi_schedule_bh(acb);
113 }
114 
115 static void
116 iscsi_aio_cancel(BlockDriverAIOCB *blockacb)
117 {
118     IscsiAIOCB *acb = (IscsiAIOCB *)blockacb;
119     IscsiLun *iscsilun = acb->iscsilun;
120 
121     if (acb->status != -EINPROGRESS) {
122         return;
123     }
124 
125     acb->canceled = 1;
126 
127     /* send a task mgmt call to the target to cancel the task on the target */
128     iscsi_task_mgmt_abort_task_async(iscsilun->iscsi, acb->task,
129                                      iscsi_abort_task_cb, acb);
130 
131     while (acb->status == -EINPROGRESS) {
132         qemu_aio_wait();
133     }
134 }
135 
136 static AIOPool iscsi_aio_pool = {
137     .aiocb_size         = sizeof(IscsiAIOCB),
138     .cancel             = iscsi_aio_cancel,
139 };
140 
141 
142 static void iscsi_process_read(void *arg);
143 static void iscsi_process_write(void *arg);
144 
145 static int iscsi_process_flush(void *arg)
146 {
147     IscsiLun *iscsilun = arg;
148 
149     return iscsi_queue_length(iscsilun->iscsi) > 0;
150 }
151 
152 static void
153 iscsi_set_events(IscsiLun *iscsilun)
154 {
155     struct iscsi_context *iscsi = iscsilun->iscsi;
156     int ev;
157 
158     /* We always register a read handler.  */
159     ev = POLLIN;
160     ev |= iscsi_which_events(iscsi);
161     if (ev != iscsilun->events) {
162         qemu_aio_set_fd_handler(iscsi_get_fd(iscsi),
163                       iscsi_process_read,
164                       (ev & POLLOUT) ? iscsi_process_write : NULL,
165                       iscsi_process_flush,
166                       iscsilun);
167 
168     }
169 
170     /* If we just added an event, the callback might be delayed
171      * unless we call qemu_notify_event().
172      */
173     if (ev & ~iscsilun->events) {
174         qemu_notify_event();
175     }
176     iscsilun->events = ev;
177 }
178 
179 static void
180 iscsi_process_read(void *arg)
181 {
182     IscsiLun *iscsilun = arg;
183     struct iscsi_context *iscsi = iscsilun->iscsi;
184 
185     iscsi_service(iscsi, POLLIN);
186     iscsi_set_events(iscsilun);
187 }
188 
189 static void
190 iscsi_process_write(void *arg)
191 {
192     IscsiLun *iscsilun = arg;
193     struct iscsi_context *iscsi = iscsilun->iscsi;
194 
195     iscsi_service(iscsi, POLLOUT);
196     iscsi_set_events(iscsilun);
197 }
198 
199 
200 static void
201 iscsi_aio_write16_cb(struct iscsi_context *iscsi, int status,
202                      void *command_data, void *opaque)
203 {
204     IscsiAIOCB *acb = opaque;
205 
206     trace_iscsi_aio_write16_cb(iscsi, status, acb, acb->canceled);
207 
208     g_free(acb->buf);
209 
210     if (acb->canceled != 0) {
211         return;
212     }
213 
214     acb->status = 0;
215     if (status < 0) {
216         error_report("Failed to write16 data to iSCSI lun. %s",
217                      iscsi_get_error(iscsi));
218         acb->status = -EIO;
219     }
220 
221     iscsi_schedule_bh(acb);
222 }
223 
224 static int64_t sector_qemu2lun(int64_t sector, IscsiLun *iscsilun)
225 {
226     return sector * BDRV_SECTOR_SIZE / iscsilun->block_size;
227 }
228 
229 static BlockDriverAIOCB *
230 iscsi_aio_writev(BlockDriverState *bs, int64_t sector_num,
231                  QEMUIOVector *qiov, int nb_sectors,
232                  BlockDriverCompletionFunc *cb,
233                  void *opaque)
234 {
235     IscsiLun *iscsilun = bs->opaque;
236     struct iscsi_context *iscsi = iscsilun->iscsi;
237     IscsiAIOCB *acb;
238     size_t size;
239     uint32_t num_sectors;
240     uint64_t lba;
241     struct iscsi_data data;
242 
243     acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque);
244     trace_iscsi_aio_writev(iscsi, sector_num, nb_sectors, opaque, acb);
245 
246     acb->iscsilun = iscsilun;
247     acb->qiov     = qiov;
248 
249     acb->canceled   = 0;
250     acb->bh         = NULL;
251     acb->status     = -EINPROGRESS;
252 
253     /* XXX we should pass the iovec to write16 to avoid the extra copy */
254     /* this will allow us to get rid of 'buf' completely */
255     size = nb_sectors * BDRV_SECTOR_SIZE;
256     acb->buf = g_malloc(size);
257     qemu_iovec_to_buf(acb->qiov, 0, acb->buf, size);
258 
259     acb->task = malloc(sizeof(struct scsi_task));
260     if (acb->task == NULL) {
261         error_report("iSCSI: Failed to allocate task for scsi WRITE16 "
262                      "command. %s", iscsi_get_error(iscsi));
263         qemu_aio_release(acb);
264         return NULL;
265     }
266     memset(acb->task, 0, sizeof(struct scsi_task));
267 
268     acb->task->xfer_dir = SCSI_XFER_WRITE;
269     acb->task->cdb_size = 16;
270     acb->task->cdb[0] = 0x8a;
271     if (!(bs->open_flags & BDRV_O_CACHE_WB)) {
272         /* set FUA on writes when cache mode is write through */
273         acb->task->cdb[1] |= 0x04;
274     }
275     lba = sector_qemu2lun(sector_num, iscsilun);
276     *(uint32_t *)&acb->task->cdb[2]  = htonl(lba >> 32);
277     *(uint32_t *)&acb->task->cdb[6]  = htonl(lba & 0xffffffff);
278     num_sectors = size / iscsilun->block_size;
279     *(uint32_t *)&acb->task->cdb[10] = htonl(num_sectors);
280     acb->task->expxferlen = size;
281 
282     data.data = acb->buf;
283     data.size = size;
284 
285     if (iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task,
286                                  iscsi_aio_write16_cb,
287                                  &data,
288                                  acb) != 0) {
289         scsi_free_scsi_task(acb->task);
290         g_free(acb->buf);
291         qemu_aio_release(acb);
292         return NULL;
293     }
294 
295     iscsi_set_events(iscsilun);
296 
297     return &acb->common;
298 }
299 
300 static void
301 iscsi_aio_read16_cb(struct iscsi_context *iscsi, int status,
302                     void *command_data, void *opaque)
303 {
304     IscsiAIOCB *acb = opaque;
305 
306     trace_iscsi_aio_read16_cb(iscsi, status, acb, acb->canceled);
307 
308     if (acb->canceled != 0) {
309         return;
310     }
311 
312     acb->status = 0;
313     if (status != 0) {
314         error_report("Failed to read16 data from iSCSI lun. %s",
315                      iscsi_get_error(iscsi));
316         acb->status = -EIO;
317     }
318 
319     iscsi_schedule_bh(acb);
320 }
321 
322 static BlockDriverAIOCB *
323 iscsi_aio_readv(BlockDriverState *bs, int64_t sector_num,
324                 QEMUIOVector *qiov, int nb_sectors,
325                 BlockDriverCompletionFunc *cb,
326                 void *opaque)
327 {
328     IscsiLun *iscsilun = bs->opaque;
329     struct iscsi_context *iscsi = iscsilun->iscsi;
330     IscsiAIOCB *acb;
331     size_t qemu_read_size;
332     int i;
333     uint64_t lba;
334     uint32_t num_sectors;
335 
336     qemu_read_size = BDRV_SECTOR_SIZE * (size_t)nb_sectors;
337 
338     acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque);
339     trace_iscsi_aio_readv(iscsi, sector_num, nb_sectors, opaque, acb);
340 
341     acb->iscsilun = iscsilun;
342     acb->qiov     = qiov;
343 
344     acb->canceled    = 0;
345     acb->bh          = NULL;
346     acb->status      = -EINPROGRESS;
347     acb->read_size   = qemu_read_size;
348     acb->buf         = NULL;
349 
350     /* If LUN blocksize is bigger than BDRV_BLOCK_SIZE a read from QEMU
351      * may be misaligned to the LUN, so we may need to read some extra
352      * data.
353      */
354     acb->read_offset = 0;
355     if (iscsilun->block_size > BDRV_SECTOR_SIZE) {
356         uint64_t bdrv_offset = BDRV_SECTOR_SIZE * sector_num;
357 
358         acb->read_offset  = bdrv_offset % iscsilun->block_size;
359     }
360 
361     num_sectors  = (qemu_read_size + iscsilun->block_size
362                     + acb->read_offset - 1)
363                     / iscsilun->block_size;
364 
365     acb->task = malloc(sizeof(struct scsi_task));
366     if (acb->task == NULL) {
367         error_report("iSCSI: Failed to allocate task for scsi READ16 "
368                      "command. %s", iscsi_get_error(iscsi));
369         qemu_aio_release(acb);
370         return NULL;
371     }
372     memset(acb->task, 0, sizeof(struct scsi_task));
373 
374     acb->task->xfer_dir = SCSI_XFER_READ;
375     lba = sector_qemu2lun(sector_num, iscsilun);
376     acb->task->expxferlen = qemu_read_size;
377 
378     switch (iscsilun->type) {
379     case TYPE_DISK:
380         acb->task->cdb_size = 16;
381         acb->task->cdb[0]  = 0x88;
382         *(uint32_t *)&acb->task->cdb[2]  = htonl(lba >> 32);
383         *(uint32_t *)&acb->task->cdb[6]  = htonl(lba & 0xffffffff);
384         *(uint32_t *)&acb->task->cdb[10] = htonl(num_sectors);
385         break;
386     default:
387         acb->task->cdb_size = 10;
388         acb->task->cdb[0]  = 0x28;
389         *(uint32_t *)&acb->task->cdb[2] = htonl(lba);
390         *(uint16_t *)&acb->task->cdb[7] = htons(num_sectors);
391         break;
392     }
393 
394     if (iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task,
395                                  iscsi_aio_read16_cb,
396                                  NULL,
397                                  acb) != 0) {
398         scsi_free_scsi_task(acb->task);
399         qemu_aio_release(acb);
400         return NULL;
401     }
402 
403     for (i = 0; i < acb->qiov->niov; i++) {
404         scsi_task_add_data_in_buffer(acb->task,
405                 acb->qiov->iov[i].iov_len,
406                 acb->qiov->iov[i].iov_base);
407     }
408 
409     iscsi_set_events(iscsilun);
410 
411     return &acb->common;
412 }
413 
414 
415 static void
416 iscsi_synccache10_cb(struct iscsi_context *iscsi, int status,
417                      void *command_data, void *opaque)
418 {
419     IscsiAIOCB *acb = opaque;
420 
421     if (acb->canceled != 0) {
422         return;
423     }
424 
425     acb->status = 0;
426     if (status < 0) {
427         error_report("Failed to sync10 data on iSCSI lun. %s",
428                      iscsi_get_error(iscsi));
429         acb->status = -EIO;
430     }
431 
432     iscsi_schedule_bh(acb);
433 }
434 
435 static BlockDriverAIOCB *
436 iscsi_aio_flush(BlockDriverState *bs,
437                 BlockDriverCompletionFunc *cb, void *opaque)
438 {
439     IscsiLun *iscsilun = bs->opaque;
440     struct iscsi_context *iscsi = iscsilun->iscsi;
441     IscsiAIOCB *acb;
442 
443     acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque);
444 
445     acb->iscsilun = iscsilun;
446     acb->canceled   = 0;
447     acb->bh         = NULL;
448     acb->status     = -EINPROGRESS;
449 
450     acb->task = iscsi_synchronizecache10_task(iscsi, iscsilun->lun,
451                                          0, 0, 0, 0,
452                                          iscsi_synccache10_cb,
453                                          acb);
454     if (acb->task == NULL) {
455         error_report("iSCSI: Failed to send synchronizecache10 command. %s",
456                      iscsi_get_error(iscsi));
457         qemu_aio_release(acb);
458         return NULL;
459     }
460 
461     iscsi_set_events(iscsilun);
462 
463     return &acb->common;
464 }
465 
466 static void
467 iscsi_unmap_cb(struct iscsi_context *iscsi, int status,
468                      void *command_data, void *opaque)
469 {
470     IscsiAIOCB *acb = opaque;
471 
472     if (acb->canceled != 0) {
473         return;
474     }
475 
476     acb->status = 0;
477     if (status < 0) {
478         error_report("Failed to unmap data on iSCSI lun. %s",
479                      iscsi_get_error(iscsi));
480         acb->status = -EIO;
481     }
482 
483     iscsi_schedule_bh(acb);
484 }
485 
486 static BlockDriverAIOCB *
487 iscsi_aio_discard(BlockDriverState *bs,
488                   int64_t sector_num, int nb_sectors,
489                   BlockDriverCompletionFunc *cb, void *opaque)
490 {
491     IscsiLun *iscsilun = bs->opaque;
492     struct iscsi_context *iscsi = iscsilun->iscsi;
493     IscsiAIOCB *acb;
494     struct unmap_list list[1];
495 
496     acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque);
497 
498     acb->iscsilun = iscsilun;
499     acb->canceled   = 0;
500     acb->bh         = NULL;
501     acb->status     = -EINPROGRESS;
502 
503     list[0].lba = sector_qemu2lun(sector_num, iscsilun);
504     list[0].num = nb_sectors * BDRV_SECTOR_SIZE / iscsilun->block_size;
505 
506     acb->task = iscsi_unmap_task(iscsi, iscsilun->lun,
507                                  0, 0, &list[0], 1,
508                                  iscsi_unmap_cb,
509                                  acb);
510     if (acb->task == NULL) {
511         error_report("iSCSI: Failed to send unmap command. %s",
512                      iscsi_get_error(iscsi));
513         qemu_aio_release(acb);
514         return NULL;
515     }
516 
517     iscsi_set_events(iscsilun);
518 
519     return &acb->common;
520 }
521 
522 #ifdef __linux__
523 static void
524 iscsi_aio_ioctl_cb(struct iscsi_context *iscsi, int status,
525                      void *command_data, void *opaque)
526 {
527     IscsiAIOCB *acb = opaque;
528 
529     if (acb->canceled != 0) {
530         return;
531     }
532 
533     acb->status = 0;
534     if (status < 0) {
535         error_report("Failed to ioctl(SG_IO) to iSCSI lun. %s",
536                      iscsi_get_error(iscsi));
537         acb->status = -EIO;
538     }
539 
540     acb->ioh->driver_status = 0;
541     acb->ioh->host_status   = 0;
542     acb->ioh->resid         = 0;
543 
544 #define SG_ERR_DRIVER_SENSE    0x08
545 
546     if (status == SCSI_STATUS_CHECK_CONDITION && acb->task->datain.size >= 2) {
547         int ss;
548 
549         acb->ioh->driver_status |= SG_ERR_DRIVER_SENSE;
550 
551         acb->ioh->sb_len_wr = acb->task->datain.size - 2;
552         ss = (acb->ioh->mx_sb_len >= acb->ioh->sb_len_wr) ?
553              acb->ioh->mx_sb_len : acb->ioh->sb_len_wr;
554         memcpy(acb->ioh->sbp, &acb->task->datain.data[2], ss);
555     }
556 
557     iscsi_schedule_bh(acb);
558 }
559 
560 static BlockDriverAIOCB *iscsi_aio_ioctl(BlockDriverState *bs,
561         unsigned long int req, void *buf,
562         BlockDriverCompletionFunc *cb, void *opaque)
563 {
564     IscsiLun *iscsilun = bs->opaque;
565     struct iscsi_context *iscsi = iscsilun->iscsi;
566     struct iscsi_data data;
567     IscsiAIOCB *acb;
568 
569     assert(req == SG_IO);
570 
571     acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque);
572 
573     acb->iscsilun = iscsilun;
574     acb->canceled    = 0;
575     acb->bh          = NULL;
576     acb->status      = -EINPROGRESS;
577     acb->buf         = NULL;
578     acb->ioh         = buf;
579 
580     acb->task = malloc(sizeof(struct scsi_task));
581     if (acb->task == NULL) {
582         error_report("iSCSI: Failed to allocate task for scsi command. %s",
583                      iscsi_get_error(iscsi));
584         qemu_aio_release(acb);
585         return NULL;
586     }
587     memset(acb->task, 0, sizeof(struct scsi_task));
588 
589     switch (acb->ioh->dxfer_direction) {
590     case SG_DXFER_TO_DEV:
591         acb->task->xfer_dir = SCSI_XFER_WRITE;
592         break;
593     case SG_DXFER_FROM_DEV:
594         acb->task->xfer_dir = SCSI_XFER_READ;
595         break;
596     default:
597         acb->task->xfer_dir = SCSI_XFER_NONE;
598         break;
599     }
600 
601     acb->task->cdb_size = acb->ioh->cmd_len;
602     memcpy(&acb->task->cdb[0], acb->ioh->cmdp, acb->ioh->cmd_len);
603     acb->task->expxferlen = acb->ioh->dxfer_len;
604 
605     if (acb->task->xfer_dir == SCSI_XFER_WRITE) {
606         data.data = acb->ioh->dxferp;
607         data.size = acb->ioh->dxfer_len;
608     }
609     if (iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task,
610                                  iscsi_aio_ioctl_cb,
611                                  (acb->task->xfer_dir == SCSI_XFER_WRITE) ?
612                                      &data : NULL,
613                                  acb) != 0) {
614         scsi_free_scsi_task(acb->task);
615         qemu_aio_release(acb);
616         return NULL;
617     }
618 
619     /* tell libiscsi to read straight into the buffer we got from ioctl */
620     if (acb->task->xfer_dir == SCSI_XFER_READ) {
621         scsi_task_add_data_in_buffer(acb->task,
622                                      acb->ioh->dxfer_len,
623                                      acb->ioh->dxferp);
624     }
625 
626     iscsi_set_events(iscsilun);
627 
628     return &acb->common;
629 }
630 
631 static int iscsi_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
632 {
633     IscsiLun *iscsilun = bs->opaque;
634 
635     switch (req) {
636     case SG_GET_VERSION_NUM:
637         *(int *)buf = 30000;
638         break;
639     case SG_GET_SCSI_ID:
640         ((struct sg_scsi_id *)buf)->scsi_type = iscsilun->type;
641         break;
642     default:
643         return -1;
644     }
645     return 0;
646 }
647 #endif
648 
649 static int64_t
650 iscsi_getlength(BlockDriverState *bs)
651 {
652     IscsiLun *iscsilun = bs->opaque;
653     int64_t len;
654 
655     len  = iscsilun->num_blocks;
656     len *= iscsilun->block_size;
657 
658     return len;
659 }
660 
661 static void
662 iscsi_readcapacity16_cb(struct iscsi_context *iscsi, int status,
663                         void *command_data, void *opaque)
664 {
665     struct IscsiTask *itask = opaque;
666     struct scsi_readcapacity16 *rc16;
667     struct scsi_task *task = command_data;
668 
669     if (status != 0) {
670         error_report("iSCSI: Failed to read capacity of iSCSI lun. %s",
671                      iscsi_get_error(iscsi));
672         itask->status   = 1;
673         itask->complete = 1;
674         scsi_free_scsi_task(task);
675         return;
676     }
677 
678     rc16 = scsi_datain_unmarshall(task);
679     if (rc16 == NULL) {
680         error_report("iSCSI: Failed to unmarshall readcapacity16 data.");
681         itask->status   = 1;
682         itask->complete = 1;
683         scsi_free_scsi_task(task);
684         return;
685     }
686 
687     itask->iscsilun->block_size = rc16->block_length;
688     itask->iscsilun->num_blocks = rc16->returned_lba + 1;
689     itask->bs->total_sectors    = itask->iscsilun->num_blocks *
690                                itask->iscsilun->block_size / BDRV_SECTOR_SIZE ;
691 
692     itask->status   = 0;
693     itask->complete = 1;
694     scsi_free_scsi_task(task);
695 }
696 
697 static void
698 iscsi_readcapacity10_cb(struct iscsi_context *iscsi, int status,
699                         void *command_data, void *opaque)
700 {
701     struct IscsiTask *itask = opaque;
702     struct scsi_readcapacity10 *rc10;
703     struct scsi_task *task = command_data;
704 
705     if (status != 0) {
706         error_report("iSCSI: Failed to read capacity of iSCSI lun. %s",
707                      iscsi_get_error(iscsi));
708         itask->status   = 1;
709         itask->complete = 1;
710         scsi_free_scsi_task(task);
711         return;
712     }
713 
714     rc10 = scsi_datain_unmarshall(task);
715     if (rc10 == NULL) {
716         error_report("iSCSI: Failed to unmarshall readcapacity10 data.");
717         itask->status   = 1;
718         itask->complete = 1;
719         scsi_free_scsi_task(task);
720         return;
721     }
722 
723     itask->iscsilun->block_size = rc10->block_size;
724     if (rc10->lba == 0) {
725         /* blank disk loaded */
726         itask->iscsilun->num_blocks = 0;
727     } else {
728         itask->iscsilun->num_blocks = rc10->lba + 1;
729     }
730     itask->bs->total_sectors    = itask->iscsilun->num_blocks *
731                                itask->iscsilun->block_size / BDRV_SECTOR_SIZE ;
732 
733     itask->status   = 0;
734     itask->complete = 1;
735     scsi_free_scsi_task(task);
736 }
737 
738 static void
739 iscsi_inquiry_cb(struct iscsi_context *iscsi, int status, void *command_data,
740                  void *opaque)
741 {
742     struct IscsiTask *itask = opaque;
743     struct scsi_task *task = command_data;
744     struct scsi_inquiry_standard *inq;
745 
746     if (status != 0) {
747         itask->status   = 1;
748         itask->complete = 1;
749         scsi_free_scsi_task(task);
750         return;
751     }
752 
753     inq = scsi_datain_unmarshall(task);
754     if (inq == NULL) {
755         error_report("iSCSI: Failed to unmarshall inquiry data.");
756         itask->status   = 1;
757         itask->complete = 1;
758         scsi_free_scsi_task(task);
759         return;
760     }
761 
762     itask->iscsilun->type = inq->periperal_device_type;
763 
764     scsi_free_scsi_task(task);
765 
766     switch (itask->iscsilun->type) {
767     case TYPE_DISK:
768         task = iscsi_readcapacity16_task(iscsi, itask->iscsilun->lun,
769                                    iscsi_readcapacity16_cb, opaque);
770         if (task == NULL) {
771             error_report("iSCSI: failed to send readcapacity16 command.");
772             itask->status   = 1;
773             itask->complete = 1;
774             return;
775         }
776         break;
777     case TYPE_ROM:
778         task = iscsi_readcapacity10_task(iscsi, itask->iscsilun->lun,
779                                    0, 0,
780                                    iscsi_readcapacity10_cb, opaque);
781         if (task == NULL) {
782             error_report("iSCSI: failed to send readcapacity16 command.");
783             itask->status   = 1;
784             itask->complete = 1;
785             return;
786         }
787         break;
788     default:
789         itask->status   = 0;
790         itask->complete = 1;
791     }
792 }
793 
794 static void
795 iscsi_connect_cb(struct iscsi_context *iscsi, int status, void *command_data,
796                  void *opaque)
797 {
798     struct IscsiTask *itask = opaque;
799     struct scsi_task *task;
800 
801     if (status != 0) {
802         itask->status   = 1;
803         itask->complete = 1;
804         return;
805     }
806 
807     task = iscsi_inquiry_task(iscsi, itask->iscsilun->lun,
808                               0, 0, 36,
809                               iscsi_inquiry_cb, opaque);
810     if (task == NULL) {
811         error_report("iSCSI: failed to send inquiry command.");
812         itask->status   = 1;
813         itask->complete = 1;
814         return;
815     }
816 }
817 
818 static int parse_chap(struct iscsi_context *iscsi, const char *target)
819 {
820     QemuOptsList *list;
821     QemuOpts *opts;
822     const char *user = NULL;
823     const char *password = NULL;
824 
825     list = qemu_find_opts("iscsi");
826     if (!list) {
827         return 0;
828     }
829 
830     opts = qemu_opts_find(list, target);
831     if (opts == NULL) {
832         opts = QTAILQ_FIRST(&list->head);
833         if (!opts) {
834             return 0;
835         }
836     }
837 
838     user = qemu_opt_get(opts, "user");
839     if (!user) {
840         return 0;
841     }
842 
843     password = qemu_opt_get(opts, "password");
844     if (!password) {
845         error_report("CHAP username specified but no password was given");
846         return -1;
847     }
848 
849     if (iscsi_set_initiator_username_pwd(iscsi, user, password)) {
850         error_report("Failed to set initiator username and password");
851         return -1;
852     }
853 
854     return 0;
855 }
856 
857 static void parse_header_digest(struct iscsi_context *iscsi, const char *target)
858 {
859     QemuOptsList *list;
860     QemuOpts *opts;
861     const char *digest = NULL;
862 
863     list = qemu_find_opts("iscsi");
864     if (!list) {
865         return;
866     }
867 
868     opts = qemu_opts_find(list, target);
869     if (opts == NULL) {
870         opts = QTAILQ_FIRST(&list->head);
871         if (!opts) {
872             return;
873         }
874     }
875 
876     digest = qemu_opt_get(opts, "header-digest");
877     if (!digest) {
878         return;
879     }
880 
881     if (!strcmp(digest, "CRC32C")) {
882         iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_CRC32C);
883     } else if (!strcmp(digest, "NONE")) {
884         iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE);
885     } else if (!strcmp(digest, "CRC32C-NONE")) {
886         iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_CRC32C_NONE);
887     } else if (!strcmp(digest, "NONE-CRC32C")) {
888         iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
889     } else {
890         error_report("Invalid header-digest setting : %s", digest);
891     }
892 }
893 
894 static char *parse_initiator_name(const char *target)
895 {
896     QemuOptsList *list;
897     QemuOpts *opts;
898     const char *name = NULL;
899     const char *iscsi_name = qemu_get_vm_name();
900 
901     list = qemu_find_opts("iscsi");
902     if (list) {
903         opts = qemu_opts_find(list, target);
904         if (!opts) {
905             opts = QTAILQ_FIRST(&list->head);
906         }
907         if (opts) {
908             name = qemu_opt_get(opts, "initiator-name");
909         }
910     }
911 
912     if (name) {
913         return g_strdup(name);
914     } else {
915         return g_strdup_printf("iqn.2008-11.org.linux-kvm%s%s",
916                                iscsi_name ? ":" : "",
917                                iscsi_name ? iscsi_name : "");
918     }
919 }
920 
921 /*
922  * We support iscsi url's on the form
923  * iscsi://[<username>%<password>@]<host>[:<port>]/<targetname>/<lun>
924  */
925 static int iscsi_open(BlockDriverState *bs, const char *filename, int flags)
926 {
927     IscsiLun *iscsilun = bs->opaque;
928     struct iscsi_context *iscsi = NULL;
929     struct iscsi_url *iscsi_url = NULL;
930     struct IscsiTask task;
931     char *initiator_name = NULL;
932     int ret;
933 
934     if ((BDRV_SECTOR_SIZE % 512) != 0) {
935         error_report("iSCSI: Invalid BDRV_SECTOR_SIZE. "
936                      "BDRV_SECTOR_SIZE(%lld) is not a multiple "
937                      "of 512", BDRV_SECTOR_SIZE);
938         return -EINVAL;
939     }
940 
941     iscsi_url = iscsi_parse_full_url(iscsi, filename);
942     if (iscsi_url == NULL) {
943         error_report("Failed to parse URL : %s %s", filename,
944                      iscsi_get_error(iscsi));
945         ret = -EINVAL;
946         goto out;
947     }
948 
949     memset(iscsilun, 0, sizeof(IscsiLun));
950 
951     initiator_name = parse_initiator_name(iscsi_url->target);
952 
953     iscsi = iscsi_create_context(initiator_name);
954     if (iscsi == NULL) {
955         error_report("iSCSI: Failed to create iSCSI context.");
956         ret = -ENOMEM;
957         goto out;
958     }
959 
960     if (iscsi_set_targetname(iscsi, iscsi_url->target)) {
961         error_report("iSCSI: Failed to set target name.");
962         ret = -EINVAL;
963         goto out;
964     }
965 
966     if (iscsi_url->user != NULL) {
967         ret = iscsi_set_initiator_username_pwd(iscsi, iscsi_url->user,
968                                               iscsi_url->passwd);
969         if (ret != 0) {
970             error_report("Failed to set initiator username and password");
971             ret = -EINVAL;
972             goto out;
973         }
974     }
975 
976     /* check if we got CHAP username/password via the options */
977     if (parse_chap(iscsi, iscsi_url->target) != 0) {
978         error_report("iSCSI: Failed to set CHAP user/password");
979         ret = -EINVAL;
980         goto out;
981     }
982 
983     if (iscsi_set_session_type(iscsi, ISCSI_SESSION_NORMAL) != 0) {
984         error_report("iSCSI: Failed to set session type to normal.");
985         ret = -EINVAL;
986         goto out;
987     }
988 
989     iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
990 
991     /* check if we got HEADER_DIGEST via the options */
992     parse_header_digest(iscsi, iscsi_url->target);
993 
994     task.iscsilun = iscsilun;
995     task.status = 0;
996     task.complete = 0;
997     task.bs = bs;
998 
999     iscsilun->iscsi = iscsi;
1000     iscsilun->lun   = iscsi_url->lun;
1001 
1002     if (iscsi_full_connect_async(iscsi, iscsi_url->portal, iscsi_url->lun,
1003                                  iscsi_connect_cb, &task)
1004         != 0) {
1005         error_report("iSCSI: Failed to start async connect.");
1006         ret = -EINVAL;
1007         goto out;
1008     }
1009 
1010     while (!task.complete) {
1011         iscsi_set_events(iscsilun);
1012         qemu_aio_wait();
1013     }
1014     if (task.status != 0) {
1015         error_report("iSCSI: Failed to connect to LUN : %s",
1016                      iscsi_get_error(iscsi));
1017         ret = -EINVAL;
1018         goto out;
1019     }
1020 
1021     /* Medium changer or tape. We dont have any emulation for this so this must
1022      * be sg ioctl compatible. We force it to be sg, otherwise qemu will try
1023      * to read from the device to guess the image format.
1024      */
1025     if (iscsilun->type == TYPE_MEDIUM_CHANGER ||
1026         iscsilun->type == TYPE_TAPE) {
1027         bs->sg = 1;
1028     }
1029 
1030     ret = 0;
1031 
1032 out:
1033     if (initiator_name != NULL) {
1034         g_free(initiator_name);
1035     }
1036     if (iscsi_url != NULL) {
1037         iscsi_destroy_url(iscsi_url);
1038     }
1039 
1040     if (ret) {
1041         if (iscsi != NULL) {
1042             iscsi_destroy_context(iscsi);
1043         }
1044         memset(iscsilun, 0, sizeof(IscsiLun));
1045     }
1046     return ret;
1047 }
1048 
1049 static void iscsi_close(BlockDriverState *bs)
1050 {
1051     IscsiLun *iscsilun = bs->opaque;
1052     struct iscsi_context *iscsi = iscsilun->iscsi;
1053 
1054     qemu_aio_set_fd_handler(iscsi_get_fd(iscsi), NULL, NULL, NULL, NULL);
1055     iscsi_destroy_context(iscsi);
1056     memset(iscsilun, 0, sizeof(IscsiLun));
1057 }
1058 
1059 static BlockDriver bdrv_iscsi = {
1060     .format_name     = "iscsi",
1061     .protocol_name   = "iscsi",
1062 
1063     .instance_size   = sizeof(IscsiLun),
1064     .bdrv_file_open  = iscsi_open,
1065     .bdrv_close      = iscsi_close,
1066 
1067     .bdrv_getlength  = iscsi_getlength,
1068 
1069     .bdrv_aio_readv  = iscsi_aio_readv,
1070     .bdrv_aio_writev = iscsi_aio_writev,
1071     .bdrv_aio_flush  = iscsi_aio_flush,
1072 
1073     .bdrv_aio_discard = iscsi_aio_discard,
1074 
1075 #ifdef __linux__
1076     .bdrv_ioctl       = iscsi_ioctl,
1077     .bdrv_aio_ioctl   = iscsi_aio_ioctl,
1078 #endif
1079 };
1080 
1081 static void iscsi_block_init(void)
1082 {
1083     bdrv_register(&bdrv_iscsi);
1084 }
1085 
1086 block_init(iscsi_block_init);
1087