Statistics
| Branch: | Revision:

root / block / iscsi.c @ 24d3bd67

History | View | Annotate | Download (42.6 kB)

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
        error_report("iSCSI CheckCondition: %s", iscsi_get_error(iscsi));
149
        iTask->do_retry = 1;
150
        goto out;
151
    }
152

    
153
    if (status != SCSI_STATUS_GOOD) {
154
        error_report("iSCSI Failure: %s", iscsi_get_error(iscsi));
155
    }
156

    
157
out:
158
    if (iTask->co) {
159
        iTask->bh = qemu_bh_new(iscsi_co_generic_bh_cb, iTask);
160
        qemu_bh_schedule(iTask->bh);
161
    }
162
}
163

    
164
static void iscsi_co_init_iscsitask(IscsiLun *iscsilun, struct IscsiTask *iTask)
165
{
166
    *iTask = (struct IscsiTask) {
167
        .co         = qemu_coroutine_self(),
168
        .retries    = ISCSI_CMD_RETRIES,
169
    };
170
}
171

    
172
static void
173
iscsi_abort_task_cb(struct iscsi_context *iscsi, int status, void *command_data,
174
                    void *private_data)
175
{
176
    IscsiAIOCB *acb = private_data;
177

    
178
    acb->status = -ECANCELED;
179
    iscsi_schedule_bh(acb);
180
}
181

    
182
static void
183
iscsi_aio_cancel(BlockDriverAIOCB *blockacb)
184
{
185
    IscsiAIOCB *acb = (IscsiAIOCB *)blockacb;
186
    IscsiLun *iscsilun = acb->iscsilun;
187

    
188
    if (acb->status != -EINPROGRESS) {
189
        return;
190
    }
191

    
192
    acb->canceled = 1;
193

    
194
    /* send a task mgmt call to the target to cancel the task on the target */
195
    iscsi_task_mgmt_abort_task_async(iscsilun->iscsi, acb->task,
196
                                     iscsi_abort_task_cb, acb);
197

    
198
    while (acb->status == -EINPROGRESS) {
199
        qemu_aio_wait();
200
    }
201
}
202

    
203
static const AIOCBInfo iscsi_aiocb_info = {
204
    .aiocb_size         = sizeof(IscsiAIOCB),
205
    .cancel             = iscsi_aio_cancel,
206
};
207

    
208

    
209
static void iscsi_process_read(void *arg);
210
static void iscsi_process_write(void *arg);
211

    
212
static void
213
iscsi_set_events(IscsiLun *iscsilun)
214
{
215
    struct iscsi_context *iscsi = iscsilun->iscsi;
216
    int ev;
217

    
218
    /* We always register a read handler.  */
219
    ev = POLLIN;
220
    ev |= iscsi_which_events(iscsi);
221
    if (ev != iscsilun->events) {
222
        qemu_aio_set_fd_handler(iscsi_get_fd(iscsi),
223
                      iscsi_process_read,
224
                      (ev & POLLOUT) ? iscsi_process_write : NULL,
225
                      iscsilun);
226

    
227
    }
228

    
229
    iscsilun->events = ev;
230
}
231

    
232
static void
233
iscsi_process_read(void *arg)
234
{
235
    IscsiLun *iscsilun = arg;
236
    struct iscsi_context *iscsi = iscsilun->iscsi;
237

    
238
    iscsi_service(iscsi, POLLIN);
239
    iscsi_set_events(iscsilun);
240
}
241

    
242
static void
243
iscsi_process_write(void *arg)
244
{
245
    IscsiLun *iscsilun = arg;
246
    struct iscsi_context *iscsi = iscsilun->iscsi;
247

    
248
    iscsi_service(iscsi, POLLOUT);
249
    iscsi_set_events(iscsilun);
250
}
251

    
252
static int64_t sector_lun2qemu(int64_t sector, IscsiLun *iscsilun)
253
{
254
    return sector * iscsilun->block_size / BDRV_SECTOR_SIZE;
255
}
256

    
257
static int64_t sector_qemu2lun(int64_t sector, IscsiLun *iscsilun)
258
{
259
    return sector * BDRV_SECTOR_SIZE / iscsilun->block_size;
260
}
261

    
262
static bool is_request_lun_aligned(int64_t sector_num, int nb_sectors,
263
                                      IscsiLun *iscsilun)
264
{
265
    if ((sector_num * BDRV_SECTOR_SIZE) % iscsilun->block_size ||
266
        (nb_sectors * BDRV_SECTOR_SIZE) % iscsilun->block_size) {
267
            error_report("iSCSI misaligned request: "
268
                         "iscsilun->block_size %u, sector_num %" PRIi64
269
                         ", nb_sectors %d",
270
                         iscsilun->block_size, sector_num, nb_sectors);
271
            return 0;
272
    }
273
    return 1;
274
}
275

    
276
static int coroutine_fn iscsi_co_writev(BlockDriverState *bs,
277
                                        int64_t sector_num, int nb_sectors,
278
                                        QEMUIOVector *iov)
279
{
280
    IscsiLun *iscsilun = bs->opaque;
281
    struct IscsiTask iTask;
282
    uint64_t lba;
283
    uint32_t num_sectors;
284
    uint8_t *data = NULL;
285
    uint8_t *buf = NULL;
286

    
287
    if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) {
288
        return -EINVAL;
289
    }
290

    
291
    lba = sector_qemu2lun(sector_num, iscsilun);
292
    num_sectors = sector_qemu2lun(nb_sectors, iscsilun);
293
#if !defined(LIBISCSI_FEATURE_IOVECTOR)
294
    /* if the iovec only contains one buffer we can pass it directly */
295
    if (iov->niov == 1) {
296
        data = iov->iov[0].iov_base;
297
    } else {
298
        size_t size = MIN(nb_sectors * BDRV_SECTOR_SIZE, iov->size);
299
        buf = g_malloc(size);
300
        qemu_iovec_to_buf(iov, 0, buf, size);
301
        data = buf;
302
    }
303
#endif
304
    iscsi_co_init_iscsitask(iscsilun, &iTask);
305
retry:
306
    iTask.task = iscsi_write16_task(iscsilun->iscsi, iscsilun->lun, lba,
307
                                    data, num_sectors * iscsilun->block_size,
308
                                    iscsilun->block_size, 0, 0, 0, 0, 0,
309
                                    iscsi_co_generic_cb, &iTask);
310
    if (iTask.task == NULL) {
311
        g_free(buf);
312
        return -ENOMEM;
313
    }
314
#if defined(LIBISCSI_FEATURE_IOVECTOR)
315
    scsi_task_set_iov_out(iTask.task, (struct scsi_iovec *) iov->iov,
316
                          iov->niov);
