xref: /openbmc/qemu/block/iscsi.c (revision 88c1ee73)
1 /*
2  * QEMU Block driver for iSCSI images
3  *
4  * Copyright (c) 2010-2011 Ronnie Sahlberg <ronniesahlberg@gmail.com>
5  * Copyright (c) 2012-2013 Peter Lieven <pl@kamp.de>
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11  * copies of the Software, and to permit persons to whom the Software is
12  * furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in
15  * all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23  * THE SOFTWARE.
24  */
25 
26 #include "config-host.h"
27 
28 #include <poll.h>
29 #include <arpa/inet.h>
30 #include "qemu-common.h"
31 #include "qemu/config-file.h"
32 #include "qemu/error-report.h"
33 #include "block/block_int.h"
34 #include "trace.h"
35 #include "block/scsi.h"
36 #include "qemu/iov.h"
37 #include "sysemu/sysemu.h"
38 #include "qmp-commands.h"
39 
40 #include <iscsi/iscsi.h>
41 #include <iscsi/scsi-lowlevel.h>
42 
43 #ifdef __linux__
44 #include <scsi/sg.h>
45 #include <block/scsi.h>
46 #endif
47 
48 typedef struct IscsiLun {
49     struct iscsi_context *iscsi;
50     int lun;
51     enum scsi_inquiry_peripheral_device_type type;
52     int block_size;
53     uint64_t num_blocks;
54     int events;
55     QEMUTimer *nop_timer;
56     uint8_t lbpme;
57     uint8_t lbprz;
58     uint8_t has_write_same;
59     struct scsi_inquiry_logical_block_provisioning lbp;
60     struct scsi_inquiry_block_limits bl;
61     unsigned char *zeroblock;
62 } IscsiLun;
63 
64 typedef struct IscsiTask {
65     int status;
66     int complete;
67     int retries;
68     int do_retry;
69     struct scsi_task *task;
70     Coroutine *co;
71     QEMUBH *bh;
72 } IscsiTask;
73 
74 typedef struct IscsiAIOCB {
75     BlockDriverAIOCB common;
76     QEMUIOVector *qiov;
77     QEMUBH *bh;
78     IscsiLun *iscsilun;
79     struct scsi_task *task;
80     uint8_t *buf;
81     int status;
82     int canceled;
83     int retries;
84     int64_t sector_num;
85     int nb_sectors;
86 #ifdef __linux__
87     sg_io_hdr_t *ioh;
88 #endif
89 } IscsiAIOCB;
90 
91 #define NOP_INTERVAL 5000
92 #define MAX_NOP_FAILURES 3
93 #define ISCSI_CMD_RETRIES 5
94 
95 static void
96 iscsi_bh_cb(void *p)
97 {
98     IscsiAIOCB *acb = p;
99 
100     qemu_bh_delete(acb->bh);
101 
102     g_free(acb->buf);
103     acb->buf = NULL;
104 
105     if (acb->canceled == 0) {
106         acb->common.cb(acb->common.opaque, acb->status);
107     }
108 
109     if (acb->task != NULL) {
110         scsi_free_scsi_task(acb->task);
111         acb->task = NULL;
112     }
113 
114     qemu_aio_release(acb);
115 }
116 
117 static void
118 iscsi_schedule_bh(IscsiAIOCB *acb)
119 {
120     if (acb->bh) {
121         return;
122     }
123     acb->bh = qemu_bh_new(iscsi_bh_cb, acb);
124     qemu_bh_schedule(acb->bh);
125 }
126 
127 static void iscsi_co_generic_bh_cb(void *opaque)
128 {
129     struct IscsiTask *iTask = opaque;
130     qemu_bh_delete(iTask->bh);
131     qemu_coroutine_enter(iTask->co, NULL);
132 }
133 
134 static void
135 iscsi_co_generic_cb(struct iscsi_context *iscsi, int status,
136                         void *command_data, void *opaque)
137 {
138     struct IscsiTask *iTask = opaque;
139     struct scsi_task *task = command_data;
140 
141     iTask->complete = 1;
142     iTask->status = status;
143     iTask->do_retry = 0;
144     iTask->task = task;
145 
146     if (iTask->retries-- > 0 && status == SCSI_STATUS_CHECK_CONDITION
147         && task->sense.key == SCSI_SENSE_UNIT_ATTENTION) {
148         iTask->do_retry = 1;
149         goto out;
150     }
151 
152     if (status != SCSI_STATUS_GOOD) {
153         error_report("iSCSI: Failure. %s", iscsi_get_error(iscsi));
154     }
155 
156 out:
157     if (iTask->co) {
158         iTask->bh = qemu_bh_new(iscsi_co_generic_bh_cb, iTask);
159         qemu_bh_schedule(iTask->bh);
160     }
161 }
162 
163 static void iscsi_co_init_iscsitask(IscsiLun *iscsilun, struct IscsiTask *iTask)
164 {
165     *iTask = (struct IscsiTask) {
166         .co         = qemu_coroutine_self(),
167         .retries    = ISCSI_CMD_RETRIES,
168     };
169 }
170 
171 static void
172 iscsi_abort_task_cb(struct iscsi_context *iscsi, int status, void *command_data,
173                     void *private_data)
174 {
175     IscsiAIOCB *acb = private_data;
176 
177     acb->status = -ECANCELED;
178     iscsi_schedule_bh(acb);
179 }
180 
181 static void
182 iscsi_aio_cancel(BlockDriverAIOCB *blockacb)
183 {
184     IscsiAIOCB *acb = (IscsiAIOCB *)blockacb;
185     IscsiLun *iscsilun = acb->iscsilun;
186 
187     if (acb->status != -EINPROGRESS) {
188         return;
189     }
190 
191     acb->canceled = 1;
192 
193     /* send a task mgmt call to the target to cancel the task on the target */
194     iscsi_task_mgmt_abort_task_async(iscsilun->iscsi, acb->task,
195                                      iscsi_abort_task_cb, acb);
196 
197     while (acb->status == -EINPROGRESS) {
198         qemu_aio_wait();
199     }
200 }
201 
202 static const AIOCBInfo iscsi_aiocb_info = {
203     .aiocb_size         = sizeof(IscsiAIOCB),
204     .cancel             = iscsi_aio_cancel,
205 };
206 
207 
208 static void iscsi_process_read(void *arg);
209 static void iscsi_process_write(void *arg);
210 
211 static void
212 iscsi_set_events(IscsiLun *iscsilun)
213 {
214     struct iscsi_context *iscsi = iscsilun->iscsi;
215     int ev;
216 
217     /* We always register a read handler.  */
218     ev = POLLIN;
219     ev |= iscsi_which_events(iscsi);
220     if (ev != iscsilun->events) {
221         qemu_aio_set_fd_handler(iscsi_get_fd(iscsi),
222                       iscsi_process_read,
223                       (ev & POLLOUT) ? iscsi_process_write : NULL,
224                       iscsilun);
225 
226     }
227 
228     iscsilun->events = ev;
229 }
230 
231 static void
232 iscsi_process_read(void *arg)
233 {
234     IscsiLun *iscsilun = arg;
235     struct iscsi_context *iscsi = iscsilun->iscsi;
236 
237     iscsi_service(iscsi, POLLIN);
238     iscsi_set_events(iscsilun);
239 }
240 
241 static void
242 iscsi_process_write(void *arg)
243 {
244     IscsiLun *iscsilun = arg;
245     struct iscsi_context *iscsi = iscsilun->iscsi;
246 
247     iscsi_service(iscsi, POLLOUT);
248     iscsi_set_events(iscsilun);
249 }
250 
251 static int64_t sector_lun2qemu(int64_t sector, IscsiLun *iscsilun)
252 {
253     return sector * iscsilun->block_size / BDRV_SECTOR_SIZE;
254 }
255 
256 static int64_t sector_qemu2lun(int64_t sector, IscsiLun *iscsilun)
257 {
258     return sector * BDRV_SECTOR_SIZE / iscsilun->block_size;
259 }
260 
261 static bool is_request_lun_aligned(int64_t sector_num, int nb_sectors,
262                                       IscsiLun *iscsilun)
263 {
264     if ((sector_num * BDRV_SECTOR_SIZE) % iscsilun->block_size ||
265         (nb_sectors * BDRV_SECTOR_SIZE) % iscsilun->block_size) {
266             error_report("iSCSI misaligned request: "
267                          "iscsilun->block_size %u, sector_num %" PRIi64
268                          ", nb_sectors %d",
269                          iscsilun->block_size, sector_num, nb_sectors);
270             return 0;
271     }
272     return 1;
273 }
274 
275 static int coroutine_fn iscsi_co_writev(BlockDriverState *bs,
276                                         int64_t sector_num, int nb_sectors,
277                                         QEMUIOVector *iov)
278 {
279     IscsiLun *iscsilun = bs->opaque;
280     struct IscsiTask iTask;
281     uint64_t lba;
282     uint32_t num_sectors;
283     uint8_t *data = NULL;
284     uint8_t *buf = NULL;
285 
286     if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) {
287         return -EINVAL;
288     }
289 
290     lba = sector_qemu2lun(sector_num, iscsilun);
291     num_sectors = sector_qemu2lun(nb_sectors, iscsilun);
292 #if !defined(LIBISCSI_FEATURE_IOVECTOR)
293     /* if the iovec only contains one buffer we can pass it directly */
294     if (iov->niov == 1) {
295         data = iov->iov[0].iov_base;
296     } else {
297         size_t size = MIN(nb_sectors * BDRV_SECTOR_SIZE, iov->size);
298         buf = g_malloc(size);
299         qemu_iovec_to_buf(iov, 0, buf, size);
300         data = buf;
301     }
302 #endif
303     iscsi_co_init_iscsitask(iscsilun, &iTask);
304 retry:
305     iTask.task = iscsi_write16_task(iscsilun->iscsi, iscsilun->lun, lba,
306                                     data, num_sectors * iscsilun->block_size,
307                                     iscsilun->block_size, 0, 0, 0, 0, 0,
308                                     iscsi_co_generic_cb, &iTask);
309     if (iTask.task == NULL) {
310         g_free(buf);
311         return -ENOMEM;
312     }
313 #if defined(LIBISCSI_FEATURE_IOVECTOR)
314     scsi_task_set_iov_out(iTask.task, (struct scsi_iovec *) iov->iov,
315                           iov->niov);
316 #endif
317     while (!iTask.complete) {
318         iscsi_set_events(iscsilun);
319         qemu_coroutine_yield();
320     }
321 
322     if (iTask.task != NULL) {
323         scsi_free_scsi_task(iTask.task);
324         iTask.task = NULL;
325     }
326 
327     if (iTask.do_retry) {
328         goto retry;
329     }
330 
331     g_free(buf);
332 
333     if (iTask.status != SCSI_STATUS_GOOD) {
334         return -EIO;
335     }
336 
337     return 0;
338 }
339 
340 static int coroutine_fn iscsi_co_readv(BlockDriverState *bs,
341                                        int64_t sector_num, int nb_sectors,
342                                        QEMUIOVector *iov)
343 {
344     IscsiLun *iscsilun = bs->opaque;
345     struct IscsiTask iTask;
346     uint64_t lba;
347     uint32_t num_sectors;
348 #if !defined(LIBISCSI_FEATURE_IOVECTOR)
349     int i;
350 #endif
351 
352     if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) {
353         return -EINVAL;
354     }
355 
356     lba = sector_qemu2lun(sector_num, iscsilun);
357     num_sectors = sector_qemu2lun(nb_sectors, iscsilun);
358 
359     iscsi_co_init_iscsitask(iscsilun, &iTask);
360 retry:
361     switch (iscsilun->type) {
362     case TYPE_DISK:
363         iTask.task = iscsi_read16_task(iscsilun->iscsi, iscsilun->lun, lba,
364                                        num_sectors * iscsilun->block_size,
365                                        iscsilun->block_size, 0, 0, 0, 0, 0,
366                                        iscsi_co_generic_cb, &iTask);
367         break;
368     default:
369         iTask.task = iscsi_read10_task(iscsilun->iscsi, iscsilun->lun, lba,
370                                        num_sectors * iscsilun->block_size,
371                                        iscsilun->block_size,
372 #if !defined(CONFIG_LIBISCSI_1_4) /* API change from 1.4.0 to 1.5.0 */
373                                        0, 0, 0, 0, 0,
374 #endif
375                                        iscsi_co_generic_cb, &iTask);
376         break;
377     }
378     if (iTask.task == NULL) {
379         return -ENOMEM;
380     }
381 #if defined(LIBISCSI_FEATURE_IOVECTOR)
382     scsi_task_set_iov_in(iTask.task, (struct scsi_iovec *) iov->iov, iov->niov);
383 #else
384     for (i = 0; i < iov->niov; i++) {
385         scsi_task_add_data_in_buffer(iTask.task,
386                                      iov->iov[i].iov_len,
387                                      iov->iov[i].iov_base);
388     }
389 #endif
390 
391     while (!iTask.complete) {
392         iscsi_set_events(iscsilun);
393         qemu_coroutine_yield();
394     }
395 
396     if (iTask.task != NULL) {
397         scsi_free_scsi_task(iTask.task);
398         iTask.task = NULL;
399     }
400 
401     if (iTask.do_retry) {
402         goto retry;
403     }
404 
405     if (iTask.status != SCSI_STATUS_GOOD) {
406         return -EIO;
407     }
408 
409     return 0;
410 }
411 
412 static int coroutine_fn iscsi_co_flush(BlockDriverState *bs)
413 {
414     IscsiLun *iscsilun = bs->opaque;
415     struct IscsiTask iTask;
416 
417     iscsi_co_init_iscsitask(iscsilun, &iTask);
418 
419 retry:
420     if (iscsi_synchronizecache10_task(iscsilun->iscsi, iscsilun->lun, 0, 0, 0,
421                                       0, iscsi_co_generic_cb, &iTask) == NULL) {
422         return -ENOMEM;
423     }
424 
425     while (!iTask.complete) {
426         iscsi_set_events(iscsilun);
427         qemu_coroutine_yield();
428     }
429 
430     if (iTask.task != NULL) {
431         scsi_free_scsi_task(iTask.task);
432         iTask.task = NULL;
433     }
434 
435     if (iTask.do_retry) {
436         goto retry;
437     }
438 
439     if (iTask.status != SCSI_STATUS_GOOD) {
440         return -EIO;
441     }
442 
443     return 0;
444 }
445 
446 #ifdef __linux__
447 static void
448 iscsi_aio_ioctl_cb(struct iscsi_context *iscsi, int status,
449                      void *command_data, void *opaque)
450 {
451     IscsiAIOCB *acb = opaque;
452 
453     g_free(acb->buf);
454     acb->buf = NULL;
455 
456     if (acb->canceled != 0) {
457         return;
458     }
459 
460     acb->status = 0;
461     if (status < 0) {
462         error_report("Failed to ioctl(SG_IO) to iSCSI lun. %s",
463                      iscsi_get_error(iscsi));
464         acb->status = -EIO;
465     }
466 
467     acb->ioh->driver_status = 0;
468     acb->ioh->host_status   = 0;
469     acb->ioh->resid         = 0;
470 
471 #define SG_ERR_DRIVER_SENSE    0x08
472 
473     if (status == SCSI_STATUS_CHECK_CONDITION && acb->task->datain.size >= 2) {
474         int ss;
475 
476         acb->ioh->driver_status |= SG_ERR_DRIVER_SENSE;
477 
478         acb->ioh->sb_len_wr = acb->task->datain.size - 2;
479         ss = (acb->ioh->mx_sb_len >= acb->ioh->sb_len_wr) ?
480              acb->ioh->mx_sb_len : acb->ioh->sb_len_wr;
481         memcpy(acb->ioh->sbp, &acb->task->datain.data[2], ss);
482     }
483 
484     iscsi_schedule_bh(acb);
485 }
486 
487 static BlockDriverAIOCB *iscsi_aio_ioctl(BlockDriverState *bs,
488         unsigned long int req, void *buf,
489         BlockDriverCompletionFunc *cb, void *opaque)
490 {
491     IscsiLun *iscsilun = bs->opaque;
492     struct iscsi_context *iscsi = iscsilun->iscsi;
493     struct iscsi_data data;
494     IscsiAIOCB *acb;
495 
496     assert(req == SG_IO);
497 
498     acb = qemu_aio_get(&iscsi_aiocb_info, bs, cb, opaque);
499 
500     acb->iscsilun = iscsilun;
501     acb->canceled    = 0;
502     acb->bh          = NULL;
503     acb->status      = -EINPROGRESS;
504     acb->buf         = NULL;
505     acb->ioh         = buf;
506 
507     acb->task = malloc(sizeof(struct scsi_task));
508     if (acb->task == NULL) {
509         error_report("iSCSI: Failed to allocate task for scsi command. %s",
510                      iscsi_get_error(iscsi));
511         qemu_aio_release(acb);
512         return NULL;
513     }
514     memset(acb->task, 0, sizeof(struct scsi_task));
515 
516     switch (acb->ioh->dxfer_direction) {
517     case SG_DXFER_TO_DEV:
518         acb->task->xfer_dir = SCSI_XFER_WRITE;
519         break;
520     case SG_DXFER_FROM_DEV:
521         acb->task->xfer_dir = SCSI_XFER_READ;
522         break;
523     default:
524         acb->task->xfer_dir = SCSI_XFER_NONE;
525         break;
526     }
527 
528     acb->task->cdb_size = acb->ioh->cmd_len;
529     memcpy(&acb->task->cdb[0], acb->ioh->cmdp, acb->ioh->cmd_len);
530     acb->task->expxferlen = acb->ioh->dxfer_len;
531 
532     data.size = 0;
533     if (acb->task->xfer_dir == SCSI_XFER_WRITE) {
534         if (acb->ioh->iovec_count == 0) {
535             data.data = acb->ioh->dxferp;
536             data.size = acb->ioh->dxfer_len;
537         } else {
538 #if defined(LIBISCSI_FEATURE_IOVECTOR)
539             scsi_task_set_iov_out(acb->task,
540                                  (struct scsi_iovec *) acb->ioh->dxferp,
541                                  acb->ioh->iovec_count);
542 #else
543             struct iovec *iov = (struct iovec *)acb->ioh->dxferp;
544 
545             acb->buf = g_malloc(acb->ioh->dxfer_len);
546             data.data = acb->buf;
547             data.size = iov_to_buf(iov, acb->ioh->iovec_count, 0,
548                                    acb->buf, acb->ioh->dxfer_len);
549 #endif
550         }
551     }
552 
553     if (iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task,
554                                  iscsi_aio_ioctl_cb,
555                                  (data.size > 0) ? &data : NULL,
556                                  acb) != 0) {
557         scsi_free_scsi_task(acb->task);
558         qemu_aio_release(acb);
559         return NULL;
560     }
561 
562     /* tell libiscsi to read straight into the buffer we got from ioctl */
563     if (acb->task->xfer_dir == SCSI_XFER_READ) {
564         if (acb->ioh->iovec_count == 0) {
565             scsi_task_add_data_in_buffer(acb->task,
566                                          acb->ioh->dxfer_len,
567                                          acb->ioh->dxferp);
568         } else {
569 #if defined(LIBISCSI_FEATURE_IOVECTOR)
570             scsi_task_set_iov_in(acb->task,
571                                  (struct scsi_iovec *) acb->ioh->dxferp,
572                                  acb->ioh->iovec_count);
573 #else
574             int i;
575             for (i = 0; i < acb->ioh->iovec_count; i++) {
576                 struct iovec *iov = (struct iovec *)acb->ioh->dxferp;
577 
578                 scsi_task_add_data_in_buffer(acb->task,
579                     iov[i].iov_len,
580                     iov[i].iov_base);
581             }
582 #endif
583         }
584     }
585 
586     iscsi_set_events(iscsilun);
587 
588     return &acb->common;
589 }
590 
591 
592 static void ioctl_cb(void *opaque, int status)
593 {
594     int *p_status = opaque;
595     *p_status = status;
596 }
597 
598 static int iscsi_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
599 {
600     IscsiLun *iscsilun = bs->opaque;
601     int status;
602 
603     switch (req) {
604     case SG_GET_VERSION_NUM:
605         *(int *)buf = 30000;
606         break;
607     case SG_GET_SCSI_ID:
608         ((struct sg_scsi_id *)buf)->scsi_type = iscsilun->type;
609         break;
610     case SG_IO:
611         status = -EINPROGRESS;
612         iscsi_aio_ioctl(bs, req, buf, ioctl_cb, &status);
613 
614         while (status == -EINPROGRESS) {
615             qemu_aio_wait();
616         }
617 
618         return 0;
619     default:
620         return -1;
621     }
622     return 0;
623 }
624 #endif
625 
626 static int64_t
627 iscsi_getlength(BlockDriverState *bs)
628 {
629     IscsiLun *iscsilun = bs->opaque;
630     int64_t len;
631 
632     len  = iscsilun->num_blocks;
633     len *= iscsilun->block_size;
634 
635     return len;
636 }
637 
638 #if defined(LIBISCSI_FEATURE_IOVECTOR)
639 
640 static int64_t coroutine_fn iscsi_co_get_block_status(BlockDriverState *bs,
641                                                   int64_t sector_num,
642                                                   int nb_sectors, int *pnum)
643 {
644     IscsiLun *iscsilun = bs->opaque;
645     struct scsi_get_lba_status *lbas = NULL;
646     struct scsi_lba_status_descriptor *lbasd = NULL;
647     struct IscsiTask iTask;
648     int64_t ret;
649 
650     iscsi_co_init_iscsitask(iscsilun, &iTask);
651 
652     if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) {
653         ret = -EINVAL;
654         goto out;
655     }
656 
657     /* default to all sectors allocated */
658     ret = BDRV_BLOCK_DATA;
659     ret |= (sector_num << BDRV_SECTOR_BITS) | BDRV_BLOCK_OFFSET_VALID;
660     *pnum = nb_sectors;
661 
662     /* LUN does not support logical block provisioning */
663     if (iscsilun->lbpme == 0) {
664         goto out;
665     }
666 
667 retry:
668     if (iscsi_get_lba_status_task(iscsilun->iscsi, iscsilun->lun,
669                                   sector_qemu2lun(sector_num, iscsilun),
670                                   8 + 16, iscsi_co_generic_cb,
671                                   &iTask) == NULL) {
672         ret = -ENOMEM;
673         goto out;
674     }
675 
676     while (!iTask.complete) {
677         iscsi_set_events(iscsilun);
678         qemu_coroutine_yield();
679     }
680 
681     if (iTask.do_retry) {
682         if (iTask.task != NULL) {
683             scsi_free_scsi_task(iTask.task);
684             iTask.task = NULL;
685         }
686         goto retry;
687     }
688 
689     if (iTask.status != SCSI_STATUS_GOOD) {
690         /* in case the get_lba_status_callout fails (i.e.
691          * because the device is busy or the cmd is not
692          * supported) we pretend all blocks are allocated
693          * for backwards compatibility */
694         goto out;
695     }
696 
697     lbas = scsi_datain_unmarshall(iTask.task);
698     if (lbas == NULL) {
699         ret = -EIO;
700         goto out;
701     }
702 
703     lbasd = &lbas->descriptors[0];
704 
705     if (sector_qemu2lun(sector_num, iscsilun) != lbasd->lba) {
706         ret = -EIO;
707         goto out;
708     }
709 
710     *pnum = sector_lun2qemu(lbasd->num_blocks, iscsilun);
711     if (*pnum > nb_sectors) {
712         *pnum = nb_sectors;
713     }
714 
715     if (lbasd->provisioning == SCSI_PROVISIONING_TYPE_DEALLOCATED ||
716         lbasd->provisioning == SCSI_PROVISIONING_TYPE_ANCHORED) {
717         ret &= ~BDRV_BLOCK_DATA;
718         if (iscsilun->lbprz) {
719             ret |= BDRV_BLOCK_ZERO;
720         }
721     }
722 
723 out:
724     if (iTask.task != NULL) {
725         scsi_free_scsi_task(iTask.task);
726     }
727     return ret;
728 }
729 
730 #endif /* LIBISCSI_FEATURE_IOVECTOR */
731 
732 static int
733 coroutine_fn iscsi_co_discard(BlockDriverState *bs, int64_t sector_num,
734                                    int nb_sectors)
735 {
736     IscsiLun *iscsilun = bs->opaque;
737     struct IscsiTask iTask;
738     struct unmap_list list;
739 
740     if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) {
741         return -EINVAL;
742     }
743 
744     if (!iscsilun->lbp.lbpu) {
745         /* UNMAP is not supported by the target */
746         return 0;
747     }
748 
749     list.lba = sector_qemu2lun(sector_num, iscsilun);
750     list.num = sector_qemu2lun(nb_sectors, iscsilun);
751 
752     iscsi_co_init_iscsitask(iscsilun, &iTask);
753 retry:
754     if (iscsi_unmap_task(iscsilun->iscsi, iscsilun->lun, 0, 0, &list, 1,
755                      iscsi_co_generic_cb, &iTask) == NULL) {
756         return -ENOMEM;
757     }
758 
759     while (!iTask.complete) {
760         iscsi_set_events(iscsilun);
761         qemu_coroutine_yield();
762     }
763 
764     if (iTask.task != NULL) {
765         scsi_free_scsi_task(iTask.task);
766         iTask.task = NULL;
767     }
768 
769     if (iTask.do_retry) {
770         goto retry;
771     }
772 
773     if (iTask.status == SCSI_STATUS_CHECK_CONDITION) {
774         /* the target might fail with a check condition if it
775            is not happy with the alignment of the UNMAP request
776            we silently fail in this case */
777         return 0;
778     }
779 
780     if (iTask.status != SCSI_STATUS_GOOD) {
781         return -EIO;
782     }
783 
784     return 0;
785 }
786 
787 #if defined(SCSI_SENSE_ASCQ_CAPACITY_DATA_HAS_CHANGED)
788 
789 static int
790 coroutine_fn iscsi_co_write_zeroes(BlockDriverState *bs, int64_t sector_num,
791                                    int nb_sectors, BdrvRequestFlags flags)
792 {
793     IscsiLun *iscsilun = bs->opaque;
794     struct IscsiTask iTask;
795     uint64_t lba;
796     uint32_t nb_blocks;
797 
798     if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) {
799         return -EINVAL;
800     }
801 
802     if (!(flags & BDRV_REQ_MAY_UNMAP) && !iscsilun->has_write_same) {
803         /* WRITE SAME without UNMAP is not supported by the target */
804         return -ENOTSUP;
805     }
806 
807     if ((flags & BDRV_REQ_MAY_UNMAP) && !iscsilun->lbp.lbpws) {
808         /* WRITE SAME with UNMAP is not supported by the target */
809         return -ENOTSUP;
810     }
811 
812     lba = sector_qemu2lun(sector_num, iscsilun);
813     nb_blocks = sector_qemu2lun(nb_sectors, iscsilun);
814 
815     if (iscsilun->zeroblock == NULL) {
816         iscsilun->zeroblock = g_malloc0(iscsilun->block_size);
817     }
818 
819     iscsi_co_init_iscsitask(iscsilun, &iTask);
820 retry:
821     if (iscsi_writesame16_task(iscsilun->iscsi, iscsilun->lun, lba,
822                                iscsilun->zeroblock, iscsilun->block_size,
823                                nb_blocks, 0, !!(flags & BDRV_REQ_MAY_UNMAP),
824                                0, 0, iscsi_co_generic_cb, &iTask) == NULL) {
825         return -ENOMEM;
826     }
827 
828     while (!iTask.complete) {
829         iscsi_set_events(iscsilun);
830         qemu_coroutine_yield();
831     }
832 
833     if (iTask.task != NULL) {
834         scsi_free_scsi_task(iTask.task);
835         iTask.task = NULL;
836     }
837 
838     if (iTask.do_retry) {
839         goto retry;
840     }
841 
842     if (iTask.status != SCSI_STATUS_GOOD) {
843         if (iTask.status == SCSI_STATUS_CHECK_CONDITION &&
844             iTask.task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST &&
845             iTask.task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) {
846             /* WRITE SAME is not supported by the target */
847             iscsilun->has_write_same = false;
848             return -ENOTSUP;
849         }
850 
851         return -EIO;
852     }
853 
854     return 0;
855 }
856 
857 #endif /* SCSI_SENSE_ASCQ_CAPACITY_DATA_HAS_CHANGED */
858 
859 static int parse_chap(struct iscsi_context *iscsi, const char *target)
860 {
861     QemuOptsList *list;
862     QemuOpts *opts;
863     const char *user = NULL;
864     const char *password = NULL;
865 
866     list = qemu_find_opts("iscsi");
867     if (!list) {
868         return 0;
869     }
870 
871     opts = qemu_opts_find(list, target);
872     if (opts == NULL) {
873         opts = QTAILQ_FIRST(&list->head);
874         if (!opts) {
875             return 0;
876         }
877     }
878 
879     user = qemu_opt_get(opts, "user");
880     if (!user) {
881         return 0;
882     }
883 
884     password = qemu_opt_get(opts, "password");
885     if (!password) {
886         error_report("CHAP username specified but no password was given");
887         return -1;
888     }
889 
890     if (iscsi_set_initiator_username_pwd(iscsi, user, password)) {
891         error_report("Failed to set initiator username and password");
892         return -1;
893     }
894 
895     return 0;
896 }
897 
898 static void parse_header_digest(struct iscsi_context *iscsi, const char *target)
899 {
900     QemuOptsList *list;
901     QemuOpts *opts;
902     const char *digest = NULL;
903 
904     list = qemu_find_opts("iscsi");
905     if (!list) {
906         return;
907     }
908 
909     opts = qemu_opts_find(list, target);
910     if (opts == NULL) {
911         opts = QTAILQ_FIRST(&list->head);
912         if (!opts) {
913             return;
914         }
915     }
916 
917     digest = qemu_opt_get(opts, "header-digest");
918     if (!digest) {
919         return;
920     }
921 
922     if (!strcmp(digest, "CRC32C")) {
923         iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_CRC32C);
924     } else if (!strcmp(digest, "NONE")) {
925         iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE);
926     } else if (!strcmp(digest, "CRC32C-NONE")) {
927         iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_CRC32C_NONE);
928     } else if (!strcmp(digest, "NONE-CRC32C")) {
929         iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
930     } else {
931         error_report("Invalid header-digest setting : %s", digest);
932     }
933 }
934 
935 static char *parse_initiator_name(const char *target)
936 {
937     QemuOptsList *list;
938     QemuOpts *opts;
939     const char *name;
940     char *iscsi_name;
941     UuidInfo *uuid_info;
942 
943     list = qemu_find_opts("iscsi");
944     if (list) {
945         opts = qemu_opts_find(list, target);
946         if (!opts) {
947             opts = QTAILQ_FIRST(&list->head);
948         }
949         if (opts) {
950             name = qemu_opt_get(opts, "initiator-name");
951             if (name) {
952                 return g_strdup(name);
953             }
954         }
955     }
956 
957     uuid_info = qmp_query_uuid(NULL);
958     if (strcmp(uuid_info->UUID, UUID_NONE) == 0) {
959         name = qemu_get_vm_name();
960     } else {
961         name = uuid_info->UUID;
962     }
963     iscsi_name = g_strdup_printf("iqn.2008-11.org.linux-kvm%s%s",
964                                  name ? ":" : "", name ? name : "");
965     qapi_free_UuidInfo(uuid_info);
966     return iscsi_name;
967 }
968 
969 #if defined(LIBISCSI_FEATURE_NOP_COUNTER)
970 static void iscsi_nop_timed_event(void *opaque)
971 {
972     IscsiLun *iscsilun = opaque;
973 
974     if (iscsi_get_nops_in_flight(iscsilun->iscsi) > MAX_NOP_FAILURES) {
975         error_report("iSCSI: NOP timeout. Reconnecting...");
976         iscsi_reconnect(iscsilun->iscsi);
977     }
978 
979     if (iscsi_nop_out_async(iscsilun->iscsi, NULL, NULL, 0, NULL) != 0) {
980         error_report("iSCSI: failed to sent NOP-Out. Disabling NOP messages.");
981         return;
982     }
983 
984     timer_mod(iscsilun->nop_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + NOP_INTERVAL);
985     iscsi_set_events(iscsilun);
986 }
987 #endif
988 
989 static int iscsi_readcapacity_sync(IscsiLun *iscsilun)
990 {
991     struct scsi_task *task = NULL;
992     struct scsi_readcapacity10 *rc10 = NULL;
993     struct scsi_readcapacity16 *rc16 = NULL;
994     int ret = 0;
995     int retries = ISCSI_CMD_RETRIES;
996 
997     do {
998         if (task != NULL) {
999             scsi_free_scsi_task(task);
1000             task = NULL;
1001         }
1002 
1003         switch (iscsilun->type) {
1004         case TYPE_DISK:
1005             task = iscsi_readcapacity16_sync(iscsilun->iscsi, iscsilun->lun);
1006             if (task != NULL && task->status == SCSI_STATUS_GOOD) {
1007                 rc16 = scsi_datain_unmarshall(task);
1008                 if (rc16 == NULL) {
1009                     error_report("iSCSI: Failed to unmarshall readcapacity16 data.");
1010                     ret = -EINVAL;
1011                 } else {
1012                     iscsilun->block_size = rc16->block_length;
1013                     iscsilun->num_blocks = rc16->returned_lba + 1;
1014                     iscsilun->lbpme = rc16->lbpme;
1015                     iscsilun->lbprz = rc16->lbprz;
1016                 }
1017             }
1018             break;
1019         case TYPE_ROM:
1020             task = iscsi_readcapacity10_sync(iscsilun->iscsi, iscsilun->lun, 0, 0);
1021             if (task != NULL && task->status == SCSI_STATUS_GOOD) {
1022                 rc10 = scsi_datain_unmarshall(task);
1023                 if (rc10 == NULL) {
1024                     error_report("iSCSI: Failed to unmarshall readcapacity10 data.");
1025                     ret = -EINVAL;
1026                 } else {
1027                     iscsilun->block_size = rc10->block_size;
1028                     if (rc10->lba == 0) {
1029                         /* blank disk loaded */
1030                         iscsilun->num_blocks = 0;
1031                     } else {
1032                         iscsilun->num_blocks = rc10->lba + 1;
1033                     }
1034                 }
1035             }
1036             break;
1037         default:
1038             return 0;
1039         }
1040     } while (task != NULL && task->status == SCSI_STATUS_CHECK_CONDITION
1041              && task->sense.key == SCSI_SENSE_UNIT_ATTENTION
1042              && retries-- > 0);
1043 
1044     if (task == NULL || task->status != SCSI_STATUS_GOOD) {
1045         error_report("iSCSI: failed to send readcapacity10 command.");
1046         ret = -EINVAL;
1047     }
1048     if (task) {
1049         scsi_free_scsi_task(task);
1050     }
1051     return ret;
1052 }
1053 
1054 /* TODO Convert to fine grained options */
1055 static QemuOptsList runtime_opts = {
1056     .name = "iscsi",
1057     .head = QTAILQ_HEAD_INITIALIZER(runtime_opts.head),
1058     .desc = {
1059         {
1060             .name = "filename",
1061             .type = QEMU_OPT_STRING,
1062             .help = "URL to the iscsi image",
1063         },
1064         { /* end of list */ }
1065     },
1066 };
1067 
1068 static struct scsi_task *iscsi_do_inquiry(struct iscsi_context *iscsi,
1069                                           int lun, int evpd, int pc) {
1070         int full_size;
1071         struct scsi_task *task = NULL;
1072         task = iscsi_inquiry_sync(iscsi, lun, evpd, pc, 64);
1073         if (task == NULL || task->status != SCSI_STATUS_GOOD) {
1074             goto fail;
1075         }
1076         full_size = scsi_datain_getfullsize(task);
1077         if (full_size > task->datain.size) {
1078             scsi_free_scsi_task(task);
1079 
1080             /* we need more data for the full list */
1081             task = iscsi_inquiry_sync(iscsi, lun, evpd, pc, full_size);
1082             if (task == NULL || task->status != SCSI_STATUS_GOOD) {
1083                 goto fail;
1084             }
1085         }
1086 
1087         return task;
1088 
1089 fail:
1090         error_report("iSCSI: Inquiry command failed : %s",
1091                      iscsi_get_error(iscsi));
1092         if (task) {
1093             scsi_free_scsi_task(task);
1094             return NULL;
1095         }
1096         return NULL;
1097 }
1098 
1099 /*
1100  * We support iscsi url's on the form
1101  * iscsi://[<username>%<password>@]<host>[:<port>]/<targetname>/<lun>
1102  */
1103 static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
1104                       Error **errp)
1105 {
1106     IscsiLun *iscsilun = bs->opaque;
1107     struct iscsi_context *iscsi = NULL;
1108     struct iscsi_url *iscsi_url = NULL;
1109     struct scsi_task *task = NULL;
1110     struct scsi_inquiry_standard *inq = NULL;
1111     char *initiator_name = NULL;
1112     QemuOpts *opts;
1113     Error *local_err = NULL;
1114     const char *filename;
1115     int ret;
1116 
1117     if ((BDRV_SECTOR_SIZE % 512) != 0) {
1118         error_report("iSCSI: Invalid BDRV_SECTOR_SIZE. "
1119                      "BDRV_SECTOR_SIZE(%lld) is not a multiple "
1120                      "of 512", BDRV_SECTOR_SIZE);
1121         return -EINVAL;
1122     }
1123 
1124     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
1125     qemu_opts_absorb_qdict(opts, options, &local_err);
1126     if (error_is_set(&local_err)) {
1127         qerror_report_err(local_err);
1128         error_free(local_err);
1129         ret = -EINVAL;
1130         goto out;
1131     }
1132 
1133     filename = qemu_opt_get(opts, "filename");
1134 
1135 
1136     iscsi_url = iscsi_parse_full_url(iscsi, filename);
1137     if (iscsi_url == NULL) {
1138         error_report("Failed to parse URL : %s", filename);
1139         ret = -EINVAL;
1140         goto out;
1141     }
1142 
1143     memset(iscsilun, 0, sizeof(IscsiLun));
1144 
1145     initiator_name = parse_initiator_name(iscsi_url->target);
1146 
1147     iscsi = iscsi_create_context(initiator_name);
1148     if (iscsi == NULL) {
1149         error_report("iSCSI: Failed to create iSCSI context.");
1150         ret = -ENOMEM;
1151         goto out;
1152     }
1153 
1154     if (iscsi_set_targetname(iscsi, iscsi_url->target)) {
1155         error_report("iSCSI: Failed to set target name.");
1156         ret = -EINVAL;
1157         goto out;
1158     }
1159 
1160     if (iscsi_url->user != NULL) {
1161         ret = iscsi_set_initiator_username_pwd(iscsi, iscsi_url->user,
1162                                               iscsi_url->passwd);
1163         if (ret != 0) {
1164             error_report("Failed to set initiator username and password");
1165             ret = -EINVAL;
1166             goto out;
1167         }
1168     }
1169 
1170     /* check if we got CHAP username/password via the options */
1171     if (parse_chap(iscsi, iscsi_url->target) != 0) {
1172         error_report("iSCSI: Failed to set CHAP user/password");
1173         ret = -EINVAL;
1174         goto out;
1175     }
1176 
1177     if (iscsi_set_session_type(iscsi, ISCSI_SESSION_NORMAL) != 0) {
1178         error_report("iSCSI: Failed to set session type to normal.");
1179         ret = -EINVAL;
1180         goto out;
1181     }
1182 
1183     iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
1184 
1185     /* check if we got HEADER_DIGEST via the options */
1186     parse_header_digest(iscsi, iscsi_url->target);
1187 
1188     if (iscsi_full_connect_sync(iscsi, iscsi_url->portal, iscsi_url->lun) != 0) {
1189         error_report("iSCSI: Failed to connect to LUN : %s",
1190             iscsi_get_error(iscsi));
1191         ret = -EINVAL;
1192         goto out;
1193     }
1194 
1195     iscsilun->iscsi = iscsi;
1196     iscsilun->lun   = iscsi_url->lun;
1197 
1198     task = iscsi_inquiry_sync(iscsi, iscsilun->lun, 0, 0, 36);
1199 
1200     if (task == NULL || task->status != SCSI_STATUS_GOOD) {
1201         error_report("iSCSI: failed to send inquiry command.");
1202         ret = -EINVAL;
1203         goto out;
1204     }
1205 
1206     inq = scsi_datain_unmarshall(task);
1207     if (inq == NULL) {
1208         error_report("iSCSI: Failed to unmarshall inquiry data.");
1209         ret = -EINVAL;
1210         goto out;
1211     }
1212 
1213     iscsilun->type = inq->periperal_device_type;
1214     iscsilun->has_write_same = true;
1215 
1216     if ((ret = iscsi_readcapacity_sync(iscsilun)) != 0) {
1217         goto out;
1218     }
1219     bs->total_sectors = sector_lun2qemu(iscsilun->num_blocks, iscsilun);
1220     bs->request_alignment = iscsilun->block_size;
1221 
1222     /* Medium changer or tape. We dont have any emulation for this so this must
1223      * be sg ioctl compatible. We force it to be sg, otherwise qemu will try
1224      * to read from the device to guess the image format.
1225      */
1226     if (iscsilun->type == TYPE_MEDIUM_CHANGER ||
1227         iscsilun->type == TYPE_TAPE) {
1228         bs->sg = 1;
1229     }
1230 
1231     if (iscsilun->lbpme) {
1232         struct scsi_inquiry_logical_block_provisioning *inq_lbp;
1233         task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 1,
1234                                 SCSI_INQUIRY_PAGECODE_LOGICAL_BLOCK_PROVISIONING);
1235         if (task == NULL) {
1236             ret = -EINVAL;
1237             goto out;
1238         }
1239         inq_lbp = scsi_datain_unmarshall(task);
1240         if (inq_lbp == NULL) {
1241             error_report("iSCSI: failed to unmarshall inquiry datain blob");
1242             ret = -EINVAL;
1243             goto out;
1244         }
1245         memcpy(&iscsilun->lbp, inq_lbp,
1246                sizeof(struct scsi_inquiry_logical_block_provisioning));
1247         scsi_free_scsi_task(task);
1248         task = NULL;
1249     }
1250 
1251     if (iscsilun->lbp.lbpu || iscsilun->lbp.lbpws) {
1252         struct scsi_inquiry_block_limits *inq_bl;
1253         task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 1,
1254                                 SCSI_INQUIRY_PAGECODE_BLOCK_LIMITS);
1255         if (task == NULL) {
1256             ret = -EINVAL;
1257             goto out;
1258         }
1259         inq_bl = scsi_datain_unmarshall(task);
1260         if (inq_bl == NULL) {
1261             error_report("iSCSI: failed to unmarshall inquiry datain blob");
1262             ret = -EINVAL;
1263             goto out;
1264         }
1265         memcpy(&iscsilun->bl, inq_bl,
1266                sizeof(struct scsi_inquiry_block_limits));
1267         scsi_free_scsi_task(task);
1268         task = NULL;
1269     }
1270 
1271 #if defined(LIBISCSI_FEATURE_NOP_COUNTER)
1272     /* Set up a timer for sending out iSCSI NOPs */
1273     iscsilun->nop_timer = timer_new_ms(QEMU_CLOCK_REALTIME, iscsi_nop_timed_event, iscsilun);
1274     timer_mod(iscsilun->nop_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + NOP_INTERVAL);
1275 #endif
1276 
1277 out:
1278     qemu_opts_del(opts);
1279     if (initiator_name != NULL) {
1280         g_free(initiator_name);
1281     }
1282     if (iscsi_url != NULL) {
1283         iscsi_destroy_url(iscsi_url);
1284     }
1285     if (task != NULL) {
1286         scsi_free_scsi_task(task);
1287     }
1288 
1289     if (ret) {
1290         if (iscsi != NULL) {
1291             iscsi_destroy_context(iscsi);
1292         }
1293         memset(iscsilun, 0, sizeof(IscsiLun));
1294     }
1295     return ret;
1296 }
1297 
1298 static void iscsi_close(BlockDriverState *bs)
1299 {
1300     IscsiLun *iscsilun = bs->opaque;
1301     struct iscsi_context *iscsi = iscsilun->iscsi;
1302 
1303     if (iscsilun->nop_timer) {
1304         timer_del(iscsilun->nop_timer);
1305         timer_free(iscsilun->nop_timer);
1306     }
1307     qemu_aio_set_fd_handler(iscsi_get_fd(iscsi), NULL, NULL, NULL);
1308     iscsi_destroy_context(iscsi);
1309     g_free(iscsilun->zeroblock);
1310     memset(iscsilun, 0, sizeof(IscsiLun));
1311 }
1312 
1313 static int iscsi_refresh_limits(BlockDriverState *bs)
1314 {
1315     IscsiLun *iscsilun = bs->opaque;
1316 
1317     /* We don't actually refresh here, but just return data queried in
1318      * iscsi_open(): iscsi targets don't change their limits. */
1319     if (iscsilun->lbp.lbpu || iscsilun->lbp.lbpws) {
1320         if (iscsilun->bl.max_unmap < 0xffffffff) {
1321             bs->bl.max_discard = sector_lun2qemu(iscsilun->bl.max_unmap,
1322                                                  iscsilun);
1323         }
1324         bs->bl.discard_alignment = sector_lun2qemu(iscsilun->bl.opt_unmap_gran,
1325                                                    iscsilun);
1326 
1327         if (iscsilun->bl.max_ws_len < 0xffffffff) {
1328             bs->bl.max_write_zeroes = sector_lun2qemu(iscsilun->bl.max_ws_len,
1329                                                       iscsilun);
1330         }
1331         bs->bl.write_zeroes_alignment = sector_lun2qemu(iscsilun->bl.opt_unmap_gran,
1332                                                         iscsilun);
1333     }
1334     bs->bl.opt_transfer_length = sector_lun2qemu(iscsilun->bl.opt_xfer_len,
1335                                                  iscsilun);
1336     return 0;
1337 }
1338 
1339 /* We have nothing to do for iSCSI reopen, stub just returns
1340  * success */
1341 static int iscsi_reopen_prepare(BDRVReopenState *state,
1342                                 BlockReopenQueue *queue, Error **errp)
1343 {
1344     return 0;
1345 }
1346 
1347 static int iscsi_truncate(BlockDriverState *bs, int64_t offset)
1348 {
1349     IscsiLun *iscsilun = bs->opaque;
1350     int ret = 0;
1351 
1352     if (iscsilun->type != TYPE_DISK) {
1353         return -ENOTSUP;
1354     }
1355 
1356     if ((ret = iscsi_readcapacity_sync(iscsilun)) != 0) {
1357         return ret;
1358     }
1359 
1360     if (offset > iscsi_getlength(bs)) {
1361         return -EINVAL;
1362     }
1363 
1364     return 0;
1365 }
1366 
1367 static int iscsi_create(const char *filename, QEMUOptionParameter *options,
1368                         Error **errp)
1369 {
1370     int ret = 0;
1371     int64_t total_size = 0;
1372     BlockDriverState *bs;
1373     IscsiLun *iscsilun = NULL;
1374     QDict *bs_options;
1375 
1376     bs = bdrv_new("");
1377 
1378     /* Read out options */
1379     while (options && options->name) {
1380         if (!strcmp(options->name, "size")) {
1381             total_size = options->value.n / BDRV_SECTOR_SIZE;
1382         }
1383         options++;
1384     }
1385 
1386     bs->opaque = g_malloc0(sizeof(struct IscsiLun));
1387     iscsilun = bs->opaque;
1388 
1389     bs_options = qdict_new();
1390     qdict_put(bs_options, "filename", qstring_from_str(filename));
1391     ret = iscsi_open(bs, bs_options, 0, NULL);
1392     QDECREF(bs_options);
1393 
1394     if (ret != 0) {
1395         goto out;
1396     }
1397     if (iscsilun->nop_timer) {
1398         timer_del(iscsilun->nop_timer);
1399         timer_free(iscsilun->nop_timer);
1400     }
1401     if (iscsilun->type != TYPE_DISK) {
1402         ret = -ENODEV;
1403         goto out;
1404     }
1405     if (bs->total_sectors < total_size) {
1406         ret = -ENOSPC;
1407         goto out;
1408     }
1409 
1410     ret = 0;
1411 out:
1412     if (iscsilun->iscsi != NULL) {
1413         iscsi_destroy_context(iscsilun->iscsi);
1414     }
1415     g_free(bs->opaque);
1416     bs->opaque = NULL;
1417     bdrv_unref(bs);
1418     return ret;
1419 }
1420 
1421 static int iscsi_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
1422 {
1423     IscsiLun *iscsilun = bs->opaque;
1424     bdi->unallocated_blocks_are_zero = !!iscsilun->lbprz;
1425     bdi->can_write_zeroes_with_unmap = iscsilun->lbprz && iscsilun->lbp.lbpws;
1426     /* Guess the internal cluster (page) size of the iscsi target by the means
1427      * of opt_unmap_gran. Transfer the unmap granularity only if it has a
1428      * reasonable size for bdi->cluster_size */
1429     if (iscsilun->bl.opt_unmap_gran * iscsilun->block_size >= 64 * 1024 &&
1430         iscsilun->bl.opt_unmap_gran * iscsilun->block_size <= 16 * 1024 * 1024) {
1431         bdi->cluster_size = iscsilun->bl.opt_unmap_gran * iscsilun->block_size;
1432     }
1433     return 0;
1434 }
1435 
1436 static QEMUOptionParameter iscsi_create_options[] = {
1437     {
1438         .name = BLOCK_OPT_SIZE,
1439         .type = OPT_SIZE,
1440         .help = "Virtual disk size"
1441     },
1442     { NULL }
1443 };
1444 
1445 static BlockDriver bdrv_iscsi = {
1446     .format_name     = "iscsi",
1447     .protocol_name   = "iscsi",
1448 
1449     .instance_size   = sizeof(IscsiLun),
1450     .bdrv_needs_filename = true,
1451     .bdrv_file_open  = iscsi_open,
1452     .bdrv_close      = iscsi_close,
1453     .bdrv_create     = iscsi_create,
1454     .create_options  = iscsi_create_options,
1455     .bdrv_reopen_prepare  = iscsi_reopen_prepare,
1456 
1457     .bdrv_getlength  = iscsi_getlength,
1458     .bdrv_get_info   = iscsi_get_info,
1459     .bdrv_truncate   = iscsi_truncate,
1460     .bdrv_refresh_limits = iscsi_refresh_limits,
1461 
1462 #if defined(LIBISCSI_FEATURE_IOVECTOR)
1463     .bdrv_co_get_block_status = iscsi_co_get_block_status,
1464 #endif
1465     .bdrv_co_discard      = iscsi_co_discard,
1466 #if defined(SCSI_SENSE_ASCQ_CAPACITY_DATA_HAS_CHANGED)
1467     .bdrv_co_write_zeroes = iscsi_co_write_zeroes,
1468 #endif
1469     .bdrv_co_readv         = iscsi_co_readv,
1470     .bdrv_co_writev        = iscsi_co_writev,
1471     .bdrv_co_flush_to_disk = iscsi_co_flush,
1472 
1473 #ifdef __linux__
1474     .bdrv_ioctl       = iscsi_ioctl,
1475     .bdrv_aio_ioctl   = iscsi_aio_ioctl,
1476 #endif
1477 };
1478 
1479 static QemuOptsList qemu_iscsi_opts = {
1480     .name = "iscsi",
1481     .head = QTAILQ_HEAD_INITIALIZER(qemu_iscsi_opts.head),
1482     .desc = {
1483         {
1484             .name = "user",
1485             .type = QEMU_OPT_STRING,
1486             .help = "username for CHAP authentication to target",
1487         },{
1488             .name = "password",
1489             .type = QEMU_OPT_STRING,
1490             .help = "password for CHAP authentication to target",
1491         },{
1492             .name = "header-digest",
1493             .type = QEMU_OPT_STRING,
1494             .help = "HeaderDigest setting. "
1495                     "{CRC32C|CRC32C-NONE|NONE-CRC32C|NONE}",
1496         },{
1497             .name = "initiator-name",
1498             .type = QEMU_OPT_STRING,
1499             .help = "Initiator iqn name to use when connecting",
1500         },
1501         { /* end of list */ }
1502     },
1503 };
1504 
1505 static void iscsi_block_init(void)
1506 {
1507     bdrv_register(&bdrv_iscsi);
1508     qemu_add_opts(&qemu_iscsi_opts);
1509 }
1510 
1511 block_init(iscsi_block_init);
1512