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