317
#endif
318
    while (!iTask.complete) {
319
        iscsi_set_events(iscsilun);
320
        qemu_coroutine_yield();
321
    }
322

    
323
    if (iTask.task != NULL) {
324
        scsi_free_scsi_task(iTask.task);
325
        iTask.task = NULL;
326
    }
327

    
328
    if (iTask.do_retry) {
329
        iTask.complete = 0;
330
        goto retry;
331
    }
332

    
333
    g_free(buf);
334

    
335
    if (iTask.status != SCSI_STATUS_GOOD) {
336
        return -EIO;
337
    }
338

    
339
    return 0;
340
}
341

    
342
static int coroutine_fn iscsi_co_readv(BlockDriverState *bs,
343
                                       int64_t sector_num, int nb_sectors,
344
                                       QEMUIOVector *iov)
345
{
346
    IscsiLun *iscsilun = bs->opaque;
347
    struct IscsiTask iTask;
348
    uint64_t lba;
349
    uint32_t num_sectors;
350
#if !defined(LIBISCSI_FEATURE_IOVECTOR)
351
    int i;
352
#endif
353

    
354
    if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) {
355
        return -EINVAL;
356
    }
357

    
358
    lba = sector_qemu2lun(sector_num, iscsilun);
359
    num_sectors = sector_qemu2lun(nb_sectors, iscsilun);
360

    
361
    iscsi_co_init_iscsitask(iscsilun, &iTask);
362
retry:
363
    switch (iscsilun->type) {
364
    case TYPE_DISK:
365
        iTask.task = iscsi_read16_task(iscsilun->iscsi, iscsilun->lun, lba,
366
                                       num_sectors * iscsilun->block_size,
367
                                       iscsilun->block_size, 0, 0, 0, 0, 0,
368
                                       iscsi_co_generic_cb, &iTask);
369
        break;
370
    default:
371
        iTask.task = iscsi_read10_task(iscsilun->iscsi, iscsilun->lun, lba,
372
                                       num_sectors * iscsilun->block_size,
373
                                       iscsilun->block_size,
374
#if !defined(CONFIG_LIBISCSI_1_4) /* API change from 1.4.0 to 1.5.0 */
375
                                       0, 0, 0, 0, 0,
376
#endif
377
                                       iscsi_co_generic_cb, &iTask);
378
        break;
379
    }
380
    if (iTask.task == NULL) {
381
        return -ENOMEM;
382
    }
383
#if defined(LIBISCSI_FEATURE_IOVECTOR)
384
    scsi_task_set_iov_in(iTask.task, (struct scsi_iovec *) iov->iov, iov->niov);
385
#else
386
    for (i = 0; i < iov->niov; i++) {
387
        scsi_task_add_data_in_buffer(iTask.task,
388
                                     iov->iov[i].iov_len,
389
                                     iov->iov[i].iov_base);
390
    }
391
#endif
392

    
393
    while (!iTask.complete) {
394
        iscsi_set_events(iscsilun);
395
        qemu_coroutine_yield();
396
    }
397

    
398
    if (iTask.task != NULL) {
399
        scsi_free_scsi_task(iTask.task);
400
        iTask.task = NULL;
401
    }
402

    
403
    if (iTask.do_retry) {
404
        iTask.complete = 0;
405
        goto retry;
406
    }
407

    
408
    if (iTask.status != SCSI_STATUS_GOOD) {
409
        return -EIO;
410
    }
411

    
412
    return 0;
413
}
414

    
415
static int coroutine_fn iscsi_co_flush(BlockDriverState *bs)
416
{
417
    IscsiLun *iscsilun = bs->opaque;
418
    struct IscsiTask iTask;
419

    
420
    iscsi_co_init_iscsitask(iscsilun, &iTask);
421

    
422
retry:
423
    if (iscsi_synchronizecache10_task(iscsilun->iscsi, iscsilun->lun, 0, 0, 0,
424
                                      0, iscsi_co_generic_cb, &iTask) == NULL) {
425
        return -ENOMEM;
426
    }
427

    
428
    while (!iTask.complete) {
429
        iscsi_set_events(iscsilun);
430
        qemu_coroutine_yield();
431
    }
432

    
433
    if (iTask.task != NULL) {
434
        scsi_free_scsi_task(iTask.task);
435
        iTask.task = NULL;
436
    }
437

    
438
    if (iTask.do_retry) {
439
        iTask.complete = 0;
440
        goto retry;
441
    }
442

    
443
    if (iTask.status != SCSI_STATUS_GOOD) {
444
        return -EIO;
445
    }
446

    
447
    return 0;
448
}
449

    
450
#ifdef __linux__
451
static void
452
iscsi_aio_ioctl_cb(struct iscsi_context *iscsi, int status,
453
                     void *command_data, void *opaque)
454
{
455
    IscsiAIOCB *acb = opaque;
456

    
457
    g_free(acb->buf);
458
    acb->buf = NULL;
459

    
460
    if (acb->canceled != 0) {
461
        return;
462
    }
463

    
464
    acb->status = 0;
465
    if (status < 0) {
466
        error_report("Failed to ioctl(SG_IO) to iSCSI lun. %s",
467
                     iscsi_get_error(iscsi));
468
        acb->status = -EIO;
469
    }
470

    
471
    acb->ioh->driver_status = 0;
472
    acb->ioh->host_status   = 0;
473
    acb->ioh->resid         = 0;
474

    
475
#define SG_ERR_DRIVER_SENSE    0x08
476

    
477
    if (status == SCSI_STATUS_CHECK_CONDITION && acb->task->datain.size >= 2) {
478
        int ss;
479

    
480
        acb->ioh->driver_status |= SG_ERR_DRIVER_SENSE;
481

    
482
        acb->ioh->sb_len_wr = acb->task->datain.size - 2;
483
        ss = (acb->ioh->mx_sb_len >= acb->ioh->sb_len_wr) ?
484
             acb->ioh->mx_sb_len : acb->ioh->sb_len_wr;
485
        memcpy(acb->ioh->sbp, &acb->task->datain.data[2], ss);
486
    }
487

    
488
    iscsi_schedule_bh(acb);
489
}
490

    
491
static BlockDriverAIOCB *iscsi_aio_ioctl(BlockDriverState *bs,
492
        unsigned long int req, void *buf,
493
        BlockDriverCompletionFunc *cb, void *opaque)
