Lines Matching defs:be_lun

149 typedef void (*cbb_dispatch_t)(struct ctl_be_block_lun *be_lun,
151 typedef uint64_t (*cbb_getattr_t)(struct ctl_be_block_lun *be_lun,
246 static void ctl_be_block_flush_file(struct ctl_be_block_lun *be_lun,
248 static void ctl_be_block_dispatch_file(struct ctl_be_block_lun *be_lun,
250 static void ctl_be_block_gls_file(struct ctl_be_block_lun *be_lun,
252 static uint64_t ctl_be_block_getattr_file(struct ctl_be_block_lun *be_lun,
254 static void ctl_be_block_flush_dev(struct ctl_be_block_lun *be_lun,
256 static void ctl_be_block_unmap_dev(struct ctl_be_block_lun *be_lun,
258 static void ctl_be_block_dispatch_dev(struct ctl_be_block_lun *be_lun,
260 static uint64_t ctl_be_block_getattr_dev(struct ctl_be_block_lun *be_lun,
262 static void ctl_be_block_cr_dispatch(struct ctl_be_block_lun *be_lun,
264 static void ctl_be_block_cw_dispatch(struct ctl_be_block_lun *be_lun,
266 static void ctl_be_block_dispatch(struct ctl_be_block_lun *be_lun,
272 static int ctl_be_block_open_file(struct ctl_be_block_lun *be_lun,
274 static int ctl_be_block_open_dev(struct ctl_be_block_lun *be_lun,
276 static int ctl_be_block_close(struct ctl_be_block_lun *be_lun);
278 struct ctl_be_block_lun *be_lun,
284 static int ctl_be_block_modify_file(struct ctl_be_block_lun *be_lun,
286 static int ctl_be_block_modify_dev(struct ctl_be_block_lun *be_lun,
290 static void ctl_be_block_lun_shutdown(void *be_lun);
291 static void ctl_be_block_lun_config_status(void *be_lun,
295 static int ctl_be_block_lun_info(void *be_lun, struct sbuf *sb);
296 static uint64_t ctl_be_block_lun_attr(void *be_lun, const char *attrname);
376 struct ctl_be_block_lun *be_lun;
384 be_lun = beio->lun;
460 mtx_lock(&be_lun->queue_lock);
466 STAILQ_INSERT_TAIL(&be_lun->datamove_queue, &io->io_hdr, links);
467 mtx_unlock(&be_lun->queue_lock);
469 taskqueue_enqueue(be_lun->io_taskqueue, &be_lun->io_task);
478 struct ctl_be_block_lun *be_lun;
483 be_lun = beio->lun;
489 mtx_lock(&be_lun->io_lock);
507 mtx_unlock(&be_lun->io_lock);
518 mtx_unlock(&be_lun->io_lock);
562 ctl_be_block_flush_file(struct ctl_be_block_lun *be_lun,
572 mtx_lock(&be_lun->io_lock);
574 mtx_unlock(&be_lun->io_lock);
576 (void) vn_start_write(be_lun->vn, &mountpoint, V_WAIT);
580 && MNT_SHARED_WRITES(be_lun->vn->v_mount)))
585 vn_lock(be_lun->vn, lock_flags | LK_RETRY);
587 error = VOP_FSYNC(be_lun->vn, MNT_WAIT, curthread);
588 VOP_UNLOCK(be_lun->vn, 0);
592 mtx_lock(&be_lun->io_lock);
596 mtx_unlock(&be_lun->io_lock);
616 ctl_be_block_dispatch_file(struct ctl_be_block_lun *be_lun,
628 file_data = &be_lun->backend.file;
657 mtx_lock(&be_lun->io_lock);
659 mtx_unlock(&be_lun->io_lock);
662 vn_lock(be_lun->vn, LK_SHARED | LK_RETRY);
684 error = VOP_READ(be_lun->vn, &xuio, flags, file_data->cred);
686 VOP_UNLOCK(be_lun->vn, 0);
692 (void)vn_start_write(be_lun->vn, &mountpoint, V_WAIT);
696 && MNT_SHARED_WRITES(be_lun->vn->v_mount)))
701 vn_lock(be_lun->vn, lock_flags | LK_RETRY);
721 error = VOP_WRITE(be_lun->vn, &xuio, flags, file_data->cred);
722 VOP_UNLOCK(be_lun->vn, 0);
728 mtx_lock(&be_lun->io_lock);
732 mtx_unlock(&be_lun->io_lock);
772 ctl_be_block_gls_file(struct ctl_be_block_lun *be_lun,
783 off = roff = ((off_t)lbalen->lba) << be_lun->blocksize_shift;
784 vn_lock(be_lun->vn, LK_SHARED | LK_RETRY);
785 error = VOP_IOCTL(be_lun->vn, FIOSEEKHOLE, &off,
790 error = VOP_IOCTL(be_lun->vn, FIOSEEKDATA, &off,
796 off = be_lun->size_bytes;
799 VOP_UNLOCK(be_lun->vn, 0);
801 off >>= be_lun->blocksize_shift;
812 ctl_be_block_getattr_file(struct ctl_be_block_lun *be_lun, const char *attrname)
818 if (be_lun->vn == NULL)
821 error = VOP_GETATTR(be_lun->vn, &vattr, curthread->td_ucred);
824 return (vattr.va_bytes >> be_lun->blocksize_shift);
827 error = VFS_STATFS(be_lun->vn->v_mount, &statfs);
831 be_lun->blocksize_shift);
837 ctl_be_block_dispatch_zvol(struct ctl_be_block_lun *be_lun,
849 dev_data = &be_lun->backend.dev;
878 mtx_lock(&be_lun->io_lock);
880 mtx_unlock(&be_lun->io_lock);
890 mtx_lock(&be_lun->io_lock);
894 mtx_unlock(&be_lun->io_lock);
929 ctl_be_block_gls_zvol(struct ctl_be_block_lun *be_lun,
932 struct ctl_be_block_devdata *dev_data = &be_lun->backend.dev;
941 off = roff = ((off_t)lbalen->lba) << be_lun->blocksize_shift;
953 off = be_lun->size_bytes;
957 off >>= be_lun->blocksize_shift;
968 ctl_be_block_flush_dev(struct ctl_be_block_lun *be_lun,
975 dev_data = &be_lun->backend.dev;
1001 mtx_lock(&be_lun->io_lock);
1002 devstat_start_transaction(be_lun->disk_stats, &beio->ds_t0);
1003 mtx_unlock(&be_lun->io_lock);
1009 ctl_be_block_unmap_dev_range(struct ctl_be_block_lun *be_lun,
1017 dev_data = &be_lun->backend.dev;
1018 maxlen = LONG_MAX - (LONG_MAX % be_lun->blocksize);
1028 bio->bio_pblkno = off / be_lun->blocksize;
1033 mtx_lock(&be_lun->io_lock);
1037 mtx_unlock(&be_lun->io_lock);
1044 ctl_be_block_unmap_dev(struct ctl_be_block_lun *be_lun,
1053 dev_data = &be_lun->backend.dev;
1059 mtx_lock(&be_lun->io_lock);
1060 devstat_start_transaction(be_lun->disk_stats, &beio->ds_t0);
1061 mtx_unlock(&be_lun->io_lock);
1070 be_lun->blocksize;
1072 ctl_be_block_unmap_dev_range(be_lun, beio,
1073 scsi_8btou64(buf->lba) * be_lun->blocksize, len,
1077 ctl_be_block_unmap_dev_range(be_lun, beio,
1082 ctl_be_block_dispatch_dev(struct ctl_be_block_lun *be_lun,
1094 dev_data = &be_lun->backend.dev;
1126 bio->bio_pblkno = cur_offset / be_lun->blocksize;
1137 mtx_lock(&be_lun->io_lock);
1138 devstat_start_transaction(be_lun->disk_stats, &beio->ds_t0);
1140 mtx_unlock(&be_lun->io_lock);
1152 ctl_be_block_getattr_dev(struct ctl_be_block_lun *be_lun, const char *attrname)
1154 struct ctl_be_block_devdata *dev_data = &be_lun->backend.dev;
1187 ctl_be_block_cw_dispatch_ws(struct ctl_be_block_lun *be_lun,
1201 softc = be_lun->softc;
1205 (lbalen->flags & (SWS_UNMAP | SWS_ANCHOR) && be_lun->unmap == NULL)) {
1233 beio->io_offset = lbalen->lba * be_lun->blocksize;
1234 beio->io_len = (uint64_t)lbalen->len * be_lun->blocksize;
1238 be_lun->unmap(be_lun, beio);
1248 pb = be_lun->blocksize << be_lun->pblockexp;
1249 if (be_lun->pblockoff > 0)
1250 pbo = pb - be_lun->blocksize * be_lun->pblockoff;
1253 len_left = (uint64_t)lbalen->len * be_lun->blocksize;
1260 if (pb > be_lun->blocksize) {
1261 adj = ((lbalen->lba + lba) * be_lun->blocksize +
1266 seglen -= seglen % be_lun->blocksize;
1268 seglen -= seglen % be_lun->blocksize;
1270 beio->sg_segs[i].addr = uma_zalloc(be_lun->lun_zone, M_WAITOK);
1280 for (; buf < end; buf += be_lun->blocksize) {
1281 memcpy(buf, io->scsiio.kern_data_ptr, be_lun->blocksize);
1288 beio->io_offset = lbalen->lba * be_lun->blocksize;
1289 beio->io_len = lba * be_lun->blocksize;
1298 be_lun->dispatch(be_lun, beio);
1302 ctl_be_block_cw_dispatch_unmap(struct ctl_be_block_lun *be_lun,
1312 softc = be_lun->softc;
1315 if ((ptrlen->flags & ~SU_ANCHOR) != 0 || be_lun->unmap == NULL) {
1350 be_lun->unmap(be_lun, beio);
1364 ctl_be_block_cr_dispatch(struct ctl_be_block_lun *be_lun,
1372 softc = be_lun->softc;
1375 beio->lun = be_lun;
1385 if (be_lun->get_lba_status)
1386 be_lun->get_lba_status(be_lun, beio);
1407 ctl_be_block_cw_dispatch(struct ctl_be_block_lun *be_lun,
1415 softc = be_lun->softc;
1418 beio->lun = be_lun;
1429 be_lun->lun_flush(be_lun, beio);
1433 ctl_be_block_cw_dispatch_ws(be_lun, io);
1436 ctl_be_block_cw_dispatch_unmap(be_lun, io);
1452 struct ctl_be_block_lun *be_lun;
1456 be_lun = beio->lun;
1468 mtx_lock(&be_lun->queue_lock);
1474 STAILQ_INSERT_TAIL(&be_lun->input_queue, &io->io_hdr, links);
1475 mtx_unlock(&be_lun->queue_lock);
1477 taskqueue_enqueue(be_lun->io_taskqueue, &be_lun->io_task);
1481 ctl_be_block_dispatch(struct ctl_be_block_lun *be_lun,
1491 softc = be_lun->softc;
1504 beio->lun = be_lun;
1538 lbas = MIN(lbalen->len - bptrlen->len, lbas / be_lun->blocksize);
1539 beio->io_offset = (lbalen->lba + bptrlen->len) * be_lun->blocksize;
1540 beio->io_len = lbas * be_lun->blocksize;
1551 beio->sg_segs[i].addr = uma_zalloc(be_lun->lun_zone, M_WAITOK);
1561 uma_zalloc(be_lun->lun_zone, M_WAITOK);
1587 be_lun->dispatch(be_lun, beio);
1600 struct ctl_be_block_lun *be_lun;
1604 be_lun = (struct ctl_be_block_lun *)context;
1605 softc = be_lun->softc;
1609 mtx_lock(&be_lun->queue_lock);
1611 io = (union ctl_io *)STAILQ_FIRST(&be_lun->datamove_queue);
1617 STAILQ_REMOVE(&be_lun->datamove_queue, &io->io_hdr,
1620 mtx_unlock(&be_lun->queue_lock);
1624 be_lun->dispatch(be_lun, beio);
1626 mtx_lock(&be_lun->queue_lock);
1629 io = (union ctl_io *)STAILQ_FIRST(&be_lun->config_write_queue);
1632 STAILQ_REMOVE(&be_lun->config_write_queue, &io->io_hdr,
1634 mtx_unlock(&be_lun->queue_lock);
1635 ctl_be_block_cw_dispatch(be_lun, io);
1636 mtx_lock(&be_lun->queue_lock);
1639 io = (union ctl_io *)STAILQ_FIRST(&be_lun->config_read_queue);
1642 STAILQ_REMOVE(&be_lun->config_read_queue, &io->io_hdr,
1644 mtx_unlock(&be_lun->queue_lock);
1645 ctl_be_block_cr_dispatch(be_lun, io);
1646 mtx_lock(&be_lun->queue_lock);
1649 io = (union ctl_io *)STAILQ_FIRST(&be_lun->input_queue);
1653 STAILQ_REMOVE(&be_lun->input_queue, &io->io_hdr,
1655 mtx_unlock(&be_lun->queue_lock);
1661 ctl_be_block_dispatch(be_lun, io);
1663 mtx_lock(&be_lun->queue_lock);
1673 mtx_unlock(&be_lun->queue_lock);
1684 struct ctl_be_block_lun *be_lun;
1691 be_lun = (struct ctl_be_block_lun *)ctl_be_lun->be_lun;
1701 mtx_lock(&be_lun->queue_lock);
1707 STAILQ_INSERT_TAIL(&be_lun->input_queue, &io->io_hdr, links);
1708 mtx_unlock(&be_lun->queue_lock);
1709 taskqueue_enqueue(be_lun->io_taskqueue, &be_lun->io_task);
1759 ctl_be_block_open_file(struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
1769 file_data = &be_lun->backend.file;
1770 params = &be_lun->params;
1772 be_lun->dev_type = CTL_BE_BLOCK_FILE;
1773 be_lun->dispatch = ctl_be_block_dispatch_file;
1774 be_lun->lun_flush = ctl_be_block_flush_file;
1775 be_lun->get_lba_status = ctl_be_block_gls_file;
1776 be_lun->getattr = ctl_be_block_getattr_file;
1778 error = VOP_GETATTR(be_lun->vn, &vattr, curthread->td_ucred);
1782 be_lun->dev_path);
1791 if (VOP_ISLOCKED(be_lun->vn) != LK_EXCLUSIVE) {
1792 vn_lock(be_lun->vn, LK_UPGRADE | LK_RETRY);
1793 if (be_lun->vn->v_iflag & VI_DOOMED) {
1796 "error locking file %s", be_lun->dev_path);
1804 be_lun->size_bytes = params->lun_size_bytes;
1806 be_lun->size_bytes = vattr.va_size;
1813 be_lun->flags |= CTL_BE_BLOCK_LUN_MULTI_THREAD;
1822 be_lun->blocksize = params->blocksize_bytes;
1824 be_lun->blocksize = 512;
1829 value = ctl_get_opt(&be_lun->ctl_be_lun.options, "pblocksize");
1832 value = ctl_get_opt(&be_lun->ctl_be_lun.options, "pblockoffset");
1835 pss = ps / be_lun->blocksize;
1836 pos = po / be_lun->blocksize;
1837 if ((pss > 0) && (pss * be_lun->blocksize == ps) && (pss >= pos) &&
1838 ((pss & (pss - 1)) == 0) && (pos * be_lun->blocksize == po)) {
1839 be_lun->pblockexp = fls(pss) - 1;
1840 be_lun->pblockoff = (pss - pos) % pss;
1843 value = ctl_get_opt(&be_lun->ctl_be_lun.options, "ublocksize");
1846 value = ctl_get_opt(&be_lun->ctl_be_lun.options, "ublockoffset");
1849 uss = us / be_lun->blocksize;
1850 uos = uo / be_lun->blocksize;
1851 if ((uss > 0) && (uss * be_lun->blocksize == us) && (uss >= uos) &&
1852 ((uss & (uss - 1)) == 0) && (uos * be_lun->blocksize == uo)) {
1853 be_lun->ublockexp = fls(uss) - 1;
1854 be_lun->ublockoff = (uss - uos) % uss;
1861 if (be_lun->size_bytes < be_lun->blocksize) {
1864 "file %s size %ju < block size %u", be_lun->dev_path,
1865 (uintmax_t)be_lun->size_bytes, be_lun->blocksize);
1868 be_lun->opttxferlen = CTLBLK_MAX_IO_SIZE / be_lun->blocksize;
1873 ctl_be_block_open_dev(struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
1883 params = &be_lun->params;
1885 be_lun->dev_type = CTL_BE_BLOCK_DEV;
1886 be_lun->backend.dev.cdev = be_lun->vn->v_rdev;
1887 be_lun->backend.dev.csw = dev_refthread(be_lun->backend.dev.cdev,
1888 &be_lun->backend.dev.dev_ref);
1889 if (be_lun->backend.dev.csw == NULL)
1891 if (strcmp(be_lun->backend.dev.csw->d_name, "zvol") == 0) {
1892 be_lun->dispatch = ctl_be_block_dispatch_zvol;
1893 be_lun->get_lba_status = ctl_be_block_gls_zvol;
1896 be_lun->dispatch = ctl_be_block_dispatch_dev;
1898 maxio = be_lun->backend.dev.cdev->si_iosize_max;
1904 be_lun->lun_flush = ctl_be_block_flush_dev;
1905 be_lun->getattr = ctl_be_block_getattr_dev;
1907 error = VOP_GETATTR(be_lun->vn, &vattr, NOCRED);
1911 be_lun->dev_path);
1915 dev = be_lun->vn->v_rdev;
1920 be_lun->dev_path);
1925 (caddr_t)&be_lun->blocksize, FREAD,
1930 "on %s!", error, be_lun->dev_path);
1941 && (params->blocksize_bytes > be_lun->blocksize)) {
1944 bs_multiple = params->blocksize_bytes / be_lun->blocksize;
1946 tmp_blocksize = bs_multiple * be_lun->blocksize;
1949 be_lun->blocksize = params->blocksize_bytes;
1955 be_lun->blocksize);
1960 && (params->blocksize_bytes != be_lun->blocksize)) {
1964 be_lun->blocksize);
1969 (caddr_t)&be_lun->size_bytes, FREAD,
1975 be_lun->dev_path);
1980 if (params->lun_size_bytes > be_lun->size_bytes) {
1985 (uintmax_t)be_lun->size_bytes);
1989 be_lun->size_bytes = params->lun_size_bytes;
2005 value = ctl_get_opt(&be_lun->ctl_be_lun.options, "pblocksize");
2008 value = ctl_get_opt(&be_lun->ctl_be_lun.options, "pblockoffset");
2011 pss = ps / be_lun->blocksize;
2012 pos = po / be_lun->blocksize;
2013 if ((pss > 0) && (pss * be_lun->blocksize == ps) && (pss >= pos) &&
2014 ((pss & (pss - 1)) == 0) && (pos * be_lun->blocksize == po)) {
2015 be_lun->pblockexp = fls(pss) - 1;
2016 be_lun->pblockoff = (pss - pos) % pss;
2019 value = ctl_get_opt(&be_lun->ctl_be_lun.options, "ublocksize");
2022 value = ctl_get_opt(&be_lun->ctl_be_lun.options, "ublockoffset");
2025 uss = us / be_lun->blocksize;
2026 uos = uo / be_lun->blocksize;
2027 if ((uss > 0) && (uss * be_lun->blocksize == us) && (uss >= uos) &&
2028 ((uss & (uss - 1)) == 0) && (uos * be_lun->blocksize == uo)) {
2029 be_lun->ublockexp = fls(uss) - 1;
2030 be_lun->ublockoff = (uss - uos) % uss;
2033 be_lun->atomicblock = atomic / be_lun->blocksize;
2034 be_lun->opttxferlen = maxio / be_lun->blocksize;
2036 if (be_lun->dispatch == ctl_be_block_dispatch_zvol) {
2047 value = ctl_get_opt(&be_lun->ctl_be_lun.options, "unmap");
2051 be_lun->unmap = ctl_be_block_unmap_dev;
2057 ctl_be_block_close(struct ctl_be_block_lun *be_lun)
2060 if (be_lun->vn) {
2063 switch (be_lun->dev_type) {
2065 if (be_lun->backend.dev.csw) {
2066 dev_relthread(be_lun->backend.dev.cdev,
2067 be_lun->backend.dev.dev_ref);
2068 be_lun->backend.dev.csw = NULL;
2069 be_lun->backend.dev.cdev = NULL;
2081 (void)vn_close(be_lun->vn, flags, NOCRED, curthread);
2082 be_lun->vn = NULL;
2084 switch (be_lun->dev_type) {
2088 if (be_lun->backend.file.cred != NULL) {
2089 crfree(be_lun->backend.file.cred);
2090 be_lun->backend.file.cred = NULL;
2099 be_lun->dev_type = CTL_BE_BLOCK_NONE;
2108 struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
2140 NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, be_lun->dev_path, curthread);
2149 if (be_lun->dev_path[0] != '/') {
2154 dev_name = malloc(strlen(be_lun->dev_path)
2159 be_lun->dev_path);
2160 free(be_lun->dev_path, M_CTLBLK);
2161 be_lun->dev_path = dev_name;
2166 "error opening %s: %d", be_lun->dev_path, error);
2172 be_lun->vn = nd.ni_vp;
2175 if (vn_isdisk(be_lun->vn, &error)) {
2176 error = ctl_be_block_open_dev(be_lun, req);
2177 } else if (be_lun->vn->v_type == VREG) {
2178 error = ctl_be_block_open_file(be_lun, req);
2182 "%s is not a disk or plain file", be_lun->dev_path);
2184 VOP_UNLOCK(be_lun->vn, 0);
2187 ctl_be_block_close(be_lun);
2191 be_lun->blocksize_shift = fls(be_lun->blocksize) - 1;
2192 be_lun->size_blocks = be_lun->size_bytes >> be_lun->blocksize_shift;
2200 struct ctl_be_block_lun *be_lun;
2214 be_lun = malloc(sizeof(*be_lun), M_CTLBLK, M_ZERO | M_WAITOK);
2216 be_lun->params = req->reqdata.create;
2217 be_lun->softc = softc;
2218 STAILQ_INIT(&be_lun->input_queue);
2219 STAILQ_INIT(&be_lun->config_read_queue);
2220 STAILQ_INIT(&be_lun->config_write_queue);
2221 STAILQ_INIT(&be_lun->datamove_queue);
2222 sprintf(be_lun->lunname, "cblk%d", softc->num_luns);
2223 mtx_init(&be_lun->io_lock, "cblk io lock", NULL, MTX_DEF);
2224 mtx_init(&be_lun->queue_lock, "cblk queue lock", NULL, MTX_DEF);
2225 ctl_init_opts(&be_lun->ctl_be_lun.options,
2228 be_lun->lun_zone = uma_zcreate(be_lun->lunname, CTLBLK_MAX_SEG,
2231 if (be_lun->lun_zone == NULL) {
2238 be_lun->ctl_be_lun.lun_type = params->device_type;
2240 be_lun->ctl_be_lun.lun_type = T_DIRECT;
2242 if (be_lun->ctl_be_lun.lun_type == T_DIRECT) {
2243 value = ctl_get_opt(&be_lun->ctl_be_lun.options, "file");
2249 be_lun->dev_path = strdup(value, M_CTLBLK);
2250 be_lun->blocksize = 512;
2251 be_lun->blocksize_shift = fls(be_lun->blocksize) - 1;
2253 retval = ctl_be_block_open(softc, be_lun, req);
2262 be_lun->blocksize = 0;
2263 be_lun->pblockexp = 0;
2264 be_lun->pblockoff = 0;
2265 be_lun->ublockexp = 0;
2266 be_lun->ublockoff = 0;
2267 be_lun->size_blocks = 0;
2268 be_lun->size_bytes = 0;
2269 be_lun->ctl_be_lun.maxlba = 0;
2281 value = ctl_get_opt(&be_lun->ctl_be_lun.options, "num_threads");
2299 be_lun->flags = CTL_BE_BLOCK_LUN_UNCONFIGURED;
2300 be_lun->ctl_be_lun.flags = CTL_LUN_FLAG_PRIMARY;
2301 if (be_lun->vn == NULL)
2302 be_lun->ctl_be_lun.flags |= CTL_LUN_FLAG_OFFLINE;
2303 if (be_lun->unmap != NULL)
2304 be_lun->ctl_be_lun.flags |= CTL_LUN_FLAG_UNMAP;
2305 if (be_lun->dispatch != ctl_be_block_dispatch_dev)
2306 be_lun->ctl_be_lun.flags |= CTL_LUN_FLAG_SERSEQ_READ;
2307 be_lun->ctl_be_lun.be_lun = be_lun;
2308 be_lun->ctl_be_lun.maxlba = (be_lun->size_blocks == 0) ?
2309 0 : (be_lun->size_blocks - 1);
2310 be_lun->ctl_be_lun.blocksize = be_lun->blocksize;
2311 be_lun->ctl_be_lun.pblockexp = be_lun->pblockexp;
2312 be_lun->ctl_be_lun.pblockoff = be_lun->pblockoff;
2313 be_lun->ctl_be_lun.ublockexp = be_lun->ublockexp;
2314 be_lun->ctl_be_lun.ublockoff = be_lun->ublockoff;
2315 be_lun->ctl_be_lun.atomicblock = be_lun->atomicblock;
2316 be_lun->ctl_be_lun.opttxferlen = be_lun->opttxferlen;
2318 params->lun_size_bytes = be_lun->size_bytes;
2319 params->blocksize_bytes = be_lun->blocksize;
2321 be_lun->ctl_be_lun.req_lun_id = params->req_lun_id;
2322 be_lun->ctl_be_lun.flags |= CTL_LUN_FLAG_ID_REQ;
2324 be_lun->ctl_be_lun.req_lun_id = 0;
2326 be_lun->ctl_be_lun.lun_shutdown = ctl_be_block_lun_shutdown;
2327 be_lun->ctl_be_lun.lun_config_status =
2329 be_lun->ctl_be_lun.be = &ctl_be_block_driver;
2334 strncpy((char *)be_lun->ctl_be_lun.serial_num, tmpstr,
2335 MIN(sizeof(be_lun->ctl_be_lun.serial_num),
2342 strncpy((char *)be_lun->ctl_be_lun.serial_num,
2344 MIN(sizeof(be_lun->ctl_be_lun.serial_num),
2349 strncpy((char *)be_lun->ctl_be_lun.device_id, tmpstr,
2350 MIN(sizeof(be_lun->ctl_be_lun.device_id),
2357 strncpy((char *)be_lun->ctl_be_lun.device_id,
2359 MIN(sizeof(be_lun->ctl_be_lun.device_id),
2363 TASK_INIT(&be_lun->io_task, /*priority*/0, ctl_be_block_worker, be_lun);
2365 be_lun->io_taskqueue = taskqueue_create(be_lun->lunname, M_WAITOK,
2366 taskqueue_thread_enqueue, /*context*/&be_lun->io_taskqueue);
2368 if (be_lun->io_taskqueue == NULL) {
2388 retval = taskqueue_start_threads(&be_lun->io_taskqueue,
2392 "%s taskq", be_lun->lunname);
2397 be_lun->num_threads = num_threads;
2401 STAILQ_INSERT_TAIL(&softc->lun_list, be_lun, links);
2405 retval = ctl_add_lun(&be_lun->ctl_be_lun);
2408 STAILQ_REMOVE(&softc->lun_list, be_lun, ctl_be_block_lun,
2425 be_lun->flags |= CTL_BE_BLOCK_LUN_WAITING;
2427 while (be_lun->flags & CTL_BE_BLOCK_LUN_UNCONFIGURED) {
2428 retval = msleep(be_lun, &softc->lock, PCATCH, "ctlblk", 0);
2432 be_lun->flags &= ~CTL_BE_BLOCK_LUN_WAITING;
2434 if (be_lun->flags & CTL_BE_BLOCK_LUN_CONFIG_ERR) {
2437 STAILQ_REMOVE(&softc->lun_list, be_lun, ctl_be_block_lun,
2443 params->req_lun_id = be_lun->ctl_be_lun.lun_id;
2448 be_lun->disk_stats = devstat_new_entry("cbb", params->req_lun_id,
2449 be_lun->blocksize,
2451 be_lun->ctl_be_lun.lun_type
2460 if (be_lun->io_taskqueue != NULL)
2461 taskqueue_free(be_lun->io_taskqueue);
2462 ctl_be_block_close(be_lun);
2463 if (be_lun->dev_path != NULL)
2464 free(be_lun->dev_path, M_CTLBLK);
2465 if (be_lun->lun_zone != NULL)
2466 uma_zdestroy(be_lun->lun_zone);
2467 ctl_free_opts(&be_lun->ctl_be_lun.options);
2468 mtx_destroy(&be_lun->queue_lock);
2469 mtx_destroy(&be_lun->io_lock);
2470 free(be_lun, M_CTLBLK);
2479 struct ctl_be_block_lun *be_lun;
2486 be_lun = NULL;
2488 STAILQ_FOREACH(be_lun, &softc->lun_list, links) {
2489 if (be_lun->ctl_be_lun.lun_id == params->lun_id)
2494 if (be_lun == NULL) {
2501 retval = ctl_disable_lun(&be_lun->ctl_be_lun);
2511 retval = ctl_invalidate_lun(&be_lun->ctl_be_lun);
2521 be_lun->flags |= CTL_BE_BLOCK_LUN_WAITING;
2523 while ((be_lun->flags & CTL_BE_BLOCK_LUN_UNCONFIGURED) == 0) {
2524 retval = msleep(be_lun, &softc->lock, PCATCH, "ctlblk", 0);
2529 be_lun->flags &= ~CTL_BE_BLOCK_LUN_WAITING;
2531 if ((be_lun->flags & CTL_BE_BLOCK_LUN_UNCONFIGURED) == 0) {
2538 STAILQ_REMOVE(&softc->lun_list, be_lun, ctl_be_block_lun, links);
2543 taskqueue_drain(be_lun->io_taskqueue, &be_lun->io_task);
2545 taskqueue_free(be_lun->io_taskqueue);
2547 ctl_be_block_close(be_lun);
2549 if (be_lun->disk_stats != NULL)
2550 devstat_remove_entry(be_lun->disk_stats);
2552 uma_zdestroy(be_lun->lun_zone);
2554 ctl_free_opts(&be_lun->ctl_be_lun.options);
2555 free(be_lun->dev_path, M_CTLBLK);
2556 mtx_destroy(&be_lun->queue_lock);
2557 mtx_destroy(&be_lun->io_lock);
2558 free(be_lun, M_CTLBLK);
2572 ctl_be_block_modify_file(struct ctl_be_block_lun *be_lun,
2577 struct ctl_lun_create_params *params = &be_lun->params;
2580 be_lun->size_bytes = params->lun_size_bytes;
2582 vn_lock(be_lun->vn, LK_SHARED | LK_RETRY);
2583 error = VOP_GETATTR(be_lun->vn, &vattr, curthread->td_ucred);
2584 VOP_UNLOCK(be_lun->vn, 0);
2588 be_lun->dev_path);
2592 be_lun->size_bytes = vattr.va_size;
2599 ctl_be_block_modify_dev(struct ctl_be_block_lun *be_lun,
2604 struct ctl_lun_create_params *params = &be_lun->params;
2607 dev_data = &be_lun->backend.dev;
2610 "no d_ioctl for device %s!", be_lun->dev_path);
2620 "on %s!", error, be_lun->dev_path);
2634 be_lun->size_bytes = params->lun_size_bytes;
2636 be_lun->size_bytes = size_bytes;
2646 struct ctl_be_block_lun *be_lun;
2653 be_lun = NULL;
2654 STAILQ_FOREACH(be_lun, &softc->lun_list, links) {
2655 if (be_lun->ctl_be_lun.lun_id == params->lun_id)
2660 if (be_lun == NULL) {
2667 be_lun->params.lun_size_bytes = params->lun_size_bytes;
2669 oldsize = be_lun->size_bytes;
2670 if (be_lun->vn == NULL)
2671 error = ctl_be_block_open(softc, be_lun, req);
2672 else if (be_lun->vn->v_type == VREG)
2673 error = ctl_be_block_modify_file(be_lun, req);
2675 error = ctl_be_block_modify_dev(be_lun, req);
2677 if (error == 0 && be_lun->size_bytes != oldsize) {
2678 be_lun->size_blocks = be_lun->size_bytes >>
2679 be_lun->blocksize_shift;
2687 if (be_lun->unmap != NULL)
2688 be_lun->ctl_be_lun.flags |= CTL_LUN_FLAG_UNMAP;
2689 be_lun->ctl_be_lun.maxlba = (be_lun->size_blocks == 0) ?
2690 0 : (be_lun->size_blocks - 1);
2691 be_lun->ctl_be_lun.blocksize = be_lun->blocksize;
2692 be_lun->ctl_be_lun.pblockexp = be_lun->pblockexp;
2693 be_lun->ctl_be_lun.pblockoff = be_lun->pblockoff;
2694 be_lun->ctl_be_lun.ublockexp = be_lun->ublockexp;
2695 be_lun->ctl_be_lun.ublockoff = be_lun->ublockoff;
2696 be_lun->ctl_be_lun.atomicblock = be_lun->atomicblock;
2697 be_lun->ctl_be_lun.opttxferlen = be_lun->opttxferlen;
2698 ctl_lun_capacity_changed(&be_lun->ctl_be_lun);
2699 if (oldsize == 0 && be_lun->size_blocks != 0)
2700 ctl_lun_online(&be_lun->ctl_be_lun);
2704 params->lun_size_bytes = be_lun->size_bytes;
2717 ctl_be_block_lun_shutdown(void *be_lun)
2722 lun = (struct ctl_be_block_lun *)be_lun;
2735 ctl_be_block_lun_config_status(void *be_lun, ctl_lun_config_status status)
2740 lun = (struct ctl_be_block_lun *)be_lun;
2776 struct ctl_be_block_lun *be_lun;
2786 be_lun = (struct ctl_be_block_lun *)ctl_be_lun->be_lun;
2802 mtx_lock(&be_lun->queue_lock);
2803 STAILQ_INSERT_TAIL(&be_lun->config_write_queue, &io->io_hdr,
2805 mtx_unlock(&be_lun->queue_lock);
2806 taskqueue_enqueue(be_lun->io_taskqueue, &be_lun->io_task);
2857 struct ctl_be_block_lun *be_lun;
2865 be_lun = (struct ctl_be_block_lun *)ctl_be_lun->be_lun;
2870 mtx_lock(&be_lun->queue_lock);
2871 STAILQ_INSERT_TAIL(&be_lun->config_read_queue,
2873 mtx_unlock(&be_lun->queue_lock);
2874 taskqueue_enqueue(be_lun->io_taskqueue,
2875 &be_lun->io_task);
2899 ctl_be_block_lun_info(void *be_lun, struct sbuf *sb)
2904 lun = (struct ctl_be_block_lun *)be_lun;
2925 ctl_be_block_lun_attr(void *be_lun, const char *attrname)
2927 struct ctl_be_block_lun *lun = (struct ctl_be_block_lun *)be_lun;