Lines Matching refs:io

78 #define PRIV(io)	\  argument
79 ((struct ctl_ptr_len_flags *)&(io)->io_hdr.ctl_private[CTL_PRIV_BACKEND])
80 #define ARGS(io) \ argument
81 ((struct ctl_lba_len_flags *)&(io)->io_hdr.ctl_private[CTL_PRIV_LBA_LEN])
140 static int ctl_backend_ramdisk_move_done(union ctl_io *io, bool samethr);
141 static void ctl_backend_ramdisk_compare(union ctl_io *io);
142 static void ctl_backend_ramdisk_rw(union ctl_io *io);
143 static int ctl_backend_ramdisk_submit(union ctl_io *io);
145 static int ctl_backend_ramdisk_config_read(union ctl_io *io);
146 static int ctl_backend_ramdisk_config_write(union ctl_io *io);
364 ctl_backend_ramdisk_cmp(union ctl_io *io) in ctl_backend_ramdisk_cmp() argument
366 struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io); in ctl_backend_ramdisk_cmp()
373 lbas = io->scsiio.kern_data_len / cbe_lun->blocksize; in ctl_backend_ramdisk_cmp()
374 lba = ARGS(io)->lba + PRIV(io)->len - lbas; in ctl_backend_ramdisk_cmp()
381 res = cmp(io->scsiio.kern_data_ptr + off, page, in ctl_backend_ramdisk_cmp()
387 free(io->scsiio.kern_data_ptr, M_RAMDISK); in ctl_backend_ramdisk_cmp()
389 off += io->scsiio.kern_rel_offset - io->scsiio.kern_data_len; in ctl_backend_ramdisk_cmp()
391 ctl_set_sense(&io->scsiio, /*current_error*/ 1, in ctl_backend_ramdisk_cmp()
403 ctl_backend_ramdisk_move_done(union ctl_io *io, bool samethr) in ctl_backend_ramdisk_move_done() argument
406 (struct ctl_be_ramdisk_lun *)CTL_BACKEND_LUN(io); in ctl_backend_ramdisk_move_done()
409 if (io->scsiio.kern_sg_entries > 0) in ctl_backend_ramdisk_move_done()
410 free(io->scsiio.kern_data_ptr, M_RAMDISK); in ctl_backend_ramdisk_move_done()
411 io->scsiio.kern_rel_offset += io->scsiio.kern_data_len; in ctl_backend_ramdisk_move_done()
412 if ((io->io_hdr.flags & CTL_FLAG_ABORT) == 0 && in ctl_backend_ramdisk_move_done()
413 (io->io_hdr.status & CTL_STATUS_MASK) == CTL_STATUS_NONE) { in ctl_backend_ramdisk_move_done()
414 if (ARGS(io)->flags & CTL_LLF_COMPARE) { in ctl_backend_ramdisk_move_done()
416 if (ctl_backend_ramdisk_cmp(io)) in ctl_backend_ramdisk_move_done()
419 if (ARGS(io)->len > PRIV(io)->len) { in ctl_backend_ramdisk_move_done()
422 &io->io_hdr, links); in ctl_backend_ramdisk_move_done()
428 ctl_set_success(&io->scsiio); in ctl_backend_ramdisk_move_done()
431 ctl_data_submit_done(io); in ctl_backend_ramdisk_move_done()
436 ctl_backend_ramdisk_compare(union ctl_io *io) in ctl_backend_ramdisk_compare() argument
438 struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io); in ctl_backend_ramdisk_compare()
441 lbas = ARGS(io)->len - PRIV(io)->len; in ctl_backend_ramdisk_compare()
445 io->scsiio.be_move_done = ctl_backend_ramdisk_move_done; in ctl_backend_ramdisk_compare()
446 io->scsiio.kern_data_ptr = malloc(len, M_RAMDISK, M_WAITOK); in ctl_backend_ramdisk_compare()
447 io->scsiio.kern_data_len = len; in ctl_backend_ramdisk_compare()
448 io->scsiio.kern_sg_entries = 0; in ctl_backend_ramdisk_compare()
449 io->io_hdr.flags |= CTL_FLAG_ALLOCATED; in ctl_backend_ramdisk_compare()
450 PRIV(io)->len += lbas; in ctl_backend_ramdisk_compare()
451 ctl_datamove(io); in ctl_backend_ramdisk_compare()
455 ctl_backend_ramdisk_rw(union ctl_io *io) in ctl_backend_ramdisk_rw() argument
457 struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io); in ctl_backend_ramdisk_rw()
465 lba = ARGS(io)->lba + PRIV(io)->len; in ctl_backend_ramdisk_rw()
467 lbas = ARGS(io)->len - PRIV(io)->len; in ctl_backend_ramdisk_rw()
471 op = (ARGS(io)->flags & CTL_LLF_WRITE) ? GP_WRITE : GP_READ; in ctl_backend_ramdisk_rw()
473 io->scsiio.kern_data_ptr = malloc(sizeof(struct ctl_sg_entry) * in ctl_backend_ramdisk_rw()
475 sg_entries = (struct ctl_sg_entry *)io->scsiio.kern_data_ptr; in ctl_backend_ramdisk_rw()
481 free(io->scsiio.kern_data_ptr, M_RAMDISK); in ctl_backend_ramdisk_rw()
483 ctl_set_space_alloc_fail(&io->scsiio); in ctl_backend_ramdisk_rw()
484 ctl_data_submit_done(io); in ctl_backend_ramdisk_rw()
498 io->scsiio.kern_data_ptr = page + off; in ctl_backend_ramdisk_rw()
501 io->scsiio.be_move_done = ctl_backend_ramdisk_move_done; in ctl_backend_ramdisk_rw()
502 io->scsiio.kern_data_len = lbas * cbe_lun->blocksize; in ctl_backend_ramdisk_rw()
503 io->scsiio.kern_sg_entries = sgs; in ctl_backend_ramdisk_rw()
504 io->io_hdr.flags |= CTL_FLAG_ALLOCATED; in ctl_backend_ramdisk_rw()
505 PRIV(io)->len += lbas; in ctl_backend_ramdisk_rw()
506 if ((ARGS(io)->flags & CTL_LLF_READ) && in ctl_backend_ramdisk_rw()
507 ARGS(io)->len <= PRIV(io)->len) { in ctl_backend_ramdisk_rw()
508 ctl_set_success(&io->scsiio); in ctl_backend_ramdisk_rw()
510 ctl_serseq_done(io); in ctl_backend_ramdisk_rw()
512 ctl_datamove(io); in ctl_backend_ramdisk_rw()
516 ctl_backend_ramdisk_submit(union ctl_io *io) in ctl_backend_ramdisk_submit() argument
518 struct ctl_lba_len_flags *lbalen = ARGS(io); in ctl_backend_ramdisk_submit()
521 ctl_set_success(&io->scsiio); in ctl_backend_ramdisk_submit()
522 ctl_data_submit_done(io); in ctl_backend_ramdisk_submit()
525 PRIV(io)->len = 0; in ctl_backend_ramdisk_submit()
527 ctl_backend_ramdisk_compare(io); in ctl_backend_ramdisk_submit()
529 ctl_backend_ramdisk_rw(io); in ctl_backend_ramdisk_submit()
537 union ctl_io *io; in ctl_backend_ramdisk_worker() local
542 io = (union ctl_io *)STAILQ_FIRST(&be_lun->cont_queue); in ctl_backend_ramdisk_worker()
543 if (io != NULL) { in ctl_backend_ramdisk_worker()
546 if (ARGS(io)->flags & CTL_LLF_COMPARE) in ctl_backend_ramdisk_worker()
547 ctl_backend_ramdisk_compare(io); in ctl_backend_ramdisk_worker()
549 ctl_backend_ramdisk_rw(io); in ctl_backend_ramdisk_worker()
564 ctl_backend_ramdisk_gls(union ctl_io *io) in ctl_backend_ramdisk_gls() argument
566 struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io); in ctl_backend_ramdisk_gls()
572 data = (struct scsi_get_lba_status_data *)io->scsiio.kern_data_ptr; in ctl_backend_ramdisk_gls()
573 scsi_u64to8b(ARGS(io)->lba, data->descr[0].addr); in ctl_backend_ramdisk_gls()
574 lbaoff = ARGS(io)->lba & ~(UINT_MAX << cbe_lun->pblockexp); in ctl_backend_ramdisk_gls()
577 ARGS(io)->lba >> cbe_lun->pblockexp, GP_OTHER); in ctl_backend_ramdisk_gls()
584 ctl_config_read_done(io); in ctl_backend_ramdisk_gls()
589 ctl_backend_ramdisk_config_read(union ctl_io *io) in ctl_backend_ramdisk_config_read() argument
593 switch (io->scsiio.cdb[0]) { in ctl_backend_ramdisk_config_read()
595 if (io->scsiio.cdb[1] == SGLS_SERVICE_ACTION) { in ctl_backend_ramdisk_config_read()
596 retval = ctl_backend_ramdisk_gls(io); in ctl_backend_ramdisk_config_read()
599 ctl_set_invalid_field(&io->scsiio, in ctl_backend_ramdisk_config_read()
605 ctl_config_read_done(io); in ctl_backend_ramdisk_config_read()
609 ctl_set_invalid_opcode(&io->scsiio); in ctl_backend_ramdisk_config_read()
610 ctl_config_read_done(io); in ctl_backend_ramdisk_config_read()
660 ctl_backend_ramdisk_ws(union ctl_io *io) in ctl_backend_ramdisk_ws() argument
662 struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io); in ctl_backend_ramdisk_ws()
664 struct ctl_lba_len_flags *lbalen = ARGS(io); in ctl_backend_ramdisk_ws()
670 ctl_set_invalid_field(&io->scsiio, in ctl_backend_ramdisk_ws()
676 ctl_config_write_done(io); in ctl_backend_ramdisk_ws()
682 ctl_set_success(&io->scsiio); in ctl_backend_ramdisk_ws()
683 ctl_config_write_done(io); in ctl_backend_ramdisk_ws()
691 ctl_set_space_alloc_fail(&io->scsiio); in ctl_backend_ramdisk_ws()
692 ctl_data_submit_done(io); in ctl_backend_ramdisk_ws()
700 memcpy(page, io->scsiio.kern_data_ptr, in ctl_backend_ramdisk_ws()
706 ctl_set_success(&io->scsiio); in ctl_backend_ramdisk_ws()
707 ctl_config_write_done(io); in ctl_backend_ramdisk_ws()
711 ctl_backend_ramdisk_unmap(union ctl_io *io) in ctl_backend_ramdisk_unmap() argument
713 struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io); in ctl_backend_ramdisk_unmap()
714 struct ctl_ptr_len_flags *ptrlen = (struct ctl_ptr_len_flags *)ARGS(io); in ctl_backend_ramdisk_unmap()
718 ctl_set_invalid_field(&io->scsiio, in ctl_backend_ramdisk_unmap()
724 ctl_config_write_done(io); in ctl_backend_ramdisk_unmap()
736 ctl_set_success(&io->scsiio); in ctl_backend_ramdisk_unmap()
737 ctl_config_write_done(io); in ctl_backend_ramdisk_unmap()
741 ctl_backend_ramdisk_config_write(union ctl_io *io) in ctl_backend_ramdisk_config_write() argument
743 struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io); in ctl_backend_ramdisk_config_write()
746 switch (io->scsiio.cdb[0]) { in ctl_backend_ramdisk_config_write()
750 ctl_set_success(&io->scsiio); in ctl_backend_ramdisk_config_write()
751 ctl_config_write_done(io); in ctl_backend_ramdisk_config_write()
756 cdb = (struct scsi_start_stop_unit *)io->scsiio.cdb; in ctl_backend_ramdisk_config_write()
758 ctl_set_success(&io->scsiio); in ctl_backend_ramdisk_config_write()
759 ctl_config_write_done(io); in ctl_backend_ramdisk_config_write()
771 ctl_set_success(&io->scsiio); in ctl_backend_ramdisk_config_write()
772 ctl_config_write_done(io); in ctl_backend_ramdisk_config_write()
776 ctl_set_success(&io->scsiio); in ctl_backend_ramdisk_config_write()
777 ctl_config_write_done(io); in ctl_backend_ramdisk_config_write()
781 ctl_backend_ramdisk_ws(io); in ctl_backend_ramdisk_config_write()
784 ctl_backend_ramdisk_unmap(io); in ctl_backend_ramdisk_config_write()
787 ctl_set_invalid_opcode(&io->scsiio); in ctl_backend_ramdisk_config_write()
788 ctl_config_write_done(io); in ctl_backend_ramdisk_config_write()