494
{
495
    IscsiLun *iscsilun = bs->opaque;
496
    struct iscsi_context *iscsi = iscsilun->iscsi;
497
    struct iscsi_data data;
498
    IscsiAIOCB *acb;
499

    
500
    assert(req == SG_IO);
501

    
502
    acb = qemu_aio_get(&iscsi_aiocb_info, bs, cb, opaque);
503

    
504
    acb->iscsilun = iscsilun;
505
    acb->canceled    = 0;
506
    acb->bh          = NULL;
507
    acb->status      = -EINPROGRESS;
508
    acb->buf         = NULL;
509
    acb->ioh         = buf;
510

    
511
    acb->task = malloc(sizeof(struct scsi_task));
512
    if (acb->task == NULL) {
513
        error_report("iSCSI: Failed to allocate task for scsi command. %s",
514
                     iscsi_get_error(iscsi));
515
        qemu_aio_release(acb);
516
        return NULL;
517
    }
518
    memset(acb->task, 0, sizeof(struct scsi_task));
519

    
520
    switch (acb->ioh->dxfer_direction) {
521
    case SG_DXFER_TO_DEV:
522
        acb->task->xfer_dir = SCSI_XFER_WRITE;
523
        break;
524
    case SG_DXFER_FROM_DEV:
525
        acb->task->xfer_dir = SCSI_XFER_READ;
526
        break;
527
    default:
528
        acb->task->xfer_dir = SCSI_XFER_NONE;
529
        break;
530
    }
531

    
532
    acb->task->cdb_size = acb->ioh->cmd_len;
533
    memcpy(&acb->task->cdb[0], acb->ioh->cmdp, acb->ioh->cmd_len);
534
    acb->task->expxferlen = acb->ioh->dxfer_len;
535

    
536
    data.size = 0;
537
    if (acb->task->xfer_dir == SCSI_XFER_WRITE) {
538
        if (acb->ioh->iovec_count == 0) {
539
            data.data = acb->ioh->dxferp;
540
            data.size = acb->ioh->dxfer_len;
541
        } else {
542
#if defined(LIBISCSI_FEATURE_IOVECTOR)
543
            scsi_task_set_iov_out(acb->task,
544
                                 (struct scsi_iovec *) acb->ioh->dxferp,
545
                                 acb->ioh->iovec_count);
546
#else
547
            struct iovec *iov = (struct iovec *)acb->ioh->dxferp;
548

    
549
            acb->buf = g_malloc(acb->ioh->dxfer_len);
550
            data.data = acb->buf;
551
            data.size = iov_to_buf(iov, acb->ioh->iovec_count, 0,
552
                                   acb->buf, acb->ioh->dxfer_len);
553
#endif
554
        }
555
    }
556

    
557
    if (iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task,
558
                                 iscsi_aio_ioctl_cb,
559
                                 (data.size > 0) ? &data : NULL,
560
                                 acb) != 0) {
561
        scsi_free_scsi_task(acb->task);
562
        qemu_aio_release(acb);
563
        return NULL;
564
    }
565

    
566
    /* tell libiscsi to read straight into the buffer we got from ioctl */
567
    if (acb->task->xfer_dir == SCSI_XFER_READ) {
568
        if (acb->ioh->iovec_count == 0) {
569
            scsi_task_add_data_in_buffer(acb->task,
570
                                         acb->ioh->dxfer_len,
571
                                         acb->ioh->dxferp);
572
        } else {
573
#if defined(LIBISCSI_FEATURE_IOVECTOR)
574
            scsi_task_set_iov_in(acb->task,
575
                                 (struct scsi_iovec *) acb->ioh->dxferp,
576
                                 acb->ioh->iovec_count);
577
#else
578
            int i;
579
            for (i = 0; i < acb->ioh->iovec_count; i++) {
580
                struct iovec *iov = (struct iovec *)acb->ioh->dxferp;
581

    
582
                scsi_task_add_data_in_buffer(acb->task,
583
                    iov[i].iov_len,
584
                    iov[i].iov_base);
585
            }
586
#endif
587
        }
588
    }
589

    
590
    iscsi_set_events(iscsilun);
591

    
592
    return &acb->common;
593
}
594

    
595

    
596
static void ioctl_cb(void *opaque, int status)
597
{
598
    int *p_status = opaque;
599
    *p_status = status;
600
}
601

    
602
static int iscsi_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
603
{
604
    IscsiLun *iscsilun = bs->opaque;
605
    int status;
606

    
607
    switch (req) {
608
    case SG_GET_VERSION_NUM:
609
        *(int *)buf = 30000;
610
        break;
611
    case SG_GET_SCSI_ID:
612
        ((struct sg_scsi_id *)buf)->scsi_type = iscsilun->type;
613
        break;
614
    case SG_IO:
615
        status = -EINPROGRESS;
616
        iscsi_aio_ioctl(bs, req, buf, ioctl_cb, &status);
617

    
618
        while (status == -EINPROGRESS) {
619
            qemu_aio_wait();
620
        }
621

    
622
        return 0;
623
    default:
624
        return -1;
625
    }
626
    return 0;
627
}
628
#endif
629

    
630
static int64_t
631
iscsi_getlength(BlockDriverState *bs)
632
{
633
    IscsiLun *iscsilun = bs->opaque;
634
    int64_t len;
635

    
636
    len  = iscsilun->num_blocks;
637
    len *= iscsilun->block_size;
638

    
639
    return len;
640
}
641

    
642
#if defined(LIBISCSI_FEATURE_IOVECTOR)
643

    
644
static int64_t coroutine_fn iscsi_co_get_block_status(BlockDriverState *bs,
645
                                                  int64_t sector_num,
646
                                                  int nb_sectors, int *pnum)
647
{
648
    IscsiLun *iscsilun = bs->opaque;
649
    struct scsi_get_lba_status *lbas = NULL;
650
    struct scsi_lba_status_descriptor *lbasd = NULL;
651
    struct IscsiTask iTask;
652
    int64_t ret;
653

    
654
    iscsi_co_init_iscsitask(iscsilun, &iTask);
655

    
656
    if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) {
657
        ret = -EINVAL;
658
        goto out;
659
    }
660

    
661
    /* default to all sectors allocated */
662
    ret = BDRV_BLOCK_DATA;
663
    ret |= (sector_num << BDRV_SECTOR_BITS) | BDRV_BLOCK_OFFSET_VALID;
664
    *pnum = nb_sectors;
665

    
666
    /* LUN does not support logical block provisioning */
667
    if (iscsilun->lbpme == 0) {
668
        goto out;
669
    }
670

    
671
retry:
672
    if (iscsi_get_lba_status_task(iscsilun->iscsi, iscsilun->lun,
673
                                  sector_qemu2lun(sector_num, iscsilun),
674
                                  8 + 16, iscsi_co_generic_cb,
675
                                  &iTask) == NULL) {
676
        ret = -ENOMEM;
677
        goto out;
678
    }
679

    
680
    while (!iTask.complete) {
681
        iscsi_set_events(iscsilun);
682
        qemu_coroutine_yield();
683
    }
