Lines Matching defs:io

118 #define PRIV(io)	\
119 ((struct ctl_ptr_len_flags *)&(io)->io_hdr.ctl_private[CTL_PRIV_BACKEND])
120 #define ARGS(io) \
121 ((struct ctl_lba_len_flags *)&(io)->io_hdr.ctl_private[CTL_PRIV_LBA_LEN])
122 #define DSM_RANGE(io) ((io)->io_hdr.ctl_private[CTL_PRIV_LBA_LEN].integer)
205 union ctl_io *io;
237 static int ctl_be_block_move_done(union ctl_io *io, bool samethr);
258 union ctl_io *io);
260 union ctl_io *io);
262 union ctl_io *io);
264 static int ctl_be_block_submit(union ctl_io *io);
281 static int ctl_be_block_config_write(union ctl_io *io);
282 static int ctl_be_block_config_read(union ctl_io *io);
382 union ctl_io *io = beio->io;
388 ctl_data_submit_done(io);
393 ctl_be_block_io_error(union ctl_io *io, int bio_cmd, uint16_t retry_count)
395 switch (io->io_hdr.io_type) {
399 ctl_set_internal_failure(&io->scsiio,
403 ctl_set_medium_error(&io->scsiio, bio_cmd == BIO_READ);
410 ctl_nvme_set_write_fault(&io->nvmeio);
413 ctl_nvme_set_unrecoverable_read_error(&io->nvmeio);
416 ctl_nvme_set_internal_error(&io->nvmeio);
438 ctl_be_block_compare(union ctl_io *io)
444 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
455 ctl_io_set_compare_failure(io, off);
457 ctl_io_set_success(io);
461 ctl_be_block_move_done(union ctl_io *io, bool samethr)
467 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
470 ctl_add_kern_rel_offset(io, ctl_kern_data_len(io));
475 if ((io->io_hdr.flags & CTL_FLAG_ABORT) == 0 &&
476 (io->io_hdr.status & CTL_STATUS_MASK) == CTL_STATUS_NONE) {
477 lbalen = ARGS(io);
479 ctl_io_set_success(io);
482 ctl_be_block_compare(io);
490 || ((io->io_hdr.flags & CTL_FLAG_ABORT) != 0)
491 || ((io->io_hdr.status & CTL_STATUS_MASK) != CTL_STATUS_NONE)) {
505 be_lun = (struct ctl_be_block_lun *)CTL_BACKEND_LUN(io);
510 STAILQ_INSERT_TAIL(&be_lun->datamove_queue, &io->io_hdr, links);
523 union ctl_io *io;
526 io = beio->io;
573 ctl_io_set_invalid_opcode(io);
575 ctl_io_set_space_alloc_fail(io);
577 ctl_io_set_hw_write_protected(io);
579 ctl_be_block_io_error(io, beio->bio_cmd,
593 || (ARGS(io)->flags & CTL_LLF_VERIFY)) {
594 ctl_io_set_success(io);
597 if ((ARGS(io)->flags & CTL_LLF_READ) &&
599 ctl_io_set_success(io);
601 ctl_serseq_done(io);
603 ctl_datamove(io);
611 union ctl_io *io = beio->io;
637 ctl_io_set_success(io);
639 ctl_be_block_io_error(io, BIO_FLUSH,
657 union ctl_io *io;
666 io = beio->io;
668 if (ARGS(io)->flags & CTL_LLF_DPO)
670 if (beio->bio_cmd == BIO_WRITE && ARGS(io)->flags & CTL_LLF_FUA)
701 ctl_serseq_done(io);
780 ctl_io_set_space_alloc_fail(io);
782 ctl_io_set_hw_write_protected(io);
784 ctl_be_block_io_error(io, beio->bio_cmd, 0);
795 (ARGS(io)->flags & CTL_LLF_VERIFY)) {
796 ctl_io_set_success(io);
799 if ((ARGS(io)->flags & CTL_LLF_READ) &&
801 ctl_io_set_success(io);
803 ctl_serseq_done(io);
805 ctl_datamove(io);
813 union ctl_io *io = beio->io;
814 struct ctl_lba_len_flags *lbalen = ARGS(io);
821 CTL_IO_ASSERT(io, SCSI);
841 data = (struct scsi_get_lba_status_data *)io->scsiio.kern_data_ptr;
883 union ctl_io *io;
890 io = beio->io;
903 &io->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
940 ctl_io_set_success(io);
944 ctl_io_set_space_alloc_fail(io);
948 ctl_io_set_hw_write_protected(io);
951 ctl_be_block_io_error(io, BIO_DELETE, 0);
961 union ctl_io *io;
970 io = beio->io;
972 if (ARGS(io)->flags & CTL_LLF_DPO)
974 if (beio->bio_cmd == BIO_WRITE && ARGS(io)->flags & CTL_LLF_FUA)
1005 ctl_serseq_done(io);
1030 ctl_io_set_space_alloc_fail(io);
1032 ctl_io_set_hw_write_protected(io);
1034 ctl_be_block_io_error(io, beio->bio_cmd, 0);
1045 (ARGS(io)->flags & CTL_LLF_VERIFY)) {
1046 ctl_io_set_success(io);
1049 if ((ARGS(io)->flags & CTL_LLF_READ) &&
1051 ctl_io_set_success(io);
1053 ctl_serseq_done(io);
1055 ctl_datamove(io);
1063 union ctl_io *io = beio->io;
1066 struct ctl_lba_len_flags *lbalen = ARGS(io);
1073 CTL_IO_ASSERT(io, SCSI);
1099 data = (struct scsi_get_lba_status_data *)io->scsiio.kern_data_ptr;
1199 union ctl_io *io;
1204 io = beio->io;
1213 ptrlen = (struct ctl_ptr_len_flags *)&io->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
1331 union ctl_io *io)
1336 nsdata = (struct nvme_namespace_data *)io->nvmeio.kern_data_ptr;
1349 ctl_config_read_done(io);
1354 union ctl_io *io)
1358 ctl_lun_nvme_ids(cbe_lun, io->nvmeio.kern_data_ptr);
1359 ctl_config_read_done(io);
1364 union ctl_io *io)
1371 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1372 lbalen = (struct ctl_lba_len_flags *)&io->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
1386 union ctl_io *io;
1388 io = beio->io;
1390 if ((io->io_hdr.flags & CTL_FLAG_ABORT) ||
1391 ((io->io_hdr.status & CTL_STATUS_MASK) != CTL_STATUS_NONE &&
1392 (io->io_hdr.status & CTL_STATUS_MASK) != CTL_SUCCESS)) {
1393 ctl_config_write_done(io);
1397 ctl_be_block_config_write(io);
1402 union ctl_io *io)
1415 CTL_IO_ASSERT(io, SCSI);
1417 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1418 lbalen = ARGS(io);
1423 ctl_set_invalid_field(&io->scsiio,
1429 ctl_config_write_done(io);
1483 memcpy(buf, io->scsiio.kern_data_ptr,
1507 union ctl_io *io)
1514 CTL_IO_ASSERT(io, SCSI);
1516 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1517 ptrlen = (struct ctl_ptr_len_flags *)&io->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
1521 ctl_set_invalid_field(&io->scsiio,
1527 ctl_config_write_done(io);
1541 union ctl_io *io)
1546 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1559 union ctl_io *io)
1565 CTL_IO_ASSERT(io, NVME);
1567 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1568 lbalen = ARGS(io);
1584 union ctl_io *io)
1596 CTL_IO_ASSERT(io, NVME);
1598 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1599 lbalen = ARGS(io);
1601 if ((le32toh(io->nvmeio.cmd.cdw12) & (1U << 25)) != 0 &&
1665 union ctl_io *io)
1674 CTL_IO_ASSERT(io, NVME);
1676 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1680 ctl_nvme_set_success(&io->nvmeio);
1681 ctl_config_write_done(io);
1685 ranges = le32toh(io->nvmeio.cmd.cdw10) & 0xff;
1686 r = (struct nvme_dsm_range *)io->nvmeio.kern_data_ptr;
1689 for (i = DSM_RANGE(io); i < ranges; i++) {
1697 ctl_nvme_set_success(&io->nvmeio);
1698 ctl_config_write_done(io);
1704 DSM_RANGE(io) = i + 1;
1722 union ctl_io *io;
1724 io = beio->io;
1726 ctl_config_read_done(io);
1731 union ctl_io *io)
1740 beio->io = io;
1743 PRIV(io)->ptr = (void *)beio;
1745 switch (io->scsiio.cdb[0]) {
1757 panic("Unhandled CDB type %#x", io->scsiio.cdb[0]);
1764 union ctl_io *io)
1770 MPASS(io->nvmeio.cmd.opc == NVME_OPC_IDENTIFY);
1772 cns = le32toh(io->nvmeio.cmd.cdw10) & 0xff;
1775 ctl_be_block_namespace_data(be_lun, io);
1778 ctl_be_block_nvme_ids(be_lun, io);
1787 union ctl_io *io)
1789 switch (io->io_hdr.io_type) {
1791 ctl_be_block_scsi_cr_dispatch(be_lun, io);
1794 ctl_be_block_nvme_cr_dispatch(be_lun, io);
1804 union ctl_io *io;
1806 io = beio->io;
1808 ctl_config_write_done(io);
1813 union ctl_io *io)
1819 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1821 switch (io->scsiio.tag_type) {
1836 switch (io->scsiio.cdb[0]) {
1839 ctl_be_block_cw_dispatch_sync(be_lun, io);
1843 ctl_be_block_cw_dispatch_ws(be_lun, io);
1846 ctl_be_block_cw_dispatch_unmap(be_lun, io);
1849 panic("Unhandled CDB type %#x", io->scsiio.cdb[0]);
1856 union ctl_io *io)
1862 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1865 switch (io->nvmeio.cmd.opc) {
1867 ctl_be_block_cw_dispatch_flush(be_lun, io);
1870 ctl_be_block_cw_dispatch_wu(be_lun, io);
1873 ctl_be_block_cw_dispatch_wz(be_lun, io);
1876 ctl_be_block_cw_dispatch_dsm(be_lun, io);
1885 union ctl_io *io)
1892 beio->io = io;
1895 PRIV(io)->ptr = (void *)beio;
1897 switch (io->io_hdr.io_type) {
1899 ctl_be_block_scsi_cw_dispatch(be_lun, io);
1902 ctl_be_block_nvme_cw_dispatch(be_lun, io);
1918 union ctl_io *io;
1920 io = beio->io;
1923 if ((io->io_hdr.flags & CTL_FLAG_ABORT) ||
1924 ((io->io_hdr.status & CTL_STATUS_MASK) != CTL_STATUS_NONE &&
1925 (io->io_hdr.status & CTL_STATUS_MASK) != CTL_SUCCESS)) {
1926 ctl_data_submit_done(io);
1930 io->io_hdr.status &= ~CTL_STATUS_MASK;
1931 io->io_hdr.status |= CTL_STATUS_NONE;
1934 STAILQ_INSERT_TAIL(&be_lun->input_queue, &io->io_hdr, links);
1941 union ctl_io *io)
1955 lbalen = ARGS(io);
1963 beio->io = io;
1965 bptrlen = PRIV(io);
1968 switch (io->io_hdr.io_type) {
1970 switch (io->scsiio.tag_type) {
2038 ctl_set_be_move_done(io, ctl_be_block_move_done);
2041 ctl_set_kern_data_ptr(io, &beio->sg_segs[CTLBLK_HALF_SEGS]);
2043 ctl_set_kern_data_ptr(io, beio->sg_segs);
2044 ctl_set_kern_data_len(io, beio->io_len);
2045 ctl_set_kern_sg_entries(io, beio->num_segs);
2046 ctl_set_kern_data_ref(io, ctl_refcnt_beio);
2047 ctl_set_kern_data_arg(io, beio);
2048 io->io_hdr.flags |= CTL_FLAG_ALLOCATED;
2060 ctl_datamove(io);
2069 union ctl_io *io;
2080 io = (union ctl_io *)STAILQ_FIRST(&be_lun->datamove_queue);
2081 if (io != NULL) {
2085 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
2087 ctl_io_set_busy(io);
2094 io = (union ctl_io *)STAILQ_FIRST(&be_lun->config_write_queue);
2095 if (io != NULL) {
2100 ctl_io_set_busy(io);
2101 ctl_config_write_done(io);
2104 ctl_be_block_cw_dispatch(be_lun, io);
2107 io = (union ctl_io *)STAILQ_FIRST(&be_lun->config_read_queue);
2108 if (io != NULL) {
2113 ctl_io_set_busy(io);
2114 ctl_config_read_done(io);
2117 ctl_be_block_cr_dispatch(be_lun, io);
2120 io = (union ctl_io *)STAILQ_FIRST(&be_lun->input_queue);
2121 if (io != NULL) {
2126 ctl_io_set_busy(io);
2127 ctl_data_submit_done(io);
2130 ctl_be_block_dispatch(be_lun, io);
2149 ctl_be_block_submit(union ctl_io *io)
2155 be_lun = (struct ctl_be_block_lun *)CTL_BACKEND_LUN(io);
2157 CTL_IO_ASSERT(io, SCSI, NVME);
2159 PRIV(io)->len = 0;
2162 STAILQ_INSERT_TAIL(&be_lun->input_queue, &io->io_hdr, links);
2651 mtx_init(&be_lun->io_lock, "ctlblock io", NULL, MTX_DEF);
3032 ctl_be_block_scsi_config_write(union ctl_io *io)
3040 cbe_lun = CTL_BACKEND_LUN(io);
3044 switch (io->scsiio.cdb[0]) {
3059 STAILQ_INSERT_TAIL(&be_lun->config_write_queue, &io->io_hdr,
3068 cdb = (struct scsi_start_stop_unit *)io->scsiio.cdb;
3070 ctl_set_success(&io->scsiio);
3071 ctl_config_write_done(io);
3098 ctl_set_success(&io->scsiio);
3099 ctl_config_write_done(io);
3103 ctl_set_success(&io->scsiio);
3104 ctl_config_write_done(io);
3107 ctl_set_invalid_opcode(&io->scsiio);
3108 ctl_config_write_done(io);
3117 ctl_be_block_nvme_config_write(union ctl_io *io)
3123 be_lun = (struct ctl_be_block_lun *)CTL_BACKEND_LUN(io);
3125 switch (io->nvmeio.cmd.opc) {
3127 DSM_RANGE(io) = 0;
3133 STAILQ_INSERT_TAIL(&be_lun->config_write_queue, &io->io_hdr,
3139 ctl_nvme_set_invalid_opcode(&io->nvmeio);
3140 ctl_config_write_done(io);
3147 ctl_be_block_config_write(union ctl_io *io)
3149 switch (io->io_hdr.io_type) {
3151 return (ctl_be_block_scsi_config_write(io));
3153 return (ctl_be_block_nvme_config_write(io));
3160 ctl_be_block_scsi_config_read(union ctl_io *io)
3167 be_lun = (struct ctl_be_block_lun *)CTL_BACKEND_LUN(io);
3169 switch (io->scsiio.cdb[0]) {
3171 if (io->scsiio.cdb[1] == SGLS_SERVICE_ACTION) {
3174 &io->io_hdr, links);
3181 ctl_set_invalid_field(&io->scsiio,
3187 ctl_config_read_done(io);
3191 ctl_set_invalid_opcode(&io->scsiio);
3192 ctl_config_read_done(io);
3201 ctl_be_block_nvme_config_read(union ctl_io *io)
3207 be_lun = (struct ctl_be_block_lun *)CTL_BACKEND_LUN(io);
3209 switch (io->nvmeio.cmd.opc) {
3214 cns = le32toh(io->nvmeio.cmd.cdw10) & 0xff;
3220 &io->io_hdr, links);
3226 ctl_nvme_set_invalid_field(&io->nvmeio);
3227 ctl_config_read_done(io);
3233 ctl_nvme_set_invalid_opcode(&io->nvmeio);
3234 ctl_config_read_done(io);
3241 ctl_be_block_config_read(union ctl_io *io)
3243 switch (io->io_hdr.io_type) {
3245 return (ctl_be_block_scsi_config_read(io));
3247 return (ctl_be_block_nvme_config_read(io));