Revision 64e69e80

b/block/iscsi.c
76 76
iscsi_abort_task_cb(struct iscsi_context *iscsi, int status, void *command_data,
77 77
                    void *private_data)
78 78
{
79
    IscsiAIOCB *acb = (IscsiAIOCB *)private_data;
80

  
81
    scsi_free_scsi_task(acb->task);
82
    acb->task = NULL;
79 83
}
80 84

  
81 85
static void
......
84 88
    IscsiAIOCB *acb = (IscsiAIOCB *)blockacb;
85 89
    IscsiLun *iscsilun = acb->iscsilun;
86 90

  
87
    acb->common.cb(acb->common.opaque, -ECANCELED);
88 91
    acb->canceled = 1;
89 92

  
90
    /* send a task mgmt call to the target to cancel the task on the target */
91
    iscsi_task_mgmt_abort_task_async(iscsilun->iscsi, acb->task,
92
                                     iscsi_abort_task_cb, NULL);
93
    acb->common.cb(acb->common.opaque, -ECANCELED);
93 94

  
94
    /* then also cancel the task locally in libiscsi */
95
    iscsi_scsi_task_cancel(iscsilun->iscsi, acb->task);
95
    /* send a task mgmt call to the target to cancel the task on the target
96
     * this also cancels the task in libiscsi
97
     */
98
    iscsi_task_mgmt_abort_task_async(iscsilun->iscsi, acb->task,
99
                                     iscsi_abort_task_cb, &acb);
96 100
}
97 101

  
98 102
static AIOPool iscsi_aio_pool = {
......
179 183

  
180 184
    qemu_bh_delete(acb->bh);
181 185

  
182
    if (acb->canceled == 0) {
186
    if (!acb->canceled) {
183 187
        acb->common.cb(acb->common.opaque, acb->status);
184 188
    }
185 189

  
186 190
    qemu_aio_release(acb);
191

  
192
    if (acb->canceled) {
193
        return;
194
    }
195

  
196
    scsi_free_scsi_task(acb->task);
197
    acb->task = NULL;
187 198
}
188 199

  
189 200

  
......
197 208

  
198 209
    g_free(acb->buf);
199 210

  
200
    if (acb->canceled != 0) {
211
    if (acb->canceled) {
201 212
        qemu_aio_release(acb);
202
        scsi_free_scsi_task(acb->task);
203
        acb->task = NULL;
204 213
        return;
205 214
    }
206 215

  
......
212 221
    }
213 222

  
214 223
    iscsi_schedule_bh(iscsi_readv_writev_bh_cb, acb);
215
    scsi_free_scsi_task(acb->task);
216
    acb->task = NULL;
217 224
}
218 225

  
219 226
static int64_t sector_qemu2lun(int64_t sector, IscsiLun *iscsilun)
......
298 305

  
299 306
    trace_iscsi_aio_read16_cb(iscsi, status, acb, acb->canceled);
300 307

  
301
    if (acb->canceled != 0) {
308
    if (acb->canceled) {
302 309
        qemu_aio_release(acb);
303
        scsi_free_scsi_task(acb->task);
304
        acb->task = NULL;
305 310
        return;
306 311
    }
307 312

  
......
313 318
    }
314 319

  
315 320
    iscsi_schedule_bh(iscsi_readv_writev_bh_cb, acb);
316
    scsi_free_scsi_task(acb->task);
317
    acb->task = NULL;
318 321
}
319 322

  
320 323
static BlockDriverAIOCB *
......
414 417
{
415 418
    IscsiAIOCB *acb = opaque;
416 419

  
417
    if (acb->canceled != 0) {
420
    if (acb->canceled) {
418 421
        qemu_aio_release(acb);
419
        scsi_free_scsi_task(acb->task);
420
        acb->task = NULL;
421 422
        return;
422 423
    }
423 424

  
......
429 430
    }
430 431

  
431 432
    iscsi_schedule_bh(iscsi_readv_writev_bh_cb, acb);
432
    scsi_free_scsi_task(acb->task);
433
    acb->task = NULL;
434 433
}
435 434

  
436 435
static BlockDriverAIOCB *
......
468 467
{
469 468
    IscsiAIOCB *acb = opaque;
470 469

  
471
    if (acb->canceled != 0) {
470
    if (acb->canceled) {
472 471
        qemu_aio_release(acb);
473
        scsi_free_scsi_task(acb->task);
474
        acb->task = NULL;
475 472
        return;
476 473
    }
477 474

  
......
483 480
    }
484 481

  
485 482
    iscsi_schedule_bh(iscsi_readv_writev_bh_cb, acb);
486
    scsi_free_scsi_task(acb->task);
487
    acb->task = NULL;
488 483
}
489 484

  
490 485
static BlockDriverAIOCB *
......
528 523
{
529 524
    IscsiAIOCB *acb = opaque;
530 525

  
531
    if (acb->canceled != 0) {
526
    if (acb->canceled) {
532 527
        qemu_aio_release(acb);
533
        scsi_free_scsi_task(acb->task);
534
        acb->task = NULL;
535 528
        return;
536 529
    }
537 530

  
......
560 553
    }
561 554

  
562 555
    iscsi_schedule_bh(iscsi_readv_writev_bh_cb, acb);
563
    scsi_free_scsi_task(acb->task);
564
    acb->task = NULL;
565 556
}
566 557

  
567 558
static BlockDriverAIOCB *iscsi_aio_ioctl(BlockDriverState *bs,

Also available in: Unified diff