684

    
685
    if (iTask.do_retry) {
686
        if (iTask.task != NULL) {
687
            scsi_free_scsi_task(iTask.task);
688
            iTask.task = NULL;
689
        }
690
        iTask.complete = 0;
691
        goto retry;
692
    }
693

    
694
    if (iTask.status != SCSI_STATUS_GOOD) {
695
        /* in case the get_lba_status_callout fails (i.e.
696
         * because the device is busy or the cmd is not
697
         * supported) we pretend all blocks are allocated
698
         * for backwards compatibility */
699
        goto out;
700
    }
701

    
702
    lbas = scsi_datain_unmarshall(iTask.task);
703
    if (lbas == NULL) {
704
        ret = -EIO;
705
        goto out;
706
    }
707

    
708
    lbasd = &lbas->descriptors[0];
709

    
710
    if (sector_qemu2lun(sector_num, iscsilun) != lbasd->lba) {
711
        ret = -EIO;
712
        goto out;
713
    }
714

    
715
    *pnum = sector_lun2qemu(lbasd->num_blocks, iscsilun);
716
    if (*pnum > nb_sectors) {
717
        *pnum = nb_sectors;
718
    }
719

    
720
    if (lbasd->provisioning == SCSI_PROVISIONING_TYPE_DEALLOCATED ||
721
        lbasd->provisioning == SCSI_PROVISIONING_TYPE_ANCHORED) {
722
        ret &= ~BDRV_BLOCK_DATA;
723
        if (iscsilun->lbprz) {
724
            ret |= BDRV_BLOCK_ZERO;
725
        }
726
    }
727

    
728
out:
729
    if (iTask.task != NULL) {
730
        scsi_free_scsi_task(iTask.task);
731
    }
732
    return ret;
733
}
734

    
735
#endif /* LIBISCSI_FEATURE_IOVECTOR */
736

    
737
static int
738
coroutine_fn iscsi_co_discard(BlockDriverState *bs, int64_t sector_num,
739
                                   int nb_sectors)
740
{
741
    IscsiLun *iscsilun = bs->opaque;
742
    struct IscsiTask iTask;
743
    struct unmap_list list;
744

    
745
    if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) {
746
        return -EINVAL;
747
    }
748

    
749
    if (!iscsilun->lbp.lbpu) {
750
        /* UNMAP is not supported by the target */
751
        return 0;
752
    }
753

    
754
    list.lba = sector_qemu2lun(sector_num, iscsilun);
755
    list.num = sector_qemu2lun(nb_sectors, iscsilun);
756

    
757
    iscsi_co_init_iscsitask(iscsilun, &iTask);
758
retry:
759
    if (iscsi_unmap_task(iscsilun->iscsi, iscsilun->lun, 0, 0, &list, 1,
760
                     iscsi_co_generic_cb, &iTask) == NULL) {
761
        return -ENOMEM;
762
    }
763

    
764
    while (!iTask.complete) {
765
        iscsi_set_events(iscsilun);
766
        qemu_coroutine_yield();
767
    }
768

    
769
    if (iTask.task != NULL) {
770
        scsi_free_scsi_task(iTask.task);
771
        iTask.task = NULL;
772
    }
773

    
774
    if (iTask.do_retry) {
775
        iTask.complete = 0;
776
        goto retry;
777
    }
778

    
779
    if (iTask.status == SCSI_STATUS_CHECK_CONDITION) {
780
        /* the target might fail with a check condition if it
781
           is not happy with the alignment of the UNMAP request
782
           we silently fail in this case */
783
        return 0;
784
    }
785

    
786
    if (iTask.status != SCSI_STATUS_GOOD) {
787
        return -EIO;
788
    }
789

    
790
    return 0;
791
}
792

    
793
#if defined(SCSI_SENSE_ASCQ_CAPACITY_DATA_HAS_CHANGED)
794

    
795
static int
796
coroutine_fn iscsi_co_write_zeroes(BlockDriverState *bs, int64_t sector_num,
797
                                   int nb_sectors, BdrvRequestFlags flags)
798
{
799
    IscsiLun *iscsilun = bs->opaque;
800
    struct IscsiTask iTask;
801
    uint64_t lba;
802
    uint32_t nb_blocks;
803

    
804
    if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) {
805
        return -EINVAL;
806
    }
807

    
808
    if (!(flags & BDRV_REQ_MAY_UNMAP) && !iscsilun->has_write_same) {
809
        /* WRITE SAME without UNMAP is not supported by the target */
810
        return -ENOTSUP;
811
    }
812

    
813
    if ((flags & BDRV_REQ_MAY_UNMAP) && !iscsilun->lbp.lbpws) {
814
        /* WRITE SAME with UNMAP is not supported by the target */
815
        return -ENOTSUP;
816
    }
817

    
818
    lba = sector_qemu2lun(sector_num, iscsilun);
819
    nb_blocks = sector_qemu2lun(nb_sectors, iscsilun);
820

    
821
    if (iscsilun->zeroblock == NULL) {
822
        iscsilun->zeroblock = g_malloc0(iscsilun->block_size);
823
    }
824

    
825
    iscsi_co_init_iscsitask(iscsilun, &iTask);
826
retry:
827
    if (iscsi_writesame16_task(iscsilun->iscsi, iscsilun->lun, lba,
828
                               iscsilun->zeroblock, iscsilun->block_size,
829
                               nb_blocks, 0, !!(flags & BDRV_REQ_MAY_UNMAP),
830
                               0, 0, iscsi_co_generic_cb, &iTask) == NULL) {
831
        return -ENOMEM;
832
    }
833

    
834
    while (!iTask.complete) {
835
        iscsi_set_events(iscsilun);
836
        qemu_coroutine_yield();
837
    }
838

    
839
    if (iTask.task != NULL) {
840
        scsi_free_scsi_task(iTask.task);
841
        iTask.task = NULL;
842
    }
843

    
844
    if (iTask.do_retry) {
845
        iTask.complete = 0;
846
        goto retry;
847
    }
848

    
849
    if (iTask.status != SCSI_STATUS_GOOD) {
850
        if (iTask.status == SCSI_STATUS_CHECK_CONDITION &&
851
            iTask.task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST &&
852
            iTask.task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) {
853
            /* WRITE SAME is not supported by the target */
854
            iscsilun->has_write_same = false;
855
            return -ENOTSUP;
856
        }
857

    
858
        return -EIO;
859
    }
860

    
861
    return 0;
862
}
863

    
864
#endif /* SCSI_SENSE_ASCQ_CAPACITY_DATA_HAS_CHANGED */
865

    
866
static void parse_chap(struct iscsi_context *iscsi, const char *target,
867
                       Error **errp)
