Lines Matching refs:iscsilun
115 IscsiLun *iscsilun; member
124 IscsiLun *iscsilun; member
177 acb->bh = aio_bh_new(acb->iscsilun->aio_context, iscsi_bh_cb, acb); in iscsi_schedule_bh()
260 iTask->iscsilun->request_timed_out = true; in iscsi_co_generic_cb()
266 aio_timer_init(iTask->iscsilun->aio_context, in iscsi_co_generic_cb()
288 replay_bh_schedule_oneshot_event(iTask->iscsilun->aio_context, in iscsi_co_generic_cb()
296 iscsi_co_init_iscsitask(IscsiLun *iscsilun, struct IscsiTask *iTask) in iscsi_co_init_iscsitask() argument
300 .iscsilun = iscsilun, in iscsi_co_init_iscsitask()
326 IscsiLun *iscsilun = acb->iscsilun; in iscsi_aio_cancel() local
328 WITH_QEMU_LOCK_GUARD(&iscsilun->mutex) { in iscsi_aio_cancel()
340 if (iscsi_task_mgmt_abort_task_async(iscsilun->iscsi, acb->task, in iscsi_aio_cancel()
359 iscsi_set_events(IscsiLun *iscsilun) in iscsi_set_events() argument
361 struct iscsi_context *iscsi = iscsilun->iscsi; in iscsi_set_events()
364 if (ev != iscsilun->events) { in iscsi_set_events()
365 aio_set_fd_handler(iscsilun->aio_context, iscsi_get_fd(iscsi), in iscsi_set_events()
369 iscsilun); in iscsi_set_events()
370 iscsilun->events = ev; in iscsi_set_events()
376 IscsiLun *iscsilun = opaque; in iscsi_timed_check_events() local
378 WITH_QEMU_LOCK_GUARD(&iscsilun->mutex) { in iscsi_timed_check_events()
380 iscsi_service(iscsilun->iscsi, 0); in iscsi_timed_check_events()
382 if (iscsilun->request_timed_out) { in iscsi_timed_check_events()
383 iscsilun->request_timed_out = false; in iscsi_timed_check_events()
384 iscsi_reconnect(iscsilun->iscsi); in iscsi_timed_check_events()
391 iscsi_set_events(iscsilun); in iscsi_timed_check_events()
394 timer_mod(iscsilun->event_timer, in iscsi_timed_check_events()
401 IscsiLun *iscsilun = arg; in iscsi_process_read() local
402 struct iscsi_context *iscsi = iscsilun->iscsi; in iscsi_process_read()
404 qemu_mutex_lock(&iscsilun->mutex); in iscsi_process_read()
406 iscsi_set_events(iscsilun); in iscsi_process_read()
407 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_process_read()
413 IscsiLun *iscsilun = arg; in iscsi_process_write() local
414 struct iscsi_context *iscsi = iscsilun->iscsi; in iscsi_process_write()
416 qemu_mutex_lock(&iscsilun->mutex); in iscsi_process_write()
418 iscsi_set_events(iscsilun); in iscsi_process_write()
419 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_process_write()
422 static int64_t sector_lun2qemu(int64_t sector, IscsiLun *iscsilun) in sector_lun2qemu() argument
424 return sector * iscsilun->block_size / BDRV_SECTOR_SIZE; in sector_lun2qemu()
427 static int64_t sector_qemu2lun(int64_t sector, IscsiLun *iscsilun) in sector_qemu2lun() argument
429 return sector * BDRV_SECTOR_SIZE / iscsilun->block_size; in sector_qemu2lun()
433 IscsiLun *iscsilun) in is_byte_request_lun_aligned() argument
435 if (offset % iscsilun->block_size || bytes % iscsilun->block_size) { in is_byte_request_lun_aligned()
439 iscsilun->block_size, offset, bytes); in is_byte_request_lun_aligned()
446 IscsiLun *iscsilun) in is_sector_request_lun_aligned() argument
451 iscsilun); in is_sector_request_lun_aligned()
454 static void iscsi_allocmap_free(IscsiLun *iscsilun) in iscsi_allocmap_free() argument
456 g_free(iscsilun->allocmap); in iscsi_allocmap_free()
457 g_free(iscsilun->allocmap_valid); in iscsi_allocmap_free()
458 iscsilun->allocmap = NULL; in iscsi_allocmap_free()
459 iscsilun->allocmap_valid = NULL; in iscsi_allocmap_free()
463 static int iscsi_allocmap_init(IscsiLun *iscsilun, int open_flags) in iscsi_allocmap_init() argument
465 iscsi_allocmap_free(iscsilun); in iscsi_allocmap_init()
467 assert(iscsilun->cluster_size); in iscsi_allocmap_init()
468 iscsilun->allocmap_size = in iscsi_allocmap_init()
469 DIV_ROUND_UP(iscsilun->num_blocks * iscsilun->block_size, in iscsi_allocmap_init()
470 iscsilun->cluster_size); in iscsi_allocmap_init()
472 iscsilun->allocmap = bitmap_try_new(iscsilun->allocmap_size); in iscsi_allocmap_init()
473 if (!iscsilun->allocmap) { in iscsi_allocmap_init()
484 iscsilun->allocmap_valid = bitmap_try_new(iscsilun->allocmap_size); in iscsi_allocmap_init()
485 if (!iscsilun->allocmap_valid) { in iscsi_allocmap_init()
487 iscsi_allocmap_free(iscsilun); in iscsi_allocmap_init()
495 iscsi_allocmap_update(IscsiLun *iscsilun, int64_t offset, in iscsi_allocmap_update() argument
500 if (iscsilun->allocmap == NULL) { in iscsi_allocmap_update()
504 assert(iscsilun->cluster_size); in iscsi_allocmap_update()
505 cl_num_expanded = offset / iscsilun->cluster_size; in iscsi_allocmap_update()
507 iscsilun->cluster_size) - cl_num_expanded; in iscsi_allocmap_update()
509 cl_num_shrunk = DIV_ROUND_UP(offset, iscsilun->cluster_size); in iscsi_allocmap_update()
510 nb_cls_shrunk = (offset + bytes) / iscsilun->cluster_size - cl_num_shrunk; in iscsi_allocmap_update()
512 bitmap_set(iscsilun->allocmap, cl_num_expanded, nb_cls_expanded); in iscsi_allocmap_update()
515 bitmap_clear(iscsilun->allocmap, cl_num_shrunk, nb_cls_shrunk); in iscsi_allocmap_update()
519 if (iscsilun->allocmap_valid == NULL) { in iscsi_allocmap_update()
524 bitmap_set(iscsilun->allocmap_valid, cl_num_shrunk, nb_cls_shrunk); in iscsi_allocmap_update()
527 bitmap_clear(iscsilun->allocmap_valid, cl_num_expanded, in iscsi_allocmap_update()
533 iscsi_allocmap_set_allocated(IscsiLun *iscsilun, int64_t offset, in iscsi_allocmap_set_allocated() argument
536 iscsi_allocmap_update(iscsilun, offset, bytes, true, true); in iscsi_allocmap_set_allocated()
540 iscsi_allocmap_set_unallocated(IscsiLun *iscsilun, int64_t offset, in iscsi_allocmap_set_unallocated() argument
546 iscsi_allocmap_update(iscsilun, offset, bytes, false, true); in iscsi_allocmap_set_unallocated()
549 static void iscsi_allocmap_set_invalid(IscsiLun *iscsilun, int64_t offset, in iscsi_allocmap_set_invalid() argument
552 iscsi_allocmap_update(iscsilun, offset, bytes, false, false); in iscsi_allocmap_set_invalid()
555 static void iscsi_allocmap_invalidate(IscsiLun *iscsilun) in iscsi_allocmap_invalidate() argument
557 if (iscsilun->allocmap) { in iscsi_allocmap_invalidate()
558 bitmap_zero(iscsilun->allocmap, iscsilun->allocmap_size); in iscsi_allocmap_invalidate()
560 if (iscsilun->allocmap_valid) { in iscsi_allocmap_invalidate()
561 bitmap_zero(iscsilun->allocmap_valid, iscsilun->allocmap_size); in iscsi_allocmap_invalidate()
566 iscsi_allocmap_is_allocated(IscsiLun *iscsilun, int64_t offset, in iscsi_allocmap_is_allocated() argument
570 if (iscsilun->allocmap == NULL) { in iscsi_allocmap_is_allocated()
573 assert(iscsilun->cluster_size); in iscsi_allocmap_is_allocated()
574 size = DIV_ROUND_UP(offset + bytes, iscsilun->cluster_size); in iscsi_allocmap_is_allocated()
575 return !(find_next_bit(iscsilun->allocmap, size, in iscsi_allocmap_is_allocated()
576 offset / iscsilun->cluster_size) == size); in iscsi_allocmap_is_allocated()
579 static inline bool iscsi_allocmap_is_valid(IscsiLun *iscsilun, in iscsi_allocmap_is_valid() argument
583 if (iscsilun->allocmap_valid == NULL) { in iscsi_allocmap_is_valid()
586 assert(iscsilun->cluster_size); in iscsi_allocmap_is_valid()
587 size = DIV_ROUND_UP(offset + bytes, iscsilun->cluster_size); in iscsi_allocmap_is_valid()
588 return (find_next_zero_bit(iscsilun->allocmap_valid, size, in iscsi_allocmap_is_valid()
589 offset / iscsilun->cluster_size) == size); in iscsi_allocmap_is_valid()
593 IscsiLun *iscsilun) in iscsi_co_wait_for_task() argument
596 iscsi_set_events(iscsilun); in iscsi_co_wait_for_task()
597 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_co_wait_for_task()
599 qemu_mutex_lock(&iscsilun->mutex); in iscsi_co_wait_for_task()
607 IscsiLun *iscsilun = bs->opaque; in iscsi_co_writev() local
615 assert(iscsilun->dpofua); in iscsi_co_writev()
617 if (!is_sector_request_lun_aligned(sector_num, nb_sectors, iscsilun)) { in iscsi_co_writev()
625 lba = sector_qemu2lun(sector_num, iscsilun); in iscsi_co_writev()
626 num_sectors = sector_qemu2lun(nb_sectors, iscsilun); in iscsi_co_writev()
627 iscsi_co_init_iscsitask(iscsilun, &iTask); in iscsi_co_writev()
628 qemu_mutex_lock(&iscsilun->mutex); in iscsi_co_writev()
630 if (iscsilun->use_16_for_rw) { in iscsi_co_writev()
632 iTask.task = iscsi_write16_iov_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_writev()
633 NULL, num_sectors * iscsilun->block_size, in iscsi_co_writev()
634 iscsilun->block_size, 0, 0, fua, 0, 0, in iscsi_co_writev()
638 iTask.task = iscsi_write10_iov_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_writev()
639 NULL, num_sectors * iscsilun->block_size, in iscsi_co_writev()
640 iscsilun->block_size, 0, 0, fua, 0, 0, in iscsi_co_writev()
645 iTask.task = iscsi_write16_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_writev()
646 NULL, num_sectors * iscsilun->block_size, in iscsi_co_writev()
647 iscsilun->block_size, 0, 0, fua, 0, 0, in iscsi_co_writev()
650 iTask.task = iscsi_write10_task(iscsilun->iscsi, iscsilun->lun, lba,
651 NULL, num_sectors * iscsilun->block_size,
652 iscsilun->block_size, 0, 0, fua, 0, 0,
657 qemu_mutex_unlock(&iscsilun->mutex);
664 iscsi_co_wait_for_task(&iTask, iscsilun);
677 iscsi_allocmap_set_invalid(iscsilun, sector_num * BDRV_SECTOR_SIZE,
685 iscsi_allocmap_set_allocated(iscsilun, sector_num * BDRV_SECTOR_SIZE,
689 qemu_mutex_unlock(&iscsilun->mutex);
702 IscsiLun *iscsilun = bs->opaque; in iscsi_co_block_status() local
709 iscsi_co_init_iscsitask(iscsilun, &iTask); in iscsi_co_block_status()
711 assert(QEMU_IS_ALIGNED(offset | bytes, iscsilun->block_size)); in iscsi_co_block_status()
721 if (!iscsilun->lbpme) { in iscsi_co_block_status()
725 lba = offset / iscsilun->block_size; in iscsi_co_block_status()
726 max_bytes = (iscsilun->num_blocks - lba) * iscsilun->block_size; in iscsi_co_block_status()
728 qemu_mutex_lock(&iscsilun->mutex); in iscsi_co_block_status()
730 if (iscsi_get_lba_status_task(iscsilun->iscsi, iscsilun->lun, in iscsi_co_block_status()
736 iscsi_co_wait_for_task(&iTask, iscsilun); in iscsi_co_block_status()
770 *pnum = MIN((int64_t) lbasd->num_blocks * iscsilun->block_size, max_bytes); in iscsi_co_block_status()
775 if (iscsilun->lbprz) { in iscsi_co_block_status()
781 iscsi_allocmap_set_unallocated(iscsilun, offset, *pnum); in iscsi_co_block_status()
783 iscsi_allocmap_set_allocated(iscsilun, offset, *pnum); in iscsi_co_block_status()
787 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_co_block_status()
803 IscsiLun *iscsilun = bs->opaque; in iscsi_co_readv() local
809 if (!is_sector_request_lun_aligned(sector_num, nb_sectors, iscsilun)) { in iscsi_co_readv()
820 if (iscsi_allocmap_is_valid(iscsilun, sector_num * BDRV_SECTOR_SIZE, in iscsi_co_readv()
822 !iscsi_allocmap_is_allocated(iscsilun, sector_num * BDRV_SECTOR_SIZE, in iscsi_co_readv()
829 !iscsi_allocmap_is_valid(iscsilun, sector_num * BDRV_SECTOR_SIZE, in iscsi_co_readv()
831 !iscsi_allocmap_is_allocated(iscsilun, sector_num * BDRV_SECTOR_SIZE, in iscsi_co_readv()
839 assert(iscsilun->cluster_size); in iscsi_co_readv()
840 head = (sector_num * BDRV_SECTOR_SIZE) % iscsilun->cluster_size; in iscsi_co_readv()
856 lba = sector_qemu2lun(sector_num, iscsilun); in iscsi_co_readv()
857 num_sectors = sector_qemu2lun(nb_sectors, iscsilun); in iscsi_co_readv()
859 iscsi_co_init_iscsitask(iscsilun, &iTask); in iscsi_co_readv()
860 qemu_mutex_lock(&iscsilun->mutex); in iscsi_co_readv()
862 if (iscsilun->use_16_for_rw) { in iscsi_co_readv()
864 iTask.task = iscsi_read16_iov_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_readv()
865 num_sectors * iscsilun->block_size, in iscsi_co_readv()
866 iscsilun->block_size, 0, 0, 0, 0, 0, in iscsi_co_readv()
870 iTask.task = iscsi_read10_iov_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_readv()
871 num_sectors * iscsilun->block_size, in iscsi_co_readv()
872 iscsilun->block_size, in iscsi_co_readv()
878 iTask.task = iscsi_read16_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_readv()
879 num_sectors * iscsilun->block_size, in iscsi_co_readv()
880 iscsilun->block_size, 0, 0, 0, 0, 0, in iscsi_co_readv()
883 iTask.task = iscsi_read10_task(iscsilun->iscsi, iscsilun->lun, lba,
884 num_sectors * iscsilun->block_size,
885 iscsilun->block_size,
891 qemu_mutex_unlock(&iscsilun->mutex);
898 iscsi_co_wait_for_task(&iTask, iscsilun);
915 qemu_mutex_unlock(&iscsilun->mutex);
922 IscsiLun *iscsilun = bs->opaque; in iscsi_co_flush() local
926 iscsi_co_init_iscsitask(iscsilun, &iTask); in iscsi_co_flush()
927 qemu_mutex_lock(&iscsilun->mutex); in iscsi_co_flush()
929 if (iscsi_synchronizecache10_task(iscsilun->iscsi, iscsilun->lun, 0, 0, 0, in iscsi_co_flush()
931 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_co_flush()
935 iscsi_co_wait_for_task(&iTask, iscsilun); in iscsi_co_flush()
952 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_co_flush()
1012 IscsiLun *iscsilun = bs->opaque; in iscsi_ioctl_handle_emulated() local
1020 ((struct sg_scsi_id *)buf)->scsi_type = iscsilun->type; in iscsi_ioctl_handle_emulated()
1036 IscsiLun *iscsilun = bs->opaque; in iscsi_aio_ioctl() local
1037 struct iscsi_context *iscsi = iscsilun->iscsi; in iscsi_aio_ioctl()
1043 acb->iscsilun = iscsilun; in iscsi_aio_ioctl()
1088 qemu_mutex_lock(&iscsilun->mutex); in iscsi_aio_ioctl()
1100 if (iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task, in iscsi_aio_ioctl()
1104 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_aio_ioctl()
1123 iscsi_set_events(iscsilun); in iscsi_aio_ioctl()
1124 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_aio_ioctl()
1134 IscsiLun *iscsilun = bs->opaque; in iscsi_co_getlength() local
1137 len = iscsilun->num_blocks; in iscsi_co_getlength()
1138 len *= iscsilun->block_size; in iscsi_co_getlength()
1147 IscsiLun *iscsilun = bs->opaque; in iscsi_co_pdiscard() local
1152 if (!is_byte_request_lun_aligned(offset, bytes, iscsilun)) { in iscsi_co_pdiscard()
1156 if (!iscsilun->lbp.lbpu) { in iscsi_co_pdiscard()
1165 assert(bytes / iscsilun->block_size <= UINT32_MAX); in iscsi_co_pdiscard()
1167 list.lba = offset / iscsilun->block_size; in iscsi_co_pdiscard()
1168 list.num = bytes / iscsilun->block_size; in iscsi_co_pdiscard()
1170 iscsi_co_init_iscsitask(iscsilun, &iTask); in iscsi_co_pdiscard()
1171 qemu_mutex_lock(&iscsilun->mutex); in iscsi_co_pdiscard()
1173 if (iscsi_unmap_task(iscsilun->iscsi, iscsilun->lun, 0, 0, &list, 1, in iscsi_co_pdiscard()
1179 iscsi_co_wait_for_task(&iTask, iscsilun); in iscsi_co_pdiscard()
1191 iscsi_allocmap_set_invalid(iscsilun, offset, bytes); in iscsi_co_pdiscard()
1208 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_co_pdiscard()
1217 IscsiLun *iscsilun = bs->opaque; in iscsi_co_pwrite_zeroes() local
1221 bool use_16_for_ws = iscsilun->use_16_for_rw; in iscsi_co_pwrite_zeroes()
1224 if (!is_byte_request_lun_aligned(offset, bytes, iscsilun)) { in iscsi_co_pwrite_zeroes()
1229 if (!use_16_for_ws && !iscsilun->lbp.lbpws10) { in iscsi_co_pwrite_zeroes()
1233 if (use_16_for_ws && !iscsilun->lbp.lbpws) { in iscsi_co_pwrite_zeroes()
1237 use_16_for_ws = iscsilun->use_16_for_rw; in iscsi_co_pwrite_zeroes()
1241 if (!(flags & BDRV_REQ_MAY_UNMAP) && !iscsilun->has_write_same) { in iscsi_co_pwrite_zeroes()
1246 lba = offset / iscsilun->block_size; in iscsi_co_pwrite_zeroes()
1247 nb_blocks = bytes / iscsilun->block_size; in iscsi_co_pwrite_zeroes()
1249 if (iscsilun->zeroblock == NULL) { in iscsi_co_pwrite_zeroes()
1250 iscsilun->zeroblock = g_try_malloc0(iscsilun->block_size); in iscsi_co_pwrite_zeroes()
1251 if (iscsilun->zeroblock == NULL) { in iscsi_co_pwrite_zeroes()
1256 qemu_mutex_lock(&iscsilun->mutex); in iscsi_co_pwrite_zeroes()
1257 iscsi_co_init_iscsitask(iscsilun, &iTask); in iscsi_co_pwrite_zeroes()
1265 iTask.task = iscsi_writesame16_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_pwrite_zeroes()
1266 iscsilun->zeroblock, iscsilun->block_size, in iscsi_co_pwrite_zeroes()
1275 iTask.task = iscsi_writesame10_task(iscsilun->iscsi, iscsilun->lun, lba, in iscsi_co_pwrite_zeroes()
1276 iscsilun->zeroblock, iscsilun->block_size, in iscsi_co_pwrite_zeroes()
1281 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_co_pwrite_zeroes()
1285 iscsi_co_wait_for_task(&iTask, iscsilun); in iscsi_co_pwrite_zeroes()
1292 iscsilun->has_write_same = false; in iscsi_co_pwrite_zeroes()
1309 iscsi_allocmap_set_invalid(iscsilun, offset, bytes); in iscsi_co_pwrite_zeroes()
1317 iscsi_allocmap_set_invalid(iscsilun, offset, bytes); in iscsi_co_pwrite_zeroes()
1319 iscsi_allocmap_set_allocated(iscsilun, offset, bytes); in iscsi_co_pwrite_zeroes()
1323 qemu_mutex_unlock(&iscsilun->mutex); in iscsi_co_pwrite_zeroes()
1415 IscsiLun *iscsilun = opaque; in iscsi_nop_timed_event() local
1417 QEMU_LOCK_GUARD(&iscsilun->mutex); in iscsi_nop_timed_event()
1418 if (iscsi_get_nops_in_flight(iscsilun->iscsi) >= MAX_NOP_FAILURES) { in iscsi_nop_timed_event()
1420 iscsilun->request_timed_out = true; in iscsi_nop_timed_event()
1421 } else if (iscsi_nop_out_async(iscsilun->iscsi, NULL, NULL, 0, NULL) != 0) { in iscsi_nop_timed_event()
1426 timer_mod(iscsilun->nop_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + NOP_INTERVAL); in iscsi_nop_timed_event()
1427 iscsi_set_events(iscsilun); in iscsi_nop_timed_event()
1430 static void iscsi_readcapacity_sync(IscsiLun *iscsilun, Error **errp) in iscsi_readcapacity_sync() argument
1443 switch (iscsilun->type) { in iscsi_readcapacity_sync()
1445 task = iscsi_readcapacity16_sync(iscsilun->iscsi, iscsilun->lun); in iscsi_readcapacity_sync()
1451 iscsilun->block_size = rc16->block_length; in iscsi_readcapacity_sync()
1452 iscsilun->num_blocks = rc16->returned_lba + 1; in iscsi_readcapacity_sync()
1453 iscsilun->lbpme = !!rc16->lbpme; in iscsi_readcapacity_sync()
1454 iscsilun->lbprz = !!rc16->lbprz; in iscsi_readcapacity_sync()
1455 iscsilun->use_16_for_rw = (rc16->returned_lba > 0xffffffff); in iscsi_readcapacity_sync()
1465 task = iscsi_readcapacity10_sync(iscsilun->iscsi, iscsilun->lun, 0, 0); in iscsi_readcapacity_sync()
1471 iscsilun->block_size = rc10->block_size; in iscsi_readcapacity_sync()
1474 iscsilun->num_blocks = 0; in iscsi_readcapacity_sync()
1476 iscsilun->num_blocks = rc10->lba + 1; in iscsi_readcapacity_sync()
1490 } else if (!iscsilun->block_size || in iscsi_readcapacity_sync()
1491 iscsilun->block_size % BDRV_SECTOR_SIZE) { in iscsi_readcapacity_sync()
1493 "block size of %d.", iscsilun->block_size); in iscsi_readcapacity_sync()
1540 IscsiLun *iscsilun = bs->opaque; in iscsi_detach_aio_context() local
1542 aio_set_fd_handler(iscsilun->aio_context, iscsi_get_fd(iscsilun->iscsi), in iscsi_detach_aio_context()
1544 iscsilun->events = 0; in iscsi_detach_aio_context()
1546 if (iscsilun->nop_timer) { in iscsi_detach_aio_context()
1547 timer_free(iscsilun->nop_timer); in iscsi_detach_aio_context()
1548 iscsilun->nop_timer = NULL; in iscsi_detach_aio_context()
1550 if (iscsilun->event_timer) { in iscsi_detach_aio_context()
1551 timer_free(iscsilun->event_timer); in iscsi_detach_aio_context()
1552 iscsilun->event_timer = NULL; in iscsi_detach_aio_context()
1559 IscsiLun *iscsilun = bs->opaque; in iscsi_attach_aio_context() local
1561 iscsilun->aio_context = new_context; in iscsi_attach_aio_context()
1562 iscsi_set_events(iscsilun); in iscsi_attach_aio_context()
1565 iscsilun->nop_timer = aio_timer_new(iscsilun->aio_context, in iscsi_attach_aio_context()
1567 iscsi_nop_timed_event, iscsilun); in iscsi_attach_aio_context()
1568 timer_mod(iscsilun->nop_timer, in iscsi_attach_aio_context()
1573 iscsilun->event_timer = aio_timer_new(iscsilun->aio_context, in iscsi_attach_aio_context()
1575 iscsi_timed_check_events, iscsilun); in iscsi_attach_aio_context()
1576 timer_mod(iscsilun->event_timer, in iscsi_attach_aio_context()
1580 static void iscsi_modesense_sync(IscsiLun *iscsilun) in iscsi_modesense_sync() argument
1584 iscsilun->write_protected = false; in iscsi_modesense_sync()
1585 iscsilun->dpofua = false; in iscsi_modesense_sync()
1587 task = iscsi_modesense6_sync(iscsilun->iscsi, iscsilun->lun, in iscsi_modesense_sync()
1592 iscsi_get_error(iscsilun->iscsi)); in iscsi_modesense_sync()
1603 iscsi_get_error(iscsilun->iscsi)); in iscsi_modesense_sync()
1606 iscsilun->write_protected = ms->device_specific_parameter & 0x80; in iscsi_modesense_sync()
1607 iscsilun->dpofua = ms->device_specific_parameter & 0x10; in iscsi_modesense_sync()
1798 IscsiLun *iscsilun = bs->opaque; in iscsi_open() local
1843 memset(iscsilun, 0, sizeof(IscsiLun)); in iscsi_open()
1905 iscsilun->iscsi = iscsi; in iscsi_open()
1906 iscsilun->aio_context = bdrv_get_aio_context(bs); in iscsi_open()
1907 iscsilun->lun = lun; in iscsi_open()
1908 iscsilun->has_write_same = true; in iscsi_open()
1910 task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 0, 0, in iscsi_open()
1916 iscsilun->type = inq->periperal_device_type; in iscsi_open()
1920 iscsi_modesense_sync(iscsilun); in iscsi_open()
1921 if (iscsilun->dpofua) { in iscsi_open()
1926 if (iscsilun->type == TYPE_DISK && (flags & BDRV_O_RDWR) && in iscsi_open()
1927 iscsilun->write_protected) { in iscsi_open()
1937 iscsi_readcapacity_sync(iscsilun, &local_err); in iscsi_open()
1943 bs->total_sectors = sector_lun2qemu(iscsilun->num_blocks, iscsilun); in iscsi_open()
1949 if (iscsilun->type != TYPE_DISK && iscsilun->type != TYPE_ROM) { in iscsi_open()
1953 task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 1, in iscsi_open()
1967 inq_task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 1, in iscsi_open()
1974 memcpy(&iscsilun->lbp, inq_lbp, in iscsi_open()
1979 inq_task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 1, in iscsi_open()
1986 memcpy(&iscsilun->bl, inq_bl, in iscsi_open()
1991 inq_task = iscsi_do_inquiry(iscsilun->iscsi, iscsilun->lun, 1, in iscsi_open()
1998 iscsi_save_designator(iscsilun, inq_di); in iscsi_open()
2008 qemu_mutex_init(&iscsilun->mutex); in iscsi_open()
2009 iscsi_attach_aio_context(bs, iscsilun->aio_context); in iscsi_open()
2014 if (iscsilun->bl.opt_unmap_gran * iscsilun->block_size >= 4 * 1024 && in iscsi_open()
2015 iscsilun->bl.opt_unmap_gran * iscsilun->block_size <= 16 * 1024 * 1024) { in iscsi_open()
2016 iscsilun->cluster_size = iscsilun->bl.opt_unmap_gran * in iscsi_open()
2017 iscsilun->block_size; in iscsi_open()
2018 if (iscsilun->lbprz) { in iscsi_open()
2019 ret = iscsi_allocmap_init(iscsilun, flags); in iscsi_open()
2023 if (iscsilun->lbprz && iscsilun->lbp.lbpws) { in iscsi_open()
2041 memset(iscsilun, 0, sizeof(IscsiLun)); in iscsi_open()
2049 IscsiLun *iscsilun = bs->opaque; in iscsi_close() local
2050 struct iscsi_context *iscsi = iscsilun->iscsi; in iscsi_close()
2057 if (iscsilun->dd) { in iscsi_close()
2058 g_free(iscsilun->dd->designator); in iscsi_close()
2059 g_free(iscsilun->dd); in iscsi_close()
2061 g_free(iscsilun->zeroblock); in iscsi_close()
2062 iscsi_allocmap_free(iscsilun); in iscsi_close()
2063 qemu_mutex_destroy(&iscsilun->mutex); in iscsi_close()
2064 memset(iscsilun, 0, sizeof(IscsiLun)); in iscsi_close()
2072 IscsiLun *iscsilun = bs->opaque; in iscsi_refresh_limits() local
2073 uint64_t max_xfer_len = iscsilun->use_16_for_rw ? 0xffffffff : 0xffff; in iscsi_refresh_limits()
2074 unsigned int block_size = MAX(BDRV_SECTOR_SIZE, iscsilun->block_size); in iscsi_refresh_limits()
2076 assert(iscsilun->block_size >= BDRV_SECTOR_SIZE || bdrv_is_sg(bs)); in iscsi_refresh_limits()
2080 if (iscsilun->bl.max_xfer_len) { in iscsi_refresh_limits()
2081 max_xfer_len = MIN(max_xfer_len, iscsilun->bl.max_xfer_len); in iscsi_refresh_limits()
2085 bs->bl.max_transfer = max_xfer_len * iscsilun->block_size; in iscsi_refresh_limits()
2088 if (iscsilun->lbp.lbpu) { in iscsi_refresh_limits()
2090 MIN_NON_ZERO(iscsilun->bl.max_unmap * iscsilun->block_size, in iscsi_refresh_limits()
2091 (uint64_t)UINT32_MAX * iscsilun->block_size); in iscsi_refresh_limits()
2093 iscsilun->bl.opt_unmap_gran * iscsilun->block_size; in iscsi_refresh_limits()
2095 bs->bl.pdiscard_alignment = iscsilun->block_size; in iscsi_refresh_limits()
2099 MIN_NON_ZERO(iscsilun->bl.max_ws_len * iscsilun->block_size, in iscsi_refresh_limits()
2100 max_xfer_len * iscsilun->block_size); in iscsi_refresh_limits()
2102 if (iscsilun->lbp.lbpws) { in iscsi_refresh_limits()
2104 iscsilun->bl.opt_unmap_gran * iscsilun->block_size; in iscsi_refresh_limits()
2106 bs->bl.pwrite_zeroes_alignment = iscsilun->block_size; in iscsi_refresh_limits()
2108 if (iscsilun->bl.opt_xfer_len && in iscsi_refresh_limits()
2109 iscsilun->bl.opt_xfer_len < INT_MAX / block_size) { in iscsi_refresh_limits()
2110 bs->bl.opt_transfer = pow2floor(iscsilun->bl.opt_xfer_len * in iscsi_refresh_limits()
2111 iscsilun->block_size); in iscsi_refresh_limits()
2120 IscsiLun *iscsilun = state->bs->opaque; in iscsi_reopen_prepare() local
2122 if (state->flags & BDRV_O_RDWR && iscsilun->write_protected) { in iscsi_reopen_prepare()
2131 IscsiLun *iscsilun = reopen_state->bs->opaque; in iscsi_reopen_commit() local
2134 if (iscsilun->allocmap != NULL) { in iscsi_reopen_commit()
2135 iscsi_allocmap_init(iscsilun, reopen_state->flags); in iscsi_reopen_commit()
2143 IscsiLun *iscsilun = bs->opaque; in iscsi_co_truncate() local
2153 if (iscsilun->type != TYPE_DISK) { in iscsi_co_truncate()
2158 iscsi_readcapacity_sync(iscsilun, &local_err); in iscsi_co_truncate()
2173 if (iscsilun->allocmap != NULL) { in iscsi_co_truncate()
2174 iscsi_allocmap_init(iscsilun, bs->open_flags); in iscsi_co_truncate()
2183 IscsiLun *iscsilun = bs->opaque; in iscsi_co_get_info() local
2184 bdi->cluster_size = iscsilun->cluster_size; in iscsi_co_get_info()
2191 IscsiLun *iscsilun = bs->opaque; in iscsi_co_invalidate_cache() local
2192 iscsi_allocmap_invalidate(iscsilun); in iscsi_co_invalidate_cache()