Lines Matching defs:beio
149 struct ctl_be_block_io *beio);
225 void (*beio_cont)(struct ctl_be_block_io *beio); /* to continue processing */
235 static void ctl_free_beio(struct ctl_be_block_io *beio);
236 static void ctl_complete_beio(struct ctl_be_block_io *beio);
240 struct ctl_be_block_io *beio);
242 struct ctl_be_block_io *beio);
244 struct ctl_be_block_io *beio);
248 struct ctl_be_block_io *beio);
250 struct ctl_be_block_io *beio);
252 struct ctl_be_block_io *beio);
254 struct ctl_be_block_io *beio);
336 struct ctl_be_block_io *beio;
338 beio = uma_zalloc(softc->beio_zone, M_WAITOK | M_ZERO);
339 beio->softc = softc;
340 beio->refcnt = 1;
341 return (beio);
345 ctl_real_free_beio(struct ctl_be_block_io *beio)
347 struct ctl_be_block_softc *softc = beio->softc;
350 for (i = 0; i < beio->num_segs; i++) {
351 ctl_free_seg(softc, &beio->sg_segs[i]);
354 if (beio->two_sglists) {
356 &beio->sg_segs[i + CTLBLK_HALF_SEGS]);
360 uma_zfree(softc->beio_zone, beio);
366 struct ctl_be_block_io *beio = arg;
368 if (atomic_fetchadd_int(&beio->refcnt, diff) + diff == 0)
369 ctl_real_free_beio(beio);
373 ctl_free_beio(struct ctl_be_block_io *beio)
376 ctl_refcnt_beio(beio, -1);
380 ctl_complete_beio(struct ctl_be_block_io *beio)
382 union ctl_io *io = beio->io;
384 if (beio->beio_cont != NULL) {
385 beio->beio_cont(beio);
387 ctl_free_beio(beio);
440 struct ctl_be_block_io *beio;
444 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
446 for (i = 0; i < beio->num_segs; i++) {
447 res = cmp(beio->sg_segs[i].addr,
448 beio->sg_segs[i + CTLBLK_HALF_SEGS].addr,
449 beio->sg_segs[i].len);
451 if (res < beio->sg_segs[i].len)
454 if (i < beio->num_segs) {
463 struct ctl_be_block_io *beio;
467 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
489 if ((beio->bio_cmd == BIO_READ)
492 ctl_complete_beio(beio);
507 be_lun->dispatch(be_lun, beio);
520 struct ctl_be_block_io *beio = bio->bio_caller1;
521 struct ctl_be_block_lun *be_lun = beio->lun;
526 io = beio->io;
533 (beio->first_error == 0 ||
534 bio->bio_offset < beio->first_error_offset)) {
535 beio->first_error = error;
536 beio->first_error_offset = bio->bio_offset;
539 beio->num_bios_done++;
551 if ((beio->send_complete == 0)
552 || (beio->num_bios_done < beio->num_bios_sent)) {
561 devstat_end_transaction(beio->lun->disk_stats, beio->io_len,
562 beio->ds_tag_type, beio->ds_trans_type,
563 /*now*/ NULL, /*then*/&beio->ds_t0);
570 error = beio->first_error;
579 ctl_be_block_io_error(io, beio->bio_cmd,
582 ctl_complete_beio(beio);
590 if ((beio->bio_cmd == BIO_WRITE)
591 || (beio->bio_cmd == BIO_FLUSH)
592 || (beio->bio_cmd == BIO_DELETE)
595 ctl_complete_beio(beio);
598 beio->beio_cont == NULL) {
609 struct ctl_be_block_io *beio)
611 union ctl_io *io = beio->io;
617 binuptime(&beio->ds_t0);
618 devstat_start_transaction(beio->lun->disk_stats, &beio->ds_t0);
624 error = VOP_FSYNC(be_lun->vn, beio->io_arg ? MNT_NOWAIT : MNT_WAIT,
631 devstat_end_transaction(beio->lun->disk_stats, beio->io_len,
632 beio->ds_tag_type, beio->ds_trans_type,
633 /*now*/ NULL, /*then*/&beio->ds_t0);
643 ctl_complete_beio(beio);
653 struct ctl_be_block_io *beio)
666 io = beio->io;
670 if (beio->bio_cmd == BIO_WRITE && ARGS(io)->flags & CTL_LLF_FUA)
674 if (beio->bio_cmd == BIO_READ) {
681 xuio.uio_offset = beio->io_offset;
682 xuio.uio_resid = beio->io_len;
684 xuio.uio_iov = beio->xiovecs;
685 xuio.uio_iovcnt = beio->num_segs;
689 xiovec->iov_base = beio->sg_segs[i].addr;
690 xiovec->iov_len = beio->sg_segs[i].len;
693 binuptime(&beio->ds_t0);
694 devstat_start_transaction(beio->lun->disk_stats, &beio->ds_t0);
696 if (beio->bio_cmd == BIO_READ) {
699 if (beio->beio_cont == NULL &&
728 s = beio->io_len - xuio.uio_resid;
729 for (i = 0; i < beio->num_segs; i++) {
730 if (s >= beio->sg_segs[i].len) {
731 s -= beio->sg_segs[i].len;
734 bzero((uint8_t *)beio->sg_segs[i].addr + s,
735 beio->sg_segs[i].len - s);
769 devstat_end_transaction(beio->lun->disk_stats, beio->io_len,
770 beio->ds_tag_type, beio->ds_trans_type,
771 /*now*/ NULL, /*then*/&beio->ds_t0);
784 ctl_be_block_io_error(io, beio->bio_cmd, 0);
786 ctl_complete_beio(beio);
794 if ((beio->bio_cmd == BIO_WRITE) ||
797 ctl_complete_beio(beio);
800 beio->beio_cont == NULL) {
811 struct ctl_be_block_io *beio)
813 union ctl_io *io = beio->io;
847 ctl_complete_beio(beio);
880 struct ctl_be_block_io *beio)
890 io = beio->io;
895 binuptime(&beio->ds_t0);
896 devstat_start_transaction(be_lun->disk_stats, &beio->ds_t0);
900 if (beio->io_offset == -1) {
901 beio->io_len = 0;
911 beio->io_len += len;
920 off = beio->io_offset;
921 len = beio->io_len;
929 devstat_end_transaction(beio->lun->disk_stats, beio->io_len,
930 beio->ds_tag_type, beio->ds_trans_type,
931 /*now*/ NULL, /*then*/&beio->ds_t0);
953 ctl_complete_beio(beio);
958 struct ctl_be_block_io *beio)
970 io = beio->io;
974 if (beio->bio_cmd == BIO_WRITE && ARGS(io)->flags & CTL_LLF_FUA)
978 if (beio->bio_cmd == BIO_READ) {
985 xuio.uio_offset = beio->io_offset;
986 xuio.uio_resid = beio->io_len;
988 xuio.uio_iov = beio->xiovecs;
989 xuio.uio_iovcnt = beio->num_segs;
993 xiovec->iov_base = beio->sg_segs[i].addr;
994 xiovec->iov_len = beio->sg_segs[i].len;
997 binuptime(&beio->ds_t0);
998 devstat_start_transaction(beio->lun->disk_stats, &beio->ds_t0);
1002 if (beio->bio_cmd == BIO_READ) {
1003 if (beio->beio_cont == NULL &&
1013 if (beio->bio_cmd == BIO_READ)
1019 devstat_end_transaction(beio->lun->disk_stats, beio->io_len,
1020 beio->ds_tag_type, beio->ds_trans_type,
1021 /*now*/ NULL, /*then*/&beio->ds_t0);
1034 ctl_be_block_io_error(io, beio->bio_cmd, 0);
1036 ctl_complete_beio(beio);
1044 if ((beio->bio_cmd == BIO_WRITE) ||
1047 ctl_complete_beio(beio);
1050 beio->beio_cont == NULL) {
1061 struct ctl_be_block_io *beio)
1063 union ctl_io *io = beio->io;
1105 ctl_complete_beio(beio);
1110 struct ctl_be_block_io *beio)
1126 bio->bio_caller1 = beio;
1134 beio->num_bios_sent = 1;
1135 beio->send_complete = 1;
1137 binuptime(&beio->ds_t0);
1138 devstat_start_transaction(be_lun->disk_stats, &beio->ds_t0);
1153 struct ctl_be_block_io *beio,
1172 bio->bio_caller1 = beio;
1179 beio->num_bios_sent++;
1181 beio->send_complete = 1;
1197 struct ctl_be_block_io *beio)
1204 io = beio->io;
1208 binuptime(&beio->ds_t0);
1209 devstat_start_transaction(be_lun->disk_stats, &beio->ds_t0);
1211 if (beio->io_offset == -1) {
1212 beio->io_len = 0;
1219 beio->io_len += len;
1220 ctl_be_block_unmap_dev_range(be_lun, beio,
1225 ctl_be_block_unmap_dev_range(be_lun, beio,
1226 beio->io_offset, beio->io_len, TRUE);
1231 struct ctl_be_block_io *beio)
1254 cur_offset = beio->io_offset;
1255 for (i = 0; i < beio->num_segs; i++) {
1259 cur_size = beio->sg_segs[i].len;
1260 cur_ptr = beio->sg_segs[i].addr;
1268 bio->bio_cmd = beio->bio_cmd;
1270 bio->bio_caller1 = beio;
1282 beio->num_bios_sent++;
1285 beio->send_complete = 1;
1286 binuptime(&beio->ds_t0);
1287 devstat_start_transaction(be_lun->disk_stats, &beio->ds_t0);
1367 struct ctl_be_block_io *beio;
1371 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1374 beio->io_len = lbalen->len * cbe_lun->blocksize;
1375 beio->io_offset = lbalen->lba * cbe_lun->blocksize;
1376 beio->io_arg = (lbalen->flags & SSC_IMMED) != 0;
1377 beio->bio_cmd = BIO_FLUSH;
1378 beio->ds_trans_type = DEVSTAT_NO_DATA;
1380 be_lun->lun_flush(be_lun, beio);
1384 ctl_be_block_cw_done_ws(struct ctl_be_block_io *beio)
1388 io = beio->io;
1389 ctl_free_beio(beio);
1406 struct ctl_be_block_io *beio;
1417 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1422 ctl_free_beio(beio);
1434 beio->io_offset = lbalen->lba * cbe_lun->blocksize;
1435 beio->io_len = (uint64_t)lbalen->len * cbe_lun->blocksize;
1436 beio->bio_cmd = BIO_DELETE;
1437 beio->ds_trans_type = DEVSTAT_FREE;
1439 be_lun->unmap(be_lun, beio);
1443 beio->bio_cmd = BIO_WRITE;
1444 beio->ds_trans_type = DEVSTAT_WRITE;
1469 ctl_alloc_seg(softc, &beio->sg_segs[i], seglen);
1472 beio->sg_segs[i].addr, beio->sg_segs[i].len);
1474 beio->num_segs++;
1477 buf = beio->sg_segs[i].addr;
1492 beio->io_offset = lbalen->lba * cbe_lun->blocksize;
1493 beio->io_len = lba * cbe_lun->blocksize;
1499 beio->beio_cont = ctl_be_block_cw_done_ws;
1502 be_lun->dispatch(be_lun, beio);
1509 struct ctl_be_block_io *beio;
1516 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1520 ctl_free_beio(beio);
1531 beio->io_len = 0;
1532 beio->io_offset = -1;
1533 beio->bio_cmd = BIO_DELETE;
1534 beio->ds_trans_type = DEVSTAT_FREE;
1536 be_lun->unmap(be_lun, beio);
1543 struct ctl_be_block_io *beio;
1546 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1548 beio->io_len = be_lun->size_bytes;
1549 beio->io_offset = 0;
1550 beio->io_arg = 1;
1551 beio->bio_cmd = BIO_FLUSH;
1552 beio->ds_trans_type = DEVSTAT_NO_DATA;
1554 be_lun->lun_flush(be_lun, beio);
1562 struct ctl_be_block_io *beio;
1567 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1574 beio->io_offset = lbalen->lba * cbe_lun->blocksize;
1575 beio->io_len = (uint64_t)lbalen->len * cbe_lun->blocksize;
1576 beio->bio_cmd = BIO_DELETE;
1577 beio->ds_trans_type = DEVSTAT_FREE;
1579 be_lun->unmap(be_lun, beio);
1588 struct ctl_be_block_io *beio;
1598 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1603 beio->io_offset = lbalen->lba * cbe_lun->blocksize;
1604 beio->io_len = (uint64_t)lbalen->len * cbe_lun->blocksize;
1605 beio->bio_cmd = BIO_DELETE;
1606 beio->ds_trans_type = DEVSTAT_FREE;
1608 be_lun->unmap(be_lun, beio);
1612 beio->bio_cmd = BIO_WRITE;
1613 beio->ds_trans_type = DEVSTAT_WRITE;
1638 ctl_alloc_seg(softc, &beio->sg_segs[i], seglen);
1641 beio->sg_segs[i].addr, beio->sg_segs[i].len);
1643 beio->num_segs++;
1646 memset(beio->sg_segs[i].addr, 0, seglen);
1650 beio->io_offset = lbalen->lba * cbe_lun->blocksize;
1651 beio->io_len = lba * cbe_lun->blocksize;
1657 beio->beio_cont = ctl_be_block_cw_done_ws;
1660 be_lun->dispatch(be_lun, beio);
1668 struct ctl_be_block_io *beio;
1676 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1679 ctl_free_beio(beio);
1696 ctl_free_beio(beio);
1705 beio->beio_cont = ctl_be_block_cw_done_ws;
1711 beio->io_offset = lba * cbe_lun->blocksize;
1712 beio->io_len = (uint64_t)num_blocks * cbe_lun->blocksize;
1713 beio->bio_cmd = BIO_DELETE;
1714 beio->ds_trans_type = DEVSTAT_FREE;
1716 be_lun->unmap(be_lun, beio);
1720 ctl_be_block_scsi_cr_done(struct ctl_be_block_io *beio)
1724 io = beio->io;
1725 ctl_free_beio(beio);
1733 struct ctl_be_block_io *beio;
1739 beio = ctl_alloc_beio(softc);
1740 beio->io = io;
1741 beio->lun = be_lun;
1742 beio->beio_cont = ctl_be_block_scsi_cr_done;
1743 PRIV(io)->ptr = (void *)beio;
1747 beio->bio_cmd = -1;
1748 beio->ds_trans_type = DEVSTAT_NO_DATA;
1749 beio->ds_tag_type = DEVSTAT_TAG_ORDERED;
1750 beio->io_len = 0;
1752 be_lun->get_lba_status(be_lun, beio);
1754 ctl_be_block_scsi_cr_done(beio);
1802 ctl_be_block_cw_done(struct ctl_be_block_io *beio)
1806 io = beio->io;
1807 ctl_free_beio(beio);
1815 struct ctl_be_block_io *beio;
1819 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1823 beio->ds_tag_type = DEVSTAT_TAG_ORDERED;
1826 beio->ds_tag_type = DEVSTAT_TAG_HEAD;
1832 beio->ds_tag_type = DEVSTAT_TAG_SIMPLE;
1858 struct ctl_be_block_io *beio;
1862 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
1863 beio->ds_tag_type = DEVSTAT_TAG_SIMPLE;
1887 struct ctl_be_block_io *beio;
1891 beio = ctl_alloc_beio(softc);
1892 beio->io = io;
1893 beio->lun = be_lun;
1894 beio->beio_cont = ctl_be_block_cw_done;
1895 PRIV(io)->ptr = (void *)beio;
1915 ctl_be_block_next(struct ctl_be_block_io *beio)
1920 io = beio->io;
1921 be_lun = beio->lun;
1922 ctl_free_beio(beio);
1944 struct ctl_be_block_io *beio;
1962 beio = ctl_alloc_beio(softc);
1963 beio->io = io;
1964 beio->lun = be_lun;
1966 bptrlen->ptr = (void *)beio;
1972 beio->ds_tag_type = DEVSTAT_TAG_ORDERED;
1975 beio->ds_tag_type = DEVSTAT_TAG_HEAD;
1981 beio->ds_tag_type = DEVSTAT_TAG_SIMPLE;
1986 beio->ds_tag_type = DEVSTAT_TAG_SIMPLE;
1993 beio->bio_cmd = BIO_WRITE;
1994 beio->ds_trans_type = DEVSTAT_WRITE;
1996 beio->bio_cmd = BIO_READ;
1997 beio->ds_trans_type = DEVSTAT_READ;
2001 (beio->bio_cmd == BIO_READ) ? "READ" : "WRITE",
2005 beio->two_sglists = 1;
2009 beio->io_offset = (lbalen->lba + bptrlen->len) * cbe_lun->blocksize;
2010 beio->io_len = lbas * cbe_lun->blocksize;
2013 for (i = 0, len_left = beio->io_len; len_left > 0; i++) {
2020 ctl_alloc_seg(softc, &beio->sg_segs[i],
2024 beio->sg_segs[i].addr, beio->sg_segs[i].len);
2027 if (beio->two_sglists) {
2029 &beio->sg_segs[i + CTLBLK_HALF_SEGS],
2030 beio->sg_segs[i].len);
2033 beio->num_segs++;
2034 len_left -= beio->sg_segs[i].len;
2037 beio->beio_cont = ctl_be_block_next;
2040 if (beio->two_sglists)
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);
2047 ctl_set_kern_data_arg(io, beio);
2055 if (beio->bio_cmd == BIO_READ) {
2057 be_lun->dispatch(be_lun, beio);
2070 struct ctl_be_block_io *beio;
2085 beio = (struct ctl_be_block_io *)PRIV(io)->ptr;
2088 ctl_complete_beio(beio);
2091 be_lun->dispatch(be_lun, beio);
3288 softc->beio_zone = uma_zcreate("beio", sizeof(struct ctl_be_block_io),