868
{
869
    QemuOptsList *list;
870
    QemuOpts *opts;
871
    const char *user = NULL;
872
    const char *password = NULL;
873

    
874
    list = qemu_find_opts("iscsi");
875
    if (!list) {
876
        return;
877
    }
878

    
879
    opts = qemu_opts_find(list, target);
880
    if (opts == NULL) {
881
        opts = QTAILQ_FIRST(&list->head);
882
        if (!opts) {
883
            return;
884
        }
885
    }
886

    
887
    user = qemu_opt_get(opts, "user");
888
    if (!user) {
889
        return;
890
    }
891

    
892
    password = qemu_opt_get(opts, "password");
893
    if (!password) {
894
        error_setg(errp, "CHAP username specified but no password was given");
895
        return;
896
    }
897

    
898
    if (iscsi_set_initiator_username_pwd(iscsi, user, password)) {
899
        error_setg(errp, "Failed to set initiator username and password");
900
    }
901
}
902

    
903
static void parse_header_digest(struct iscsi_context *iscsi, const char *target,
904
                                Error **errp)
905
{
906
    QemuOptsList *list;
907
    QemuOpts *opts;
908
    const char *digest = NULL;
909

    
910
    list = qemu_find_opts("iscsi");
911
    if (!list) {
912
        return;
913
    }
914

    
915
    opts = qemu_opts_find(list, target);
916
    if (opts == NULL) {
917
        opts = QTAILQ_FIRST(&list->head);
918
        if (!opts) {
919
            return;
920
        }
921
    }
922

    
923
    digest = qemu_opt_get(opts, "header-digest");
924
    if (!digest) {
925
        return;
926
    }
927

    
928
    if (!strcmp(digest, "CRC32C")) {
929
        iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_CRC32C);
930
    } else if (!strcmp(digest, "NONE")) {
931
        iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE);
932
    } else if (!strcmp(digest, "CRC32C-NONE")) {
933
        iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_CRC32C_NONE);
934
    } else if (!strcmp(digest, "NONE-CRC32C")) {
935
        iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
936
    } else {
937
        error_setg(errp, "Invalid header-digest setting : %s", digest);
938
    }
939
}
940

    
941
static char *parse_initiator_name(const char *target)
942
{
943
    QemuOptsList *list;
944
    QemuOpts *opts;
945
    const char *name;
946
    char *iscsi_name;
947
    UuidInfo *uuid_info;
948

    
949
    list = qemu_find_opts("iscsi");
950
    if (list) {
951
        opts = qemu_opts_find(list, target);
952
        if (!opts) {
953
            opts = QTAILQ_FIRST(&list->head);
954
        }
955
        if (opts) {
956
            name = qemu_opt_get(opts, "initiator-name");
957
            if (name) {
958
                return g_strdup(name);
959
            }
960
        }
961
    }
962

    
963
    uuid_info = qmp_query_uuid(NULL);
964
    if (strcmp(uuid_info->UUID, UUID_NONE) == 0) {
965
        name = qemu_get_vm_name();
966
    } else {
967
        name = uuid_info->UUID;
968
    }
969
    iscsi_name = g_strdup_printf("iqn.2008-11.org.linux-kvm%s%s",
970
                                 name ? ":" : "", name ? name : "");
971
    qapi_free_UuidInfo(uuid_info);
972
    return iscsi_name;
973
}
974

    
975
#if defined(LIBISCSI_FEATURE_NOP_COUNTER)
976
static void iscsi_nop_timed_event(void *opaque)
977
{
978
    IscsiLun *iscsilun = opaque;
979

    
980
    if (iscsi_get_nops_in_flight(iscsilun->iscsi) > MAX_NOP_FAILURES) {
981
        error_report("iSCSI: NOP timeout. Reconnecting...");
982
        iscsi_reconnect(iscsilun->iscsi);
983
    }
984

    
985
    if (iscsi_nop_out_async(iscsilun->iscsi, NULL, NULL, 0, NULL) != 0) {
986
        error_report("iSCSI: failed to sent NOP-Out. Disabling NOP messages.");
987
        return;
988
    }
989

    
990
    timer_mod(iscsilun->nop_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + NOP_INTERVAL);
991
    iscsi_set_events(iscsilun);
992
}
993
#endif
994

    
995
static void iscsi_readcapacity_sync(IscsiLun *iscsilun, Error **errp)
996
{
997
    struct scsi_task *task = NULL;
998
    struct scsi_readcapacity10 *rc10 = NULL;
999
    struct scsi_readcapacity16 *rc16 = NULL;
1000
    int retries = ISCSI_CMD_RETRIES; 
1001

    
1002
    do {
1003
        if (task != NULL) {
1004
            scsi_free_scsi_task(task);
1005
            task = NULL;
1006
        }
1007

    
1008
        switch (iscsilun->type) {
1009
        case TYPE_DISK:
1010
            task = iscsi_readcapacity16_sync(iscsilun->iscsi, iscsilun->lun);
1011
            if (task != NULL && task->status == SCSI_STATUS_GOOD) {
1012
                rc16 = scsi_datain_unmarshall(task);
1013
                if (rc16 == NULL) {
1014
                    error_setg(errp, "iSCSI: Failed to unmarshall readcapacity16 data.");
1015
                } else {
1016
                    iscsilun->block_size = rc16->block_length;
1017
                    iscsilun->num_blocks = rc16->returned_lba + 1;
1018
                    iscsilun->lbpme = rc16->lbpme;
1019
                    iscsilun->lbprz = rc16->lbprz;
1020
                }
1021
            }
1022
            break;
1023
        case TYPE_ROM:
1024
            task = iscsi_readcapacity10_sync(iscsilun->iscsi, iscsilun->lun, 0, 0);
1025
            if (task != NULL && task->status == SCSI_STATUS_GOOD) {
1026
                rc10 = scsi_datain_unmarshall(task);
1027
                if (rc10 == NULL) {
1028
                    error_setg(errp, "iSCSI: Failed to unmarshall readcapacity10 data.");
1029
                } else {
1030
                    iscsilun->block_size = rc10->block_size;
1031
                    if (rc10->lba == 0) {
1032
                        /* blank disk loaded */
1033
                        iscsilun->num_blocks = 0;
1034
                    } else {
1035
                        iscsilun->num_blocks = rc10->lba + 1;
1036
                    }
1037
                }
1038
            }
1039
            break;
1040
        default:
1041
            return;
1042
        }
1043
    } while (task != NULL && task->status == SCSI_STATUS_CHECK_CONDITION
1044
             && task->sense.key == SCSI_SENSE_UNIT_ATTENTION
1045
             && retries-- > 0);
1046

    
1047
    if (task == NULL || task->status != SCSI_STATUS_GOOD) {
1048
        error_setg(errp, "iSCSI: failed to send readcapacity10 command.");
1049
    }
1050
    if (task) {
1051
        scsi_free_scsi_task(task);
1052
    }
1053
}
1054

    
1055
/* TODO Convert to fine grained options */
1056
static QemuOptsList runtime_opts = {
1057
    .name = "iscsi",
1058
    .head = QTAILQ_HEAD_INITIALIZER(runtime_opts.head),
1059
    .desc = {
1060
        {
1061
            .name = "filename",
1062
            .type = QEMU_OPT_STRING,
1063
            .help = "URL to the iscsi image",
1064
        },
1065
        { /* end of list */ }
1066
    },
1067
};
1068

    
1069
static struct scsi_task *iscsi_do_inquiry(struct iscsi_context *iscsi, int lun,
1070
                                          int evpd, int pc, void **inq, Error **errp)
