Lines Matching refs:be_lun

210 ctl_backend_ramdisk_getpage(struct ctl_be_ramdisk_lun *be_lun, off_t pn,  in ctl_backend_ramdisk_getpage()  argument
217 if (be_lun->cap_bytes == 0) { in ctl_backend_ramdisk_getpage()
220 return (be_lun->zero_page); in ctl_backend_ramdisk_getpage()
222 return ((uint8_t *)be_lun->pages); in ctl_backend_ramdisk_getpage()
230 sx_xlock(&be_lun->page_lock); in ctl_backend_ramdisk_getpage()
231 pp = &be_lun->pages; in ctl_backend_ramdisk_getpage()
232 for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) { in ctl_backend_ramdisk_getpage()
241 if (*pp == P_UNMAPPED && be_lun->cap_used < be_lun->cap_bytes) { in ctl_backend_ramdisk_getpage()
243 *pp = malloc(be_lun->pblocksize, M_RAMDISK, in ctl_backend_ramdisk_getpage()
247 be_lun->cap_used += be_lun->pblocksize; in ctl_backend_ramdisk_getpage()
249 *pp = malloc(be_lun->pblocksize, M_RAMDISK, in ctl_backend_ramdisk_getpage()
252 sx_xunlock(&be_lun->page_lock); in ctl_backend_ramdisk_getpage()
255 sx_slock(&be_lun->page_lock); in ctl_backend_ramdisk_getpage()
256 p = be_lun->pages; in ctl_backend_ramdisk_getpage()
257 for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) { in ctl_backend_ramdisk_getpage()
264 sx_sunlock(&be_lun->page_lock); in ctl_backend_ramdisk_getpage()
266 return (be_lun->zero_page); in ctl_backend_ramdisk_getpage()
272 ctl_backend_ramdisk_unmappage(struct ctl_be_ramdisk_lun *be_lun, off_t pn) in ctl_backend_ramdisk_unmappage() argument
278 if (be_lun->cap_bytes == 0) in ctl_backend_ramdisk_unmappage()
280 sx_xlock(&be_lun->page_lock); in ctl_backend_ramdisk_unmappage()
281 pp = &be_lun->pages; in ctl_backend_ramdisk_unmappage()
282 for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) { in ctl_backend_ramdisk_unmappage()
290 be_lun->cap_used -= be_lun->pblocksize; in ctl_backend_ramdisk_unmappage()
294 be_lun->cap_used -= be_lun->pblocksize; in ctl_backend_ramdisk_unmappage()
298 sx_xunlock(&be_lun->page_lock); in ctl_backend_ramdisk_unmappage()
302 ctl_backend_ramdisk_anchorpage(struct ctl_be_ramdisk_lun *be_lun, off_t pn) in ctl_backend_ramdisk_anchorpage() argument
308 if (be_lun->cap_bytes == 0) in ctl_backend_ramdisk_anchorpage()
310 sx_xlock(&be_lun->page_lock); in ctl_backend_ramdisk_anchorpage()
311 pp = &be_lun->pages; in ctl_backend_ramdisk_anchorpage()
312 for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) { in ctl_backend_ramdisk_anchorpage()
319 if (*pp == P_UNMAPPED && be_lun->cap_used < be_lun->cap_bytes) { in ctl_backend_ramdisk_anchorpage()
320 be_lun->cap_used += be_lun->pblocksize; in ctl_backend_ramdisk_anchorpage()
327 sx_xunlock(&be_lun->page_lock); in ctl_backend_ramdisk_anchorpage()
365 struct ctl_be_ramdisk_lun *be_lun = (struct ctl_be_ramdisk_lun *)cbe_lun; in ctl_backend_ramdisk_cmp() local
374 page = ctl_backend_ramdisk_getpage(be_lun, in ctl_backend_ramdisk_cmp()
396 struct ctl_be_ramdisk_lun *be_lun = in ctl_backend_ramdisk_move_done() local
411 mtx_lock(&be_lun->queue_lock); in ctl_backend_ramdisk_move_done()
412 STAILQ_INSERT_TAIL(&be_lun->cont_queue, in ctl_backend_ramdisk_move_done()
414 mtx_unlock(&be_lun->queue_lock); in ctl_backend_ramdisk_move_done()
415 taskqueue_enqueue(be_lun->io_taskqueue, in ctl_backend_ramdisk_move_done()
416 &be_lun->io_task); in ctl_backend_ramdisk_move_done()
449 struct ctl_be_ramdisk_lun *be_lun = (struct ctl_be_ramdisk_lun *)cbe_lun; in ctl_backend_ramdisk_rw() local
460 sgs = (lbas + lbaoff + be_lun->pblockmul - 1) >> cbe_lun->pblockexp; in ctl_backend_ramdisk_rw()
469 page = ctl_backend_ramdisk_getpage(be_lun, in ctl_backend_ramdisk_rw()
479 sg_entries[i].len = MIN(len, be_lun->pblocksize - off); in ctl_backend_ramdisk_rw()
484 page = ctl_backend_ramdisk_getpage(be_lun, in ctl_backend_ramdisk_rw()
527 struct ctl_be_ramdisk_lun *be_lun; in ctl_backend_ramdisk_worker() local
530 be_lun = (struct ctl_be_ramdisk_lun *)context; in ctl_backend_ramdisk_worker()
531 mtx_lock(&be_lun->queue_lock); in ctl_backend_ramdisk_worker()
533 io = (union ctl_io *)STAILQ_FIRST(&be_lun->cont_queue); in ctl_backend_ramdisk_worker()
535 STAILQ_REMOVE_HEAD(&be_lun->cont_queue, links); in ctl_backend_ramdisk_worker()
536 mtx_unlock(&be_lun->queue_lock); in ctl_backend_ramdisk_worker()
541 mtx_lock(&be_lun->queue_lock); in ctl_backend_ramdisk_worker()
551 mtx_unlock(&be_lun->queue_lock); in ctl_backend_ramdisk_worker()
558 struct ctl_be_ramdisk_lun *be_lun = (struct ctl_be_ramdisk_lun *)cbe_lun; in ctl_backend_ramdisk_gls() local
566 scsi_ulto4b(be_lun->pblockmul - lbaoff, data->descr[0].length); in ctl_backend_ramdisk_gls()
567 page = ctl_backend_ramdisk_getpage(be_lun, in ctl_backend_ramdisk_gls()
612 struct ctl_be_ramdisk_lun *be_lun = (struct ctl_be_ramdisk_lun *)cbe_lun; in ramdisk_namespace_data() local
621 nsdata->nsze = htole64(be_lun->size_blocks); in ramdisk_namespace_data()
622 nsdata->ncap = htole64(be_lun->cap_bytes / cbe_lun->blocksize); in ramdisk_namespace_data()
623 nsdata->nuse = htole64(be_lun->cap_used / cbe_lun->blocksize); in ramdisk_namespace_data()
695 struct ctl_be_ramdisk_lun *be_lun = (struct ctl_be_ramdisk_lun *)cbe_lun; in ctl_backend_ramdisk_delete() local
705 page = ctl_backend_ramdisk_getpage(be_lun, p, op); in ctl_backend_ramdisk_delete()
708 min(len, be_lun->pblockmul - lbaoff) * in ctl_backend_ramdisk_delete()
718 page = ctl_backend_ramdisk_getpage(be_lun, lp, op); in ctl_backend_ramdisk_delete()
726 ctl_backend_ramdisk_anchorpage(be_lun, p); in ctl_backend_ramdisk_delete()
729 ctl_backend_ramdisk_unmappage(be_lun, p); in ctl_backend_ramdisk_delete()
737 struct ctl_be_ramdisk_lun *be_lun = (struct ctl_be_ramdisk_lun *)cbe_lun; in ctl_backend_ramdisk_ws() local
764 page = ctl_backend_ramdisk_getpage(be_lun, in ctl_backend_ramdisk_ws()
895 struct ctl_be_ramdisk_lun *be_lun = (struct ctl_be_ramdisk_lun *)cbe_lun; in ctl_backend_ramdisk_wz() local
912 page = ctl_backend_ramdisk_getpage(be_lun, in ctl_backend_ramdisk_wz()
993 struct ctl_be_ramdisk_lun *be_lun = (struct ctl_be_ramdisk_lun *)cbe_lun; in ctl_backend_ramdisk_lun_attr() local
997 if (be_lun->cap_bytes == 0) in ctl_backend_ramdisk_lun_attr()
999 sx_slock(&be_lun->page_lock); in ctl_backend_ramdisk_lun_attr()
1001 val = be_lun->cap_used / be_lun->cbe_lun.blocksize; in ctl_backend_ramdisk_lun_attr()
1003 val = (be_lun->cap_bytes - be_lun->cap_used) / in ctl_backend_ramdisk_lun_attr()
1004 be_lun->cbe_lun.blocksize; in ctl_backend_ramdisk_lun_attr()
1006 sx_sunlock(&be_lun->page_lock); in ctl_backend_ramdisk_lun_attr()
1052 struct ctl_be_ramdisk_lun *be_lun; in ctl_backend_ramdisk_rm() local
1059 SLIST_FOREACH(be_lun, &softc->lun_list, links) { in ctl_backend_ramdisk_rm()
1060 if (be_lun->cbe_lun.lun_id == params->lun_id) { in ctl_backend_ramdisk_rm()
1061 SLIST_REMOVE(&softc->lun_list, be_lun, in ctl_backend_ramdisk_rm()
1069 if (be_lun == NULL) { in ctl_backend_ramdisk_rm()
1085 be_lun->flags |= CTL_BE_RAMDISK_LUN_WAITING; in ctl_backend_ramdisk_rm()
1088 retval = ctl_remove_lun(&be_lun->cbe_lun); in ctl_backend_ramdisk_rm()
1094 be_lun->flags &= ~CTL_BE_RAMDISK_LUN_WAITING; in ctl_backend_ramdisk_rm()
1100 while ((be_lun->flags & CTL_BE_RAMDISK_LUN_UNCONFIGURED) == 0) { in ctl_backend_ramdisk_rm()
1101 retval = msleep(be_lun, &softc->lock, PCATCH, "ctlramrm", 0); in ctl_backend_ramdisk_rm()
1105 be_lun->flags &= ~CTL_BE_RAMDISK_LUN_WAITING; in ctl_backend_ramdisk_rm()
1106 if (be_lun->flags & CTL_BE_RAMDISK_LUN_UNCONFIGURED) { in ctl_backend_ramdisk_rm()
1108 free(be_lun, M_RAMDISK); in ctl_backend_ramdisk_rm()
1126 struct ctl_be_ramdisk_lun *be_lun; in ctl_backend_ramdisk_create() local
1137 be_lun = malloc(sizeof(*be_lun), M_RAMDISK, M_ZERO | M_WAITOK); in ctl_backend_ramdisk_create()
1138 cbe_lun = &be_lun->cbe_lun; in ctl_backend_ramdisk_create()
1140 be_lun->params = req->reqdata.create; in ctl_backend_ramdisk_create()
1141 be_lun->softc = softc; in ctl_backend_ramdisk_create()
1147 be_lun->flags = 0; in ctl_backend_ramdisk_create()
1156 be_lun->pblocksize = PAGE_SIZE; in ctl_backend_ramdisk_create()
1160 be_lun->pblocksize = t; in ctl_backend_ramdisk_create()
1162 if (be_lun->pblocksize < 512 || be_lun->pblocksize > 131072) { in ctl_backend_ramdisk_create()
1165 be_lun->pblocksize); in ctl_backend_ramdisk_create()
1177 be_lun->pblockmul = be_lun->pblocksize / cbe_lun->blocksize; in ctl_backend_ramdisk_create()
1178 if (be_lun->pblockmul < 1 || !powerof2(be_lun->pblockmul)) { in ctl_backend_ramdisk_create()
1182 be_lun->pblocksize, cbe_lun->blocksize); in ctl_backend_ramdisk_create()
1191 be_lun->size_blocks = params->lun_size_bytes / cbe_lun->blocksize; in ctl_backend_ramdisk_create()
1192 be_lun->size_bytes = be_lun->size_blocks * cbe_lun->blocksize; in ctl_backend_ramdisk_create()
1193 be_lun->indir = 0; in ctl_backend_ramdisk_create()
1194 t = be_lun->size_bytes / be_lun->pblocksize; in ctl_backend_ramdisk_create()
1197 be_lun->indir++; in ctl_backend_ramdisk_create()
1199 cbe_lun->maxlba = be_lun->size_blocks - 1; in ctl_backend_ramdisk_create()
1200 cbe_lun->pblockexp = fls(be_lun->pblockmul) - 1; in ctl_backend_ramdisk_create()
1204 cbe_lun->atomicblock = be_lun->pblocksize; in ctl_backend_ramdisk_create()
1205 cbe_lun->opttxferlen = SGPP * be_lun->pblocksize; in ctl_backend_ramdisk_create()
1208 ctl_expand_number(value, &be_lun->cap_bytes); in ctl_backend_ramdisk_create()
1210 be_lun->pblockmul = 1; in ctl_backend_ramdisk_create()
1216 params->lun_size_bytes = be_lun->size_bytes; in ctl_backend_ramdisk_create()
1274 STAILQ_INIT(&be_lun->cont_queue); in ctl_backend_ramdisk_create()
1275 sx_init(&be_lun->page_lock, "ctlram page"); in ctl_backend_ramdisk_create()
1276 if (be_lun->cap_bytes == 0) { in ctl_backend_ramdisk_create()
1277 be_lun->indir = 0; in ctl_backend_ramdisk_create()
1278 be_lun->pages = malloc(be_lun->pblocksize, M_RAMDISK, M_WAITOK); in ctl_backend_ramdisk_create()
1280 be_lun->zero_page = malloc(be_lun->pblocksize, M_RAMDISK, in ctl_backend_ramdisk_create()
1282 mtx_init(&be_lun->queue_lock, "ctlram queue", NULL, MTX_DEF); in ctl_backend_ramdisk_create()
1283 TASK_INIT(&be_lun->io_task, /*priority*/0, ctl_backend_ramdisk_worker, in ctl_backend_ramdisk_create()
1284 be_lun); in ctl_backend_ramdisk_create()
1286 be_lun->io_taskqueue = taskqueue_create("ctlramtq", M_WAITOK, in ctl_backend_ramdisk_create()
1287 taskqueue_thread_enqueue, /*context*/&be_lun->io_taskqueue); in ctl_backend_ramdisk_create()
1288 if (be_lun->io_taskqueue == NULL) { in ctl_backend_ramdisk_create()
1294 retval = taskqueue_start_threads_in_proc(&be_lun->io_taskqueue, in ctl_backend_ramdisk_create()
1302 retval = ctl_add_lun(&be_lun->cbe_lun); in ctl_backend_ramdisk_create()
1313 SLIST_INSERT_HEAD(&softc->lun_list, be_lun, links); in ctl_backend_ramdisk_create()
1323 if (be_lun != NULL) { in ctl_backend_ramdisk_create()
1324 if (be_lun->io_taskqueue != NULL) in ctl_backend_ramdisk_create()
1325 taskqueue_free(be_lun->io_taskqueue); in ctl_backend_ramdisk_create()
1327 free(be_lun->zero_page, M_RAMDISK); in ctl_backend_ramdisk_create()
1328 ctl_backend_ramdisk_freeallpages(be_lun->pages, be_lun->indir); in ctl_backend_ramdisk_create()
1329 sx_destroy(&be_lun->page_lock); in ctl_backend_ramdisk_create()
1330 mtx_destroy(&be_lun->queue_lock); in ctl_backend_ramdisk_create()
1331 free(be_lun, M_RAMDISK); in ctl_backend_ramdisk_create()
1340 struct ctl_be_ramdisk_lun *be_lun; in ctl_backend_ramdisk_modify() local
1350 SLIST_FOREACH(be_lun, &softc->lun_list, links) { in ctl_backend_ramdisk_modify()
1351 if (be_lun->cbe_lun.lun_id == params->lun_id) in ctl_backend_ramdisk_modify()
1355 if (be_lun == NULL) { in ctl_backend_ramdisk_modify()
1361 cbe_lun = &be_lun->cbe_lun; in ctl_backend_ramdisk_modify()
1364 be_lun->params.lun_size_bytes = params->lun_size_bytes; in ctl_backend_ramdisk_modify()
1389 blocksize = be_lun->cbe_lun.blocksize; in ctl_backend_ramdisk_modify()
1390 if (be_lun->params.lun_size_bytes < blocksize) { in ctl_backend_ramdisk_modify()
1393 be_lun->params.lun_size_bytes, blocksize); in ctl_backend_ramdisk_modify()
1396 be_lun->size_blocks = be_lun->params.lun_size_bytes / blocksize; in ctl_backend_ramdisk_modify()
1397 be_lun->size_bytes = be_lun->size_blocks * blocksize; in ctl_backend_ramdisk_modify()
1398 be_lun->cbe_lun.maxlba = be_lun->size_blocks - 1; in ctl_backend_ramdisk_modify()
1399 ctl_lun_capacity_changed(&be_lun->cbe_lun); in ctl_backend_ramdisk_modify()
1402 params->lun_size_bytes = be_lun->size_bytes; in ctl_backend_ramdisk_modify()
1417 struct ctl_be_ramdisk_lun *be_lun = (struct ctl_be_ramdisk_lun *)cbe_lun; in ctl_backend_ramdisk_lun_shutdown() local
1418 struct ctl_be_ramdisk_softc *softc = be_lun->softc; in ctl_backend_ramdisk_lun_shutdown()
1420 taskqueue_drain_all(be_lun->io_taskqueue); in ctl_backend_ramdisk_lun_shutdown()
1421 taskqueue_free(be_lun->io_taskqueue); in ctl_backend_ramdisk_lun_shutdown()
1422 nvlist_destroy(be_lun->cbe_lun.options); in ctl_backend_ramdisk_lun_shutdown()
1423 free(be_lun->zero_page, M_RAMDISK); in ctl_backend_ramdisk_lun_shutdown()
1424 ctl_backend_ramdisk_freeallpages(be_lun->pages, be_lun->indir); in ctl_backend_ramdisk_lun_shutdown()
1425 sx_destroy(&be_lun->page_lock); in ctl_backend_ramdisk_lun_shutdown()
1426 mtx_destroy(&be_lun->queue_lock); in ctl_backend_ramdisk_lun_shutdown()
1429 be_lun->flags |= CTL_BE_RAMDISK_LUN_UNCONFIGURED; in ctl_backend_ramdisk_lun_shutdown()
1430 if (be_lun->flags & CTL_BE_RAMDISK_LUN_WAITING) in ctl_backend_ramdisk_lun_shutdown()
1431 wakeup(be_lun); in ctl_backend_ramdisk_lun_shutdown()
1433 free(be_lun, M_RAMDISK); in ctl_backend_ramdisk_lun_shutdown()