1071
{
1072
    int full_size;
1073
    struct scsi_task *task = NULL;
1074
    task = iscsi_inquiry_sync(iscsi, lun, evpd, pc, 64);
1075
    if (task == NULL || task->status != SCSI_STATUS_GOOD) {
1076
        goto fail;
1077
    }
1078
    full_size = scsi_datain_getfullsize(task);
1079
    if (full_size > task->datain.size) {
1080
        scsi_free_scsi_task(task);
1081

    
1082
        /* we need more data for the full list */
1083
        task = iscsi_inquiry_sync(iscsi, lun, evpd, pc, full_size);
1084
        if (task == NULL || task->status != SCSI_STATUS_GOOD) {
1085
            goto fail;
1086
        }
1087
    }
1088

    
1089
    *inq = scsi_datain_unmarshall(task);
1090
    if (*inq == NULL) {
1091
        error_setg(errp, "iSCSI: failed to unmarshall inquiry datain blob");
1092
        goto fail;
1093
    }
1094

    
1095
    return task;
1096

    
1097
fail:
1098
    error_setg(errp, "iSCSI: Inquiry command failed : %s",
1099
               iscsi_get_error(iscsi));
1100
    if (task != NULL) {
1101
        scsi_free_scsi_task(task);
1102
    }
1103
    return NULL;
1104
}
1105

    
1106
/*
1107
 * We support iscsi url's on the form
1108
 * iscsi://[<username>%<password>@]<host>[:<port>]/<targetname>/<lun>
1109
 *
1110
 * Note: flags are currently not used by iscsi_open.  If this function
1111
 * is changed such that flags are used, please examine iscsi_reopen_prepare()
1112
 * to see if needs to be changed as well.
1113
 */
1114
static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
1115
                      Error **errp)
1116
{
1117
    IscsiLun *iscsilun = bs->opaque;
1118
    struct iscsi_context *iscsi = NULL;
1119
    struct iscsi_url *iscsi_url = NULL;
1120
    struct scsi_task *task = NULL;
1121
    struct scsi_inquiry_standard *inq = NULL;
1122
    struct scsi_inquiry_supported_pages *inq_vpd;
1123
    char *initiator_name = NULL;
1124
    QemuOpts *opts;
1125
    Error *local_err = NULL;
1126
    const char *filename;
1127
    int i, ret;
1128

    
1129
    if ((BDRV_SECTOR_SIZE % 512) != 0) {
1130
        error_setg(errp, "iSCSI: Invalid BDRV_SECTOR_SIZE. "
1131
                   "BDRV_SECTOR_SIZE(%lld) is not a multiple "
1132
                   "of 512", BDRV_SECTOR_SIZE);
1133
        return -EINVAL;
1134
    }
1135

    
1136
    opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
1137
    qemu_opts_absorb_qdict(opts, options, &local_err);
1138
    if (local_err) {
1139
        error_propagate(errp, local_err);
1140
        ret = -EINVAL;
1141
        goto out;
1142
    }
1143

    
1144
    filename = qemu_opt_get(opts, "filename");
1145

    
1146
    iscsi_url = iscsi_parse_full_url(iscsi, filename);
1147
    if (iscsi_url == NULL) {
1148
        error_setg(errp, "Failed to parse URL : %s", filename);
1149
        ret = -EINVAL;
1150
        goto out;
1151
    }
1152

    
1153
    memset(iscsilun, 0, sizeof(IscsiLun));
1154

    
1155
    initiator_name = parse_initiator_name(iscsi_url->target);
1156

    
1157
    iscsi = iscsi_create_context(initiator_name);
1158
    if (iscsi == NULL) {
1159
        error_setg(errp, "iSCSI: Failed to create iSCSI context.");
1160
        ret = -ENOMEM;
1161
        goto out;
1162
    }
1163

    
1164
    if (iscsi_set_targetname(iscsi, iscsi_url->target)) {
1165
        error_setg(errp, "iSCSI: Failed to set target name.");
1166
        ret = -EINVAL;
1167
        goto out;
1168
    }
1169

    
1170
    if (iscsi_url->user != NULL) {
1171
        ret = iscsi_set_initiator_username_pwd(iscsi, iscsi_url->user,
1172
                                              iscsi_url->passwd);
1173
        if (ret != 0) {
1174
            error_setg(errp, "Failed to set initiator username and password");
1175
            ret = -EINVAL;
1176
            goto out;
1177
        }
1178
    }
1179

    
1180
    /* check if we got CHAP username/password via the options */
1181
    parse_chap(iscsi, iscsi_url->target, &local_err);
1182
    if (local_err != NULL) {
1183
        error_propagate(errp, local_err);
1184
        ret = -EINVAL;
1185
        goto out;
1186
    }
1187

    
1188
    if (iscsi_set_session_type(iscsi, ISCSI_SESSION_NORMAL) != 0) {
1189
        error_setg(errp, "iSCSI: Failed to set session type to normal.");
1190
        ret = -EINVAL;
1191
        goto out;
1192
    }
1193

    
1194
    iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
1195

    
1196
    /* check if we got HEADER_DIGEST via the options */
1197
    parse_header_digest(iscsi, iscsi_url->target, &local_err);
1198
    if (local_err != NULL) {
1199
        error_propagate(errp, local_err);
1200
        ret = -EINVAL;
1201
        goto out;
1202
    }
1203

    
1204
    if (iscsi_full_connect_sync(iscsi, iscsi_url->portal, iscsi_url->lun) != 0) {
1205
        error_setg(errp, "iSCSI: Failed to connect to LUN : %s",
1206
            iscsi_get_error(iscsi));
1207
        ret = -EINVAL;
1208
        goto out;
1209
    }
1210

    
1211
    iscsilun->iscsi = iscsi;
1212
    iscsilun->lun   = iscsi_url->lun;
1213
    iscsilun->has_write_same = true;
1214

    
1215
    task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 0, 0,
1216
                            (void **) &inq, errp);
1217
    if (task == NULL) {
1218
        ret = -EINVAL;
1219
        goto out;
1220
    }
1221
    iscsilun->type = inq->periperal_device_type;
1222
    scsi_free_scsi_task(task);
1223
    task = NULL;
1224

    
1225
    iscsi_readcapacity_sync(iscsilun, &local_err);
1226
    if (local_err != NULL) {
1227
        error_propagate(errp, local_err);
1228
        goto out;
1229
    }
1230
    bs->total_sectors = sector_lun2qemu(iscsilun->num_blocks, iscsilun);
1231
    bs->request_alignment = iscsilun->block_size;
1232

    
1233
    /* Medium changer or tape. We dont have any emulation for this so this must
1234
     * be sg ioctl compatible. We force it to be sg, otherwise qemu will try
1235
     * to read from the device to guess the image format.
1236
     */
1237
    if (iscsilun->type == TYPE_MEDIUM_CHANGER ||
1238
        iscsilun->type == TYPE_TAPE) {
1239
        bs->sg = 1;
1240
    }
1241

    
1242
    task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 1,
1243
                            SCSI_INQUIRY_PAGECODE_SUPPORTED_VPD_PAGES,
1244
                            (void **) &inq_vpd, errp);
1245
    if (task == NULL) {
1246
        ret = -EINVAL;
1247
        goto out;
1248
    }
1249
    for (i = 0; i < inq_vpd->num_pages; i++) {
1250
        struct scsi_task *inq_task;
1251
        struct scsi_inquiry_logical_block_provisioning *inq_lbp;
1252
        struct scsi_inquiry_block_limits *inq_bl;
1253
        switch (inq_vpd->pages[i]) {
1254
        case SCSI_INQUIRY_PAGECODE_LOGICAL_BLOCK_PROVISIONING:
1255
            inq_task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 1,
1256
                                        SCSI_INQUIRY_PAGECODE_LOGICAL_BLOCK_PROVISIONING,
1257
                                        (void **) &inq_lbp, errp);
1258
            if (inq_task == NULL) {
1259
                ret = -EINVAL;
1260
                goto out;
1261
            }
1262
            memcpy(&iscsilun->lbp, inq_lbp,
1263
                   sizeof(struct scsi_inquiry_logical_block_provisioning));
1264
            scsi_free_scsi_task(inq_task);
1265
            break;
1266
        case SCSI_INQUIRY_PAGECODE_BLOCK_LIMITS:
1267
            inq_task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 1,
1268
                                    SCSI_INQUIRY_PAGECODE_BLOCK_LIMITS,
1269
                                    (void **) &inq_bl, errp);
1270
            if (inq_task == NULL) {
1271
                ret = -EINVAL;
1272
                goto out;
1273
            }
1274
            memcpy(&iscsilun->bl, inq_bl,
1275
                   sizeof(struct scsi_inquiry_block_limits));
1276
            scsi_free_scsi_task(inq_task);
1277
            break;
1278
        default:
1279
            break;
1280
        }
1281
    }
1282
    scsi_free_scsi_task(task);
1283
    task = NULL;
1284

    
1285
#if defined(LIBISCSI_FEATURE_NOP_COUNTER)
1286
    /* Set up a timer for sending out iSCSI NOPs */
1287
    iscsilun->nop_timer = timer_new_ms(QEMU_CLOCK_REALTIME, iscsi_nop_timed_event, iscsilun);
1288
    timer_mod(iscsilun->nop_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + NOP_INTERVAL);
1289
#endif
1290

    
1291
out:
1292
    qemu_opts_del(opts);
1293
    if (initiator_name != NULL) {
1294
        g_free(initiator_name);
1295
    }
1296
    if (iscsi_url != NULL) {
1297
        iscsi_destroy_url(iscsi_url);
1298
    }
1299
    if (task != NULL) {
1300
        scsi_free_scsi_task(task);
1301
    }
1302

    
1303
    if (ret) {
1304
        if (iscsi != NULL) {
1305
            iscsi_destroy_context(iscsi);
1306
        }
1307
        memset(iscsilun, 0, sizeof(IscsiLun));
1308
    }
1309
    return ret;
1310
}
1311

    
1312
static void iscsi_close(BlockDriverState *bs)
1313
{
1314
    IscsiLun *iscsilun = bs->opaque;
1315
    struct iscsi_context *iscsi = iscsilun->iscsi;
1316

    
1317
    if (iscsilun->nop_timer) {
1318
        timer_del(iscsilun->nop_timer);
1319
        timer_free(iscsilun->nop_timer);
1320
    }
1321
    qemu_aio_set_fd_handler(iscsi_get_fd(iscsi), NULL, NULL, NULL);
1322
    iscsi_destroy_context(iscsi);
1323
    g_free(iscsilun->zeroblock);
1324
    memset(iscsilun, 0, sizeof(IscsiLun));
1325
}
1326

    
1327
static int iscsi_refresh_limits(BlockDriverState *bs)
1328
{
1329
    IscsiLun *iscsilun = bs->opaque;
1330

    
1331
    /* We don't actually refresh here, but just return data queried in
1332
     * iscsi_open(): iscsi targets don't change their limits. */
1333
    if (iscsilun->lbp.lbpu || iscsilun->lbp.lbpws) {
1334
        if (iscsilun->bl.max_unmap < 0xffffffff) {
1335
            bs->bl.max_discard = sector_lun2qemu(iscsilun->bl.max_unmap,
1336
                                                 iscsilun);
1337
        }
1338
        bs->bl.discard_alignment = sector_lun2qemu(iscsilun->bl.opt_unmap_gran,
1339
                                                   iscsilun);
1340

    
1341
        if (iscsilun->bl.max_ws_len < 0xffffffff) {
1342
            bs->bl.max_write_zeroes = sector_lun2qemu(iscsilun->bl.max_ws_len,
1343
                                                      iscsilun);
1344
        }
1345
        bs->bl.write_zeroes_alignment = sector_lun2qemu(iscsilun->bl.opt_unmap_gran,
1346
                                                        iscsilun);
1347
    }
1348
    bs->bl.opt_transfer_length = sector_lun2qemu(iscsilun->bl.opt_xfer_len,
1349
                                                 iscsilun);
1350
    return 0;
1351
}
1352

    
1353
/* Since iscsi_open() ignores bdrv_flags, there is nothing to do here in
1354
 * prepare.  Note that this will not re-establish a connection with an iSCSI
1355
 * target - it is effectively a NOP.  */
1356
static int iscsi_reopen_prepare(BDRVReopenState *state,
1357
                                BlockReopenQueue *queue, Error **errp)
1358
{
1359
    /* NOP */
1360
    return 0;
1361
}
1362

    
1363
static int iscsi_truncate(BlockDriverState *bs, int64_t offset)
1364
{
1365
    IscsiLun *iscsilun = bs->opaque;
1366
    Error *local_err = NULL;
1367

    
1368
    if (iscsilun->type != TYPE_DISK) {
1369
        return -ENOTSUP;
1370
    }
1371

    
1372
    iscsi_readcapacity_sync(iscsilun, &local_err);
1373
    if (local_err != NULL) {
1374
        error_free(local_err);
1375
        return -EIO;
1376
    }
1377

    
1378
    if (offset > iscsi_getlength(bs)) {
1379
        return -EINVAL;
1380
    }
1381

    
1382
    return 0;
1383
}
1384

    
1385
static int iscsi_create(const char *filename, QEMUOptionParameter *options,
1386
                        Error **errp)
1387
{
1388
    int ret = 0;
1389
    int64_t total_size = 0;
1390
    BlockDriverState *bs;
1391
    IscsiLun *iscsilun = NULL;
1392
    QDict *bs_options;
1393

    
1394
    bs = bdrv_new("");
1395

    
1396
    /* Read out options */
1397
    while (options && options->name) {
1398
        if (!strcmp(options->name, "size")) {
1399
            total_size = options->value.n / BDRV_SECTOR_SIZE;
1400
        }
1401
        options++;
1402
    }
1403

    
1404
    bs->opaque = g_malloc0(sizeof(struct IscsiLun));
1405
    iscsilun = bs->opaque;
1406

    
1407
    bs_options = qdict_new();
1408
    qdict_put(bs_options, "filename", qstring_from_str(filename));
1409
    ret = iscsi_open(bs, bs_options, 0, NULL);
1410
    QDECREF(bs_options);
1411

    
1412
    if (ret != 0) {
1413
        goto out;
1414
    }
1415
    if (iscsilun->nop_timer) {
1416
        timer_del(iscsilun->nop_timer);
1417
        timer_free(iscsilun->nop_timer);
1418
    }
1419
    if (iscsilun->type != TYPE_DISK) {
1420
        ret = -ENODEV;
1421
        goto out;
1422
    }
1423
    if (bs->total_sectors < total_size) {
1424
        ret = -ENOSPC;
1425
        goto out;
1426
    }
1427

    
1428
    ret = 0;
1429
out:
1430
    if (iscsilun->iscsi != NULL) {
1431
        iscsi_destroy_context(iscsilun->iscsi);
1432
    }
1433
    g_free(bs->opaque);
1434
    bs->opaque = NULL;
1435
    bdrv_unref(bs);
1436
    return ret;
1437
}
1438

    
1439
static int iscsi_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
1440
{
1441
    IscsiLun *iscsilun = bs->opaque;
1442
    bdi->unallocated_blocks_are_zero = !!iscsilun->lbprz;
1443
    bdi->can_write_zeroes_with_unmap = iscsilun->lbprz && iscsilun->lbp.lbpws;
1444
    /* Guess the internal cluster (page) size of the iscsi target by the means
1445
     * of opt_unmap_gran. Transfer the unmap granularity only if it has a
1446
     * reasonable size for bdi->cluster_size */
1447
    if (iscsilun->bl.opt_unmap_gran * iscsilun->block_size >= 64 * 1024 &&
1448
        iscsilun->bl.opt_unmap_gran * iscsilun->block_size <= 16 * 1024 * 1024) {
1449
        bdi->cluster_size = iscsilun->bl.opt_unmap_gran * iscsilun->block_size;
1450
    }
1451
    return 0;
1452
}
1453

    
1454
static QEMUOptionParameter iscsi_create_options[] = {
1455
    {
1456
        .name = BLOCK_OPT_SIZE,
1457
        .type = OPT_SIZE,
1458
        .help = "Virtual disk size"
1459
    },
1460
    { NULL }
1461
};
1462

    
1463
static BlockDriver bdrv_iscsi = {
1464
    .format_name     = "iscsi",
1465
    .protocol_name   = "iscsi",
1466

    
1467
    .instance_size   = sizeof(IscsiLun),
1468
    .bdrv_needs_filename = true,
1469
    .bdrv_file_open  = iscsi_open,
1470
    .bdrv_close      = iscsi_close,
1471
    .bdrv_create     = iscsi_create,
1472
    .create_options  = iscsi_create_options,
1473
    .bdrv_reopen_prepare  = iscsi_reopen_prepare,
1474

    
1475
    .bdrv_getlength  = iscsi_getlength,
1476
    .bdrv_get_info   = iscsi_get_info,
1477
    .bdrv_truncate   = iscsi_truncate,
1478
    .bdrv_refresh_limits = iscsi_refresh_limits,
1479

    
1480
#if defined(LIBISCSI_FEATURE_IOVECTOR)
1481
    .bdrv_co_get_block_status = iscsi_co_get_block_status,
1482
#endif
1483
    .bdrv_co_discard      = iscsi_co_discard,
1484
#if defined(SCSI_SENSE_ASCQ_CAPACITY_DATA_HAS_CHANGED)
1485
    .bdrv_co_write_zeroes = iscsi_co_write_zeroes,
1486
#endif
1487
    .bdrv_co_readv         = iscsi_co_readv,
1488
    .bdrv_co_writev        = iscsi_co_writev,
1489
    .bdrv_co_flush_to_disk = iscsi_co_flush,
1490

    
1491
#ifdef __linux__
1492
    .bdrv_ioctl       = iscsi_ioctl,
1493
    .bdrv_aio_ioctl   = iscsi_aio_ioctl,
1494
#endif
1495
};
1496

    
1497
static QemuOptsList qemu_iscsi_opts = {
1498
    .name = "iscsi",
1499
    .head = QTAILQ_HEAD_INITIALIZER(qemu_iscsi_opts.head),
1500
    .desc = {
1501
        {
1502
            .name = "user",
1503
            .type = QEMU_OPT_STRING,
1504
            .help = "username for CHAP authentication to target",
1505
        },{
1506
            .name = "password",
1507
            .type = QEMU_OPT_STRING,
1508
            .help = "password for CHAP authentication to target",
1509
        },{
1510
            .name = "header-digest",
1511
            .type = QEMU_OPT_STRING,
1512
            .help = "HeaderDigest setting. "
1513
                    "{CRC32C|CRC32C-NONE|NONE-CRC32C|NONE}",
1514
        },{
1515
            .name = "initiator-name",
1516
            .type = QEMU_OPT_STRING,
1517
            .help = "Initiator iqn name to use when connecting",
1518
        },
1519
        { /* end of list */ }
1520
    },
1521
};
1522

    
1523
static void iscsi_block_init(void)
1524
{
1525
    bdrv_register(&bdrv_iscsi);
1526
    qemu_add_opts(&qemu_iscsi_opts);
1527
}
1528

    
1529
block_init(iscsi_block_init);