Lines Matching refs:lsp

236 lofi_free_comp_cache(struct lofi_state *lsp)  in lofi_free_comp_cache()  argument
240 while ((lc = list_remove_head(&lsp->ls_comp_cache)) != NULL) { in lofi_free_comp_cache()
241 kmem_free(lc->lc_data, lsp->ls_uncomp_seg_sz); in lofi_free_comp_cache()
243 lsp->ls_comp_cache_count--; in lofi_free_comp_cache()
245 ASSERT(lsp->ls_comp_cache_count == 0); in lofi_free_comp_cache()
249 is_opened(struct lofi_state *lsp) in is_opened() argument
252 return (lsp->ls_chr_open || lsp->ls_blk_open || lsp->ls_lyr_open_count); in is_opened()
256 mark_opened(struct lofi_state *lsp, int otyp) in mark_opened() argument
261 lsp->ls_chr_open = 1; in mark_opened()
264 lsp->ls_blk_open = 1; in mark_opened()
267 lsp->ls_lyr_open_count++; in mark_opened()
276 mark_closed(struct lofi_state *lsp, int otyp) in mark_closed() argument
281 lsp->ls_chr_open = 0; in mark_closed()
284 lsp->ls_blk_open = 0; in mark_closed()
287 lsp->ls_lyr_open_count--; in mark_closed()
295 lofi_free_crypto(struct lofi_state *lsp) in lofi_free_crypto() argument
299 if (lsp->ls_crypto_enabled) { in lofi_free_crypto()
304 if (lsp->ls_key.ck_data != NULL) { in lofi_free_crypto()
305 bzero(lsp->ls_key.ck_data, in lofi_free_crypto()
306 CRYPTO_BITS2BYTES(lsp->ls_key.ck_length)); in lofi_free_crypto()
307 kmem_free(lsp->ls_key.ck_data, in lofi_free_crypto()
308 CRYPTO_BITS2BYTES(lsp->ls_key.ck_length)); in lofi_free_crypto()
309 lsp->ls_key.ck_data = NULL; in lofi_free_crypto()
310 lsp->ls_key.ck_length = 0; in lofi_free_crypto()
313 if (lsp->ls_mech.cm_param != NULL) { in lofi_free_crypto()
314 kmem_free(lsp->ls_mech.cm_param, in lofi_free_crypto()
315 lsp->ls_mech.cm_param_len); in lofi_free_crypto()
316 lsp->ls_mech.cm_param = NULL; in lofi_free_crypto()
317 lsp->ls_mech.cm_param_len = 0; in lofi_free_crypto()
320 if (lsp->ls_iv_mech.cm_param != NULL) { in lofi_free_crypto()
321 kmem_free(lsp->ls_iv_mech.cm_param, in lofi_free_crypto()
322 lsp->ls_iv_mech.cm_param_len); in lofi_free_crypto()
323 lsp->ls_iv_mech.cm_param = NULL; in lofi_free_crypto()
324 lsp->ls_iv_mech.cm_param_len = 0; in lofi_free_crypto()
327 mutex_destroy(&lsp->ls_crypto_lock); in lofi_free_crypto()
332 lofi_destroy(struct lofi_state *lsp, cred_t *credp) in lofi_destroy() argument
334 minor_t minor = getminor(lsp->ls_dev); in lofi_destroy()
339 list_remove(&lofi_list, lsp); in lofi_destroy()
341 lofi_free_crypto(lsp); in lofi_destroy()
346 if (lsp->ls_comp_bufs != NULL) { in lofi_destroy()
348 if (lsp->ls_comp_bufs[i].bufsize > 0) in lofi_destroy()
349 kmem_free(lsp->ls_comp_bufs[i].buf, in lofi_destroy()
350 lsp->ls_comp_bufs[i].bufsize); in lofi_destroy()
352 kmem_free(lsp->ls_comp_bufs, in lofi_destroy()
356 (void) VOP_CLOSE(lsp->ls_vp, lsp->ls_openflag, in lofi_destroy()
358 VN_RELE(lsp->ls_vp); in lofi_destroy()
359 if (lsp->ls_stacked_vp != lsp->ls_vp) in lofi_destroy()
360 VN_RELE(lsp->ls_stacked_vp); in lofi_destroy()
362 taskq_destroy(lsp->ls_taskq); in lofi_destroy()
364 if (lsp->ls_kstat != NULL) in lofi_destroy()
365 kstat_delete(lsp->ls_kstat); in lofi_destroy()
370 lofi_free_comp_cache(lsp); in lofi_destroy()
371 list_destroy(&lsp->ls_comp_cache); in lofi_destroy()
373 if (lsp->ls_uncomp_seg_sz > 0) { in lofi_destroy()
374 kmem_free(lsp->ls_comp_index_data, lsp->ls_comp_index_data_sz); in lofi_destroy()
375 lsp->ls_uncomp_seg_sz = 0; in lofi_destroy()
378 rctl_decr_lofi(lsp->ls_zone.zref_zone, 1); in lofi_destroy()
379 zone_rele_ref(&lsp->ls_zone, ZONE_REF_LOFI); in lofi_destroy()
381 mutex_destroy(&lsp->ls_comp_cache_lock); in lofi_destroy()
382 mutex_destroy(&lsp->ls_comp_bufs_lock); in lofi_destroy()
383 mutex_destroy(&lsp->ls_kstat_lock); in lofi_destroy()
384 mutex_destroy(&lsp->ls_vp_lock); in lofi_destroy()
386 ASSERT(ddi_get_soft_state(lofi_statep, minor) == lsp); in lofi_destroy()
413 struct lofi_state *lsp; in lofi_zone_shutdown() local
418 for (lsp = list_head(&lofi_list); lsp != NULL; lsp = next) { in lofi_zone_shutdown()
421 next = list_next(&lofi_list, lsp); in lofi_zone_shutdown()
423 if (lsp->ls_zone.zref_zone->zone_id != zoneid) in lofi_zone_shutdown()
432 if (is_opened(lsp)) { in lofi_zone_shutdown()
433 lsp->ls_cleanup = 1; in lofi_zone_shutdown()
435 lofi_free_dev(lsp->ls_dev); in lofi_zone_shutdown()
436 lofi_destroy(lsp, kcred); in lofi_zone_shutdown()
448 struct lofi_state *lsp; in lofi_open() local
467 lsp = ddi_get_soft_state(lofi_statep, minor); in lofi_open()
468 if (lsp == NULL) { in lofi_open()
473 if (lsp->ls_vp == NULL) { in lofi_open()
478 if (lsp->ls_readonly && (flag & FWRITE)) { in lofi_open()
483 if (mark_opened(lsp, otyp) == -1) { in lofi_open()
497 struct lofi_state *lsp; in lofi_close() local
501 lsp = ddi_get_soft_state(lofi_statep, minor); in lofi_close()
502 if (lsp == NULL) { in lofi_close()
512 mark_closed(lsp, otyp); in lofi_close()
519 if (!is_opened(lsp) && (lsp->ls_cleanup || lsp->ls_vp == NULL)) { in lofi_close()
520 lofi_free_dev(lsp->ls_dev); in lofi_close()
521 lofi_destroy(lsp, credp); in lofi_close()
536 lofi_blk_mech(struct lofi_state *lsp, longlong_t lblkno) in lofi_blk_mech() argument
546 ASSERT(MUTEX_HELD(&lsp->ls_crypto_lock)); in lofi_blk_mech()
548 if (lsp == NULL) in lofi_blk_mech()
552 if (lsp->ls_iv_type == IVM_NONE) { in lofi_blk_mech()
560 if (lsp->ls_mech.cm_param == NULL || in lofi_blk_mech()
561 lsp->ls_mech.cm_param_len != lsp->ls_iv_len) { in lofi_blk_mech()
562 iv_len = lsp->ls_iv_len; in lofi_blk_mech()
565 iv_len = lsp->ls_mech.cm_param_len; in lofi_blk_mech()
566 iv = lsp->ls_mech.cm_param; in lofi_blk_mech()
570 switch (lsp->ls_iv_type) { in lofi_blk_mech()
593 ret = crypto_encrypt(&lsp->ls_iv_mech, &cdata, &lsp->ls_key, in lofi_blk_mech()
598 if (lsp->ls_mech.cm_param != iv) in lofi_blk_mech()
605 if (lsp->ls_mech.cm_param != NULL && lsp->ls_mech.cm_param != iv) in lofi_blk_mech()
606 kmem_free(lsp->ls_mech.cm_param, lsp->ls_mech.cm_param_len); in lofi_blk_mech()
608 lsp->ls_mech.cm_param_len = iv_len; in lofi_blk_mech()
609 lsp->ls_mech.cm_param = iv; in lofi_blk_mech()
620 lofi_crypto(struct lofi_state *lsp, struct buf *bp, caddr_t plaintext, in lofi_crypto() argument
628 mutex_enter(&lsp->ls_crypto_lock); in lofi_crypto()
642 ret = lofi_blk_mech(lsp, lblkno); in lofi_crypto()
647 ret = crypto_encrypt(&lsp->ls_mech, &cdata, in lofi_crypto()
648 &lsp->ls_key, NULL, in lofi_crypto()
651 ret = crypto_decrypt(&lsp->ls_mech, &cdata, in lofi_crypto()
652 &lsp->ls_key, NULL, in lofi_crypto()
662 mutex_exit(&lsp->ls_crypto_lock); in lofi_crypto()
678 struct lofi_state *lsp, size_t len, int method, caddr_t bcopy_locn) in lofi_rdwr() argument
697 error = vn_rdwr(UIO_READ, lsp->ls_vp, bufaddr, len, in lofi_rdwr()
702 if (lsp->ls_crypto_enabled && error == 0) { in lofi_rdwr()
703 if (lofi_crypto(lsp, bp, bufaddr, NULL, len, in lofi_rdwr()
719 if (lsp->ls_crypto_enabled) { in lofi_rdwr()
722 if (lofi_crypto(lsp, bp, bufaddr, iobuf, len, in lofi_rdwr()
735 error = vn_rdwr(UIO_WRITE, lsp->ls_vp, iobuf, len, in lofi_rdwr()
740 if (lsp->ls_crypto_enabled) { in lofi_rdwr()
749 struct lofi_state *lsp) in lofi_mapped_rdwr() argument
765 if (lsp->ls_crypto_enabled) in lofi_mapped_rdwr()
766 ASSERT(lsp->ls_vp_comp_size == lsp->ls_vp_size); in lofi_mapped_rdwr()
803 xfersize = MIN(lsp->ls_vp_comp_size - offset, in lofi_mapped_rdwr()
806 mapaddr = segmap_getmapflt(segkmap, lsp->ls_vp, in lofi_mapped_rdwr()
827 error = lofi_rdwr(bufaddr, 0, bp, lsp, xfersize, in lofi_mapped_rdwr()
863 (offset < lsp->ls_vp_comp_size)); in lofi_mapped_rdwr()
877 lofi_find_comp_data(struct lofi_state *lsp, uint64_t seg_index) in lofi_find_comp_data() argument
881 ASSERT(MUTEX_HELD(&lsp->ls_comp_cache_lock)); in lofi_find_comp_data()
883 for (lc = list_head(&lsp->ls_comp_cache); lc != NULL; in lofi_find_comp_data()
884 lc = list_next(&lsp->ls_comp_cache, lc)) { in lofi_find_comp_data()
893 list_remove(&lsp->ls_comp_cache, lc); in lofi_find_comp_data()
894 list_insert_head(&lsp->ls_comp_cache, lc); in lofi_find_comp_data()
910 lofi_add_comp_data(struct lofi_state *lsp, uint64_t seg_index, in lofi_add_comp_data() argument
915 ASSERT(MUTEX_HELD(&lsp->ls_comp_cache_lock)); in lofi_add_comp_data()
917 while (lsp->ls_comp_cache_count > lofi_max_comp_cache) { in lofi_add_comp_data()
918 lc = list_remove_tail(&lsp->ls_comp_cache); in lofi_add_comp_data()
920 kmem_free(lc->lc_data, lsp->ls_uncomp_seg_sz); in lofi_add_comp_data()
922 lsp->ls_comp_cache_count--; in lofi_add_comp_data()
940 if (lsp->ls_comp_cache_count < lofi_max_comp_cache) { in lofi_add_comp_data()
943 list_insert_head(&lsp->ls_comp_cache, lc); in lofi_add_comp_data()
944 lsp->ls_comp_cache_count++; in lofi_add_comp_data()
946 lc = list_remove_tail(&lsp->ls_comp_cache); in lofi_add_comp_data()
949 list_insert_head(&lsp->ls_comp_cache, lc); in lofi_add_comp_data()
957 kmem_free(lc->lc_data, lsp->ls_uncomp_seg_sz); in lofi_add_comp_data()
1009 struct lofi_state *lsp; in lofi_strategy_task() local
1016 lsp = ddi_get_soft_state(lofi_statep, getminor(bp->b_edev)); in lofi_strategy_task()
1017 if (lsp == NULL) { in lofi_strategy_task()
1021 if (lsp->ls_kstat) { in lofi_strategy_task()
1022 mutex_enter(lsp->ls_kstat->ks_lock); in lofi_strategy_task()
1023 kstat_waitq_to_runq(KSTAT_IO_PTR(lsp->ls_kstat)); in lofi_strategy_task()
1024 mutex_exit(lsp->ls_kstat->ks_lock); in lofi_strategy_task()
1029 if (lsp->ls_crypto_enabled) { in lofi_strategy_task()
1031 offset += lsp->ls_crypto_offset; in lofi_strategy_task()
1036 if (lsp->ls_vp == NULL || lsp->ls_vp_closereq) { in lofi_strategy_task()
1056 if ((lsp->ls_vp->v_flag & VNOMAP) || (lsp->ls_vp->v_type == VCHR) || in lofi_strategy_task()
1057 lsp->ls_crypto_enabled) { in lofi_strategy_task()
1058 error = lofi_rdwr(bufaddr, offset, bp, lsp, len, RDWR_RAW, in lofi_strategy_task()
1060 } else if (lsp->ls_uncomp_seg_sz == 0) { in lofi_strategy_task()
1061 error = lofi_mapped_rdwr(bufaddr, offset, bp, lsp); in lofi_strategy_task()
1081 ASSERT(!lsp->ls_crypto_enabled); in lofi_strategy_task()
1093 ASSERT(lsp->ls_comp_algorithm_index >= 0); in lofi_strategy_task()
1094 li = &lofi_compress_table[lsp->ls_comp_algorithm_index]; in lofi_strategy_task()
1101 sblkno = offset >> lsp->ls_comp_seg_shift; in lofi_strategy_task()
1102 sblkoff = offset & (lsp->ls_uncomp_seg_sz - 1); in lofi_strategy_task()
1103 eblkno = (offset + bp->b_bcount) >> lsp->ls_comp_seg_shift; in lofi_strategy_task()
1104 eblkoff = (offset + bp->b_bcount) & (lsp->ls_uncomp_seg_sz - 1); in lofi_strategy_task()
1119 mutex_enter(&lsp->ls_comp_cache_lock); in lofi_strategy_task()
1120 lc = lofi_find_comp_data(lsp, sblkno); in lofi_strategy_task()
1128 mutex_exit(&lsp->ls_comp_cache_lock); in lofi_strategy_task()
1133 mutex_exit(&lsp->ls_comp_cache_lock); in lofi_strategy_task()
1139 salign = lsp->ls_comp_seg_index[sblkno]; in lofi_strategy_task()
1142 if (eblkno >= (lsp->ls_comp_index_sz - 1)) { in lofi_strategy_task()
1150 (lsp->ls_uncomp_last_seg_sz - 1); in lofi_strategy_task()
1151 ealign = lsp->ls_vp_comp_size; in lofi_strategy_task()
1153 ealign = lsp->ls_comp_seg_index[eblkno + 1]; in lofi_strategy_task()
1172 mutex_enter(&lsp->ls_comp_bufs_lock); in lofi_strategy_task()
1174 if (lsp->ls_comp_bufs[j].inuse == 0) { in lofi_strategy_task()
1175 lsp->ls_comp_bufs[j].inuse = 1; in lofi_strategy_task()
1180 mutex_exit(&lsp->ls_comp_bufs_lock); in lofi_strategy_task()
1188 if (lsp->ls_comp_bufs[j].bufsize < bp->b_bcount) { in lofi_strategy_task()
1189 if (lsp->ls_comp_bufs[j].bufsize > 0) in lofi_strategy_task()
1190 kmem_free(lsp->ls_comp_bufs[j].buf, in lofi_strategy_task()
1191 lsp->ls_comp_bufs[j].bufsize); in lofi_strategy_task()
1192 lsp->ls_comp_bufs[j].buf = kmem_alloc(bp->b_bcount, in lofi_strategy_task()
1194 lsp->ls_comp_bufs[j].bufsize = bp->b_bcount; in lofi_strategy_task()
1196 compressed_seg = lsp->ls_comp_bufs[j].buf; in lofi_strategy_task()
1202 bp, lsp); in lofi_strategy_task()
1214 ASSERT(i < lsp->ls_comp_index_sz - 1); in lofi_strategy_task()
1222 if (i == (lsp->ls_comp_index_sz - 2)) { in lofi_strategy_task()
1223 seglen = lsp->ls_uncomp_last_seg_sz; in lofi_strategy_task()
1225 seglen = lsp->ls_uncomp_seg_sz; in lofi_strategy_task()
1236 cmpbytes = lsp->ls_comp_seg_index[i + 1] - in lofi_strategy_task()
1237 lsp->ls_comp_seg_index[i]; in lofi_strategy_task()
1258 kmem_alloc(lsp->ls_uncomp_seg_sz, in lofi_strategy_task()
1275 xfersize = lsp->ls_uncomp_seg_sz - sblkoff; in lofi_strategy_task()
1277 xfersize -= (lsp->ls_uncomp_seg_sz - eblkoff); in lofi_strategy_task()
1304 mutex_enter(&lsp->ls_comp_cache_lock); in lofi_strategy_task()
1305 if ((lc = lofi_add_comp_data(lsp, uncompressed_seg_index, in lofi_strategy_task()
1309 mutex_exit(&lsp->ls_comp_cache_lock); in lofi_strategy_task()
1313 mutex_enter(&lsp->ls_comp_bufs_lock); in lofi_strategy_task()
1314 lsp->ls_comp_bufs[j].inuse = 0; in lofi_strategy_task()
1315 mutex_exit(&lsp->ls_comp_bufs_lock); in lofi_strategy_task()
1318 kmem_free(uncompressed_seg, lsp->ls_uncomp_seg_sz); in lofi_strategy_task()
1322 error = VOP_FSYNC(lsp->ls_vp, syncflag, kcred, NULL); in lofi_strategy_task()
1325 if (bufinited && lsp->ls_kstat) { in lofi_strategy_task()
1329 mutex_enter(lsp->ls_kstat->ks_lock); in lofi_strategy_task()
1330 kioptr = KSTAT_IO_PTR(lsp->ls_kstat); in lofi_strategy_task()
1339 mutex_exit(lsp->ls_kstat->ks_lock); in lofi_strategy_task()
1342 mutex_enter(&lsp->ls_vp_lock); in lofi_strategy_task()
1343 if (--lsp->ls_vp_iocount == 0) in lofi_strategy_task()
1344 cv_broadcast(&lsp->ls_vp_cv); in lofi_strategy_task()
1345 mutex_exit(&lsp->ls_vp_lock); in lofi_strategy_task()
1354 struct lofi_state *lsp; in lofi_strategy() local
1368 lsp = ddi_get_soft_state(lofi_statep, getminor(bp->b_edev)); in lofi_strategy()
1369 if (lsp == NULL) { in lofi_strategy()
1375 mutex_enter(&lsp->ls_vp_lock); in lofi_strategy()
1376 if (lsp->ls_vp == NULL || lsp->ls_vp_closereq) { in lofi_strategy()
1379 mutex_exit(&lsp->ls_vp_lock); in lofi_strategy()
1384 if (lsp->ls_crypto_enabled) { in lofi_strategy()
1386 offset += lsp->ls_crypto_offset; in lofi_strategy()
1388 if (offset == lsp->ls_vp_size) { in lofi_strategy()
1398 mutex_exit(&lsp->ls_vp_lock); in lofi_strategy()
1401 if (offset > lsp->ls_vp_size) { in lofi_strategy()
1404 mutex_exit(&lsp->ls_vp_lock); in lofi_strategy()
1407 lsp->ls_vp_iocount++; in lofi_strategy()
1408 mutex_exit(&lsp->ls_vp_lock); in lofi_strategy()
1410 if (lsp->ls_kstat) { in lofi_strategy()
1411 mutex_enter(lsp->ls_kstat->ks_lock); in lofi_strategy()
1412 kstat_waitq_enter(KSTAT_IO_PTR(lsp->ls_kstat)); in lofi_strategy()
1413 mutex_exit(lsp->ls_kstat->ks_lock); in lofi_strategy()
1415 (void) taskq_dispatch(lsp->ls_taskq, lofi_strategy_task, bp, KM_SLEEP); in lofi_strategy()
1617 lofi_access(struct lofi_state *lsp) in lofi_access() argument
1620 if (INGLOBALZONE(curproc) || lsp->ls_zone.zref_zone == curzone) in lofi_access()
1633 struct lofi_state *lsp; in file_to_lofi_nocheck() local
1653 for (lsp = list_head(&lofi_list); lsp != NULL; in file_to_lofi_nocheck()
1654 lsp = list_next(&lofi_list, lsp)) { in file_to_lofi_nocheck()
1655 if (lsp->ls_vp == vp) { in file_to_lofi_nocheck()
1657 *lspp = lsp; in file_to_lofi_nocheck()
1658 if (lsp->ls_readonly) { in file_to_lofi_nocheck()
1717 fake_disk_geometry(struct lofi_state *lsp) in fake_disk_geometry() argument
1719 u_offset_t dsize = lsp->ls_vp_size - lsp->ls_crypto_offset; in fake_disk_geometry()
1734 lsp->ls_dkg.dkg_ncyl = dsize / (100 * 1024); in fake_disk_geometry()
1736 lsp->ls_dkg.dkg_ncyl = dsize / (300 * 1024); in fake_disk_geometry()
1738 if (lsp->ls_dkg.dkg_ncyl == 0) in fake_disk_geometry()
1739 lsp->ls_dkg.dkg_ncyl = 1; in fake_disk_geometry()
1740 lsp->ls_dkg.dkg_acyl = 0; in fake_disk_geometry()
1741 lsp->ls_dkg.dkg_bcyl = 0; in fake_disk_geometry()
1742 lsp->ls_dkg.dkg_nhead = 1; in fake_disk_geometry()
1743 lsp->ls_dkg.dkg_obs1 = 0; in fake_disk_geometry()
1744 lsp->ls_dkg.dkg_intrlv = 0; in fake_disk_geometry()
1745 lsp->ls_dkg.dkg_obs2 = 0; in fake_disk_geometry()
1746 lsp->ls_dkg.dkg_obs3 = 0; in fake_disk_geometry()
1747 lsp->ls_dkg.dkg_apc = 0; in fake_disk_geometry()
1748 lsp->ls_dkg.dkg_rpm = 7200; in fake_disk_geometry()
1749 lsp->ls_dkg.dkg_pcyl = lsp->ls_dkg.dkg_ncyl + lsp->ls_dkg.dkg_acyl; in fake_disk_geometry()
1750 lsp->ls_dkg.dkg_nsect = dsize / (DEV_BSIZE * lsp->ls_dkg.dkg_ncyl); in fake_disk_geometry()
1751 lsp->ls_dkg.dkg_write_reinstruct = 0; in fake_disk_geometry()
1752 lsp->ls_dkg.dkg_read_reinstruct = 0; in fake_disk_geometry()
1755 bzero(&lsp->ls_vtoc, sizeof (struct vtoc)); in fake_disk_geometry()
1756 lsp->ls_vtoc.v_sanity = VTOC_SANE; in fake_disk_geometry()
1757 lsp->ls_vtoc.v_version = V_VERSION; in fake_disk_geometry()
1758 (void) strncpy(lsp->ls_vtoc.v_volume, LOFI_DRIVER_NAME, in fake_disk_geometry()
1759 sizeof (lsp->ls_vtoc.v_volume)); in fake_disk_geometry()
1760 lsp->ls_vtoc.v_sectorsz = DEV_BSIZE; in fake_disk_geometry()
1761 lsp->ls_vtoc.v_nparts = 1; in fake_disk_geometry()
1762 lsp->ls_vtoc.v_part[0].p_tag = V_UNASSIGNED; in fake_disk_geometry()
1768 if (lsp->ls_uncomp_seg_sz > 0) { in fake_disk_geometry()
1769 lsp->ls_vtoc.v_part[0].p_flag = V_UNMNT | V_RONLY; in fake_disk_geometry()
1771 lsp->ls_vtoc.v_part[0].p_flag = V_UNMNT; in fake_disk_geometry()
1773 lsp->ls_vtoc.v_part[0].p_start = (daddr_t)0; in fake_disk_geometry()
1780 lsp->ls_vtoc.v_part[0].p_size = lsp->ls_dkg.dkg_pcyl * in fake_disk_geometry()
1781 lsp->ls_dkg.dkg_nsect * lsp->ls_dkg.dkg_nhead; in fake_disk_geometry()
1784 bzero(&lsp->ls_ci, sizeof (struct dk_cinfo)); in fake_disk_geometry()
1785 (void) strcpy(lsp->ls_ci.dki_cname, LOFI_DRIVER_NAME); in fake_disk_geometry()
1786 lsp->ls_ci.dki_ctype = DKC_MD; in fake_disk_geometry()
1787 lsp->ls_ci.dki_flags = 0; in fake_disk_geometry()
1788 lsp->ls_ci.dki_cnum = 0; in fake_disk_geometry()
1789 lsp->ls_ci.dki_addr = 0; in fake_disk_geometry()
1790 lsp->ls_ci.dki_space = 0; in fake_disk_geometry()
1791 lsp->ls_ci.dki_prio = 0; in fake_disk_geometry()
1792 lsp->ls_ci.dki_vec = 0; in fake_disk_geometry()
1793 (void) strcpy(lsp->ls_ci.dki_dname, LOFI_DRIVER_NAME); in fake_disk_geometry()
1794 lsp->ls_ci.dki_unit = 0; in fake_disk_geometry()
1795 lsp->ls_ci.dki_slave = 0; in fake_disk_geometry()
1796 lsp->ls_ci.dki_partition = 0; in fake_disk_geometry()
1803 lsp->ls_ci.dki_maxtransfer = 16; in fake_disk_geometry()
1823 lofi_map_compressed_file(struct lofi_state *lsp, char *buf) in lofi_map_compressed_file() argument
1832 tbuf += sizeof (lsp->ls_comp_algorithm); in lofi_map_compressed_file()
1833 bcopy(tbuf, &(lsp->ls_uncomp_seg_sz), sizeof (lsp->ls_uncomp_seg_sz)); in lofi_map_compressed_file()
1834 lsp->ls_uncomp_seg_sz = ntohl(lsp->ls_uncomp_seg_sz); in lofi_map_compressed_file()
1839 if (lsp->ls_uncomp_seg_sz < DEV_BSIZE || in lofi_map_compressed_file()
1840 !ISP2(lsp->ls_uncomp_seg_sz)) in lofi_map_compressed_file()
1843 for (i = 0; !((lsp->ls_uncomp_seg_sz >> i) & 1); i++) in lofi_map_compressed_file()
1846 lsp->ls_comp_seg_shift = i; in lofi_map_compressed_file()
1848 tbuf += sizeof (lsp->ls_uncomp_seg_sz); in lofi_map_compressed_file()
1849 bcopy(tbuf, &(lsp->ls_comp_index_sz), sizeof (lsp->ls_comp_index_sz)); in lofi_map_compressed_file()
1850 lsp->ls_comp_index_sz = ntohl(lsp->ls_comp_index_sz); in lofi_map_compressed_file()
1852 tbuf += sizeof (lsp->ls_comp_index_sz); in lofi_map_compressed_file()
1853 bcopy(tbuf, &(lsp->ls_uncomp_last_seg_sz), in lofi_map_compressed_file()
1854 sizeof (lsp->ls_uncomp_last_seg_sz)); in lofi_map_compressed_file()
1855 lsp->ls_uncomp_last_seg_sz = ntohl(lsp->ls_uncomp_last_seg_sz); in lofi_map_compressed_file()
1864 lsp->ls_vp_size = in lofi_map_compressed_file()
1865 (u_offset_t)(lsp->ls_comp_index_sz - 2) * lsp->ls_uncomp_seg_sz in lofi_map_compressed_file()
1866 + lsp->ls_uncomp_last_seg_sz; in lofi_map_compressed_file()
1872 index_sz = sizeof (*lsp->ls_comp_seg_index) * lsp->ls_comp_index_sz; in lofi_map_compressed_file()
1873 header_len = sizeof (lsp->ls_comp_algorithm) + in lofi_map_compressed_file()
1874 sizeof (lsp->ls_uncomp_seg_sz) + in lofi_map_compressed_file()
1875 sizeof (lsp->ls_comp_index_sz) + in lofi_map_compressed_file()
1876 sizeof (lsp->ls_uncomp_last_seg_sz); in lofi_map_compressed_file()
1877 lsp->ls_comp_offbase = header_len + index_sz; in lofi_map_compressed_file()
1882 lsp->ls_comp_index_data = kmem_alloc(index_sz, KM_SLEEP); in lofi_map_compressed_file()
1883 lsp->ls_comp_index_data_sz = index_sz; in lofi_map_compressed_file()
1890 error = vn_rdwr(rw, lsp->ls_vp, lsp->ls_comp_index_data, index_sz, in lofi_map_compressed_file()
1897 lsp->ls_comp_seg_index = in lofi_map_compressed_file()
1899 (uint64_t *)(lsp->ls_comp_index_data + header_len); in lofi_map_compressed_file()
1905 for (i = 0; i < lsp->ls_comp_index_sz; i++) { in lofi_map_compressed_file()
1906 lsp->ls_comp_seg_index[i] = lsp->ls_comp_offbase + in lofi_map_compressed_file()
1907 BE_64(lsp->ls_comp_seg_index[i]); in lofi_map_compressed_file()
1914 lofi_init_crypto(struct lofi_state *lsp, struct lofi_ioctl *klip) in lofi_init_crypto() argument
1936 lsp->ls_crypto_enabled = klip->li_crypto_enabled; in lofi_init_crypto()
1938 mutex_init(&lsp->ls_crypto_lock, NULL, MUTEX_DRIVER, NULL); in lofi_init_crypto()
1940 lsp->ls_mech.cm_type = crypto_mech2id(klip->li_cipher); in lofi_init_crypto()
1941 if (lsp->ls_mech.cm_type == CRYPTO_MECH_INVALID) { in lofi_init_crypto()
1948 lsp->ls_mech.cm_param = NULL; in lofi_init_crypto()
1949 lsp->ls_mech.cm_param_len = 0; in lofi_init_crypto()
1951 lsp->ls_iv_type = klip->li_iv_type; in lofi_init_crypto()
1952 lsp->ls_iv_mech.cm_type = crypto_mech2id(klip->li_iv_cipher); in lofi_init_crypto()
1953 if (lsp->ls_iv_mech.cm_type == CRYPTO_MECH_INVALID) { in lofi_init_crypto()
1960 lsp->ls_iv_mech.cm_param = NULL; in lofi_init_crypto()
1961 lsp->ls_iv_mech.cm_param_len = 0; in lofi_init_crypto()
1962 lsp->ls_iv_len = klip->li_iv_len; in lofi_init_crypto()
1968 lsp->ls_key.ck_format = CRYPTO_KEY_RAW; in lofi_init_crypto()
1969 lsp->ls_key.ck_length = klip->li_key_len; in lofi_init_crypto()
1970 lsp->ls_key.ck_data = kmem_alloc( in lofi_init_crypto()
1971 CRYPTO_BITS2BYTES(lsp->ls_key.ck_length), KM_SLEEP); in lofi_init_crypto()
1972 bcopy(klip->li_key, lsp->ls_key.ck_data, in lofi_init_crypto()
1973 CRYPTO_BITS2BYTES(lsp->ls_key.ck_length)); in lofi_init_crypto()
1975 ret = crypto_key_check(&lsp->ls_mech, &lsp->ls_key); in lofi_init_crypto()
1983 error = vn_rdwr(UIO_READ, lsp->ls_vp, buf, DEV_BSIZE, in lofi_init_crypto()
2005 bcopy(marker, lsp->ls_crypto.magic, in lofi_init_crypto()
2006 sizeof (lsp->ls_crypto.magic)); in lofi_init_crypto()
2007 marker += sizeof (lsp->ls_crypto.magic); in lofi_init_crypto()
2010 bcopy(marker, &(lsp->ls_crypto.version), in lofi_init_crypto()
2011 sizeof (lsp->ls_crypto.version)); in lofi_init_crypto()
2012 lsp->ls_crypto.version = ntohs(lsp->ls_crypto.version); in lofi_init_crypto()
2013 marker += sizeof (lsp->ls_crypto.version); in lofi_init_crypto()
2016 bcopy(marker, lsp->ls_crypto.reserved1, in lofi_init_crypto()
2017 sizeof (lsp->ls_crypto.reserved1)); in lofi_init_crypto()
2018 marker += sizeof (lsp->ls_crypto.reserved1); in lofi_init_crypto()
2021 bcopy(marker, &(lsp->ls_crypto.data_sector), in lofi_init_crypto()
2022 sizeof (lsp->ls_crypto.data_sector)); in lofi_init_crypto()
2023 lsp->ls_crypto.data_sector = ntohl(lsp->ls_crypto.data_sector); in lofi_init_crypto()
2024 marker += sizeof (lsp->ls_crypto.data_sector); in lofi_init_crypto()
2028 lsp->ls_crypto_offset = lsp->ls_crypto.data_sector * DEV_BSIZE; in lofi_init_crypto()
2053 error = vn_rdwr(UIO_WRITE, lsp->ls_vp, buf, DEV_BSIZE, in lofi_init_crypto()
2059 bcopy(lofi_crypto_magic, lsp->ls_crypto.magic, in lofi_init_crypto()
2061 lsp->ls_crypto.version = LOFI_CRYPTO_VERSION; in lofi_init_crypto()
2062 lsp->ls_crypto.data_sector = LOFI_CRYPTO_DATA_SECTOR; in lofi_init_crypto()
2063 lsp->ls_crypto_offset = lsp->ls_crypto.data_sector * DEV_BSIZE; in lofi_init_crypto()
2087 lofi_init_compress(struct lofi_state *lsp) in lofi_init_compress() argument
2094 error = vn_rdwr(UIO_READ, lsp->ls_vp, buf, DEV_BSIZE, 0, UIO_SYSSPACE, in lofi_init_compress()
2104 if (lsp->ls_crypto_enabled) in lofi_init_compress()
2108 lsp->ls_comp_algorithm_index = compress_index; in lofi_init_compress()
2109 (void) strlcpy(lsp->ls_comp_algorithm, in lofi_init_compress()
2111 sizeof (lsp->ls_comp_algorithm)); in lofi_init_compress()
2114 lsp->ls_comp_bufs = kmem_zalloc(lofi_taskq_nthreads * in lofi_init_compress()
2117 return (lofi_map_compressed_file(lsp, buf)); in lofi_init_compress()
2128 struct lofi_state *lsp = NULL; in lofi_map_file() local
2210 lsp = ddi_get_soft_state(lofi_statep, minor); in lofi_map_file()
2211 list_insert_tail(&lofi_list, lsp); in lofi_map_file()
2214 lsp->ls_dev = newdev; in lofi_map_file()
2215 zone_init_ref(&lsp->ls_zone); in lofi_map_file()
2216 zone_hold_ref(curzone, &lsp->ls_zone, ZONE_REF_LOFI); in lofi_map_file()
2217 lsp->ls_uncomp_seg_sz = 0; in lofi_map_file()
2218 lsp->ls_comp_algorithm[0] = '\0'; in lofi_map_file()
2219 lsp->ls_crypto_offset = 0; in lofi_map_file()
2221 cv_init(&lsp->ls_vp_cv, NULL, CV_DRIVER, NULL); in lofi_map_file()
2222 mutex_init(&lsp->ls_comp_cache_lock, NULL, MUTEX_DRIVER, NULL); in lofi_map_file()
2223 mutex_init(&lsp->ls_comp_bufs_lock, NULL, MUTEX_DRIVER, NULL); in lofi_map_file()
2224 mutex_init(&lsp->ls_kstat_lock, NULL, MUTEX_DRIVER, NULL); in lofi_map_file()
2225 mutex_init(&lsp->ls_vp_lock, NULL, MUTEX_DRIVER, NULL); in lofi_map_file()
2229 lsp->ls_taskq = taskq_create_proc(namebuf, lofi_taskq_nthreads, in lofi_map_file()
2232 list_create(&lsp->ls_comp_cache, sizeof (struct lofi_comp_cache), in lofi_map_file()
2239 lsp->ls_openflag = flag; in lofi_map_file()
2241 lsp->ls_vp = vp; in lofi_map_file()
2242 lsp->ls_stacked_vp = vp; in lofi_map_file()
2256 lsp->ls_vp = realvp; in lofi_map_file()
2260 lsp->ls_vp_size = vattr.va_size; in lofi_map_file()
2261 lsp->ls_vp_comp_size = lsp->ls_vp_size; in lofi_map_file()
2263 lsp->ls_kstat = kstat_create_zone(LOFI_DRIVER_NAME, minor, in lofi_map_file()
2266 if (lsp->ls_kstat == NULL) { in lofi_map_file()
2271 lsp->ls_kstat->ks_lock = &lsp->ls_kstat_lock; in lofi_map_file()
2272 kstat_zone_add(lsp->ls_kstat, GLOBAL_ZONEID); in lofi_map_file()
2274 lsp->ls_readonly = klip->li_readonly; in lofi_map_file()
2276 if ((error = lofi_init_crypto(lsp, klip)) != 0) in lofi_map_file()
2279 if ((error = lofi_init_compress(lsp)) != 0) in lofi_map_file()
2282 fake_disk_geometry(lsp); in lofi_map_file()
2308 lsp->ls_vp_size - lsp->ls_crypto_offset)) != DDI_PROP_SUCCESS) { in lofi_map_file()
2314 (lsp->ls_vp_size - lsp->ls_crypto_offset) / DEV_BSIZE)) in lofi_map_file()
2326 kstat_install(lsp->ls_kstat); in lofi_map_file()
2340 if (lsp != NULL) { in lofi_map_file()
2341 lofi_destroy(lsp, credp); in lofi_map_file()
2366 struct lofi_state *lsp; in lofi_unmap_file() local
2377 &lsp)) != 0) { in lofi_unmap_file()
2386 lsp = ddi_get_soft_state(lofi_statep, klip->li_minor); in lofi_unmap_file()
2389 if (lsp == NULL || lsp->ls_vp == NULL || lofi_access(lsp) != 0) { in lofi_unmap_file()
2395 klip->li_minor = getminor(lsp->ls_dev); in lofi_unmap_file()
2419 if (is_opened(lsp)) { in lofi_unmap_file()
2421 mutex_enter(&lsp->ls_vp_lock); in lofi_unmap_file()
2422 lsp->ls_vp_closereq = B_TRUE; in lofi_unmap_file()
2424 cv_broadcast(&lsp->ls_vp_cv); in lofi_unmap_file()
2425 while (lsp->ls_vp_iocount > 0) in lofi_unmap_file()
2426 cv_wait(&lsp->ls_vp_cv, &lsp->ls_vp_lock); in lofi_unmap_file()
2427 mutex_exit(&lsp->ls_vp_lock); in lofi_unmap_file()
2431 lsp->ls_cleanup = 1; in lofi_unmap_file()
2443 lofi_free_dev(lsp->ls_dev); in lofi_unmap_file()
2444 lofi_destroy(lsp, credp); in lofi_unmap_file()
2462 struct lofi_state *lsp; in lofi_get_info() local
2477 lsp = ddi_get_soft_state(lofi_statep, klip->li_minor); in lofi_get_info()
2478 if (lsp == NULL || lofi_access(lsp) != 0) { in lofi_get_info()
2488 if (vnodetopath(NULL, lsp->ls_stacked_vp, klip->li_filename, in lofi_get_info()
2494 klip->li_readonly = lsp->ls_readonly; in lofi_get_info()
2496 (void) strlcpy(klip->li_algorithm, lsp->ls_comp_algorithm, in lofi_get_info()
2498 klip->li_crypto_enabled = lsp->ls_crypto_enabled; in lofi_get_info()
2506 klip->li_readonly, &lsp); in lofi_get_info()
2508 klip->li_minor = getminor(lsp->ls_dev); in lofi_get_info()
2519 klip->li_readonly, &lsp); in lofi_get_info()
2526 klip->li_minor = getminor(lsp->ls_dev); in lofi_get_info()
2527 (void) strlcpy(klip->li_algorithm, lsp->ls_comp_algorithm, in lofi_get_info()
2546 struct lofi_state *lsp; in lofi_ioctl() local
2595 for (lsp = list_head(&lofi_list); lsp != NULL; in lofi_ioctl()
2596 lsp = list_next(&lofi_list, lsp)) { in lofi_ioctl()
2597 if (lofi_access(lsp) != 0) in lofi_ioctl()
2600 if (getminor(lsp->ls_dev) > minor) in lofi_ioctl()
2601 minor = getminor(lsp->ls_dev); in lofi_ioctl()
2621 lsp = ddi_get_soft_state(lofi_statep, minor); in lofi_ioctl()
2622 if (lsp == NULL || lsp->ls_vp_closereq) { in lofi_ioctl()
2632 if (lsp->ls_vp == NULL && cmd != DKIOCSTATE) in lofi_ioctl()
2642 vtoctovtoc32(lsp->ls_vtoc, vtoc32); in lofi_ioctl()
2650 if (ddi_copyout(&lsp->ls_vtoc, (void *)arg, in lofi_ioctl()
2657 error = ddi_copyout(&lsp->ls_ci, (void *)arg, in lofi_ioctl()
2665 error = ddi_copyout(&lsp->ls_dkg, (void *)arg, in lofi_ioctl()
2680 mutex_enter(&lsp->ls_vp_lock); in lofi_ioctl()
2681 lsp->ls_vp_iocount++; in lofi_ioctl()
2682 while (((dkstate == DKIO_INSERTED && lsp->ls_vp != NULL) || in lofi_ioctl()
2683 (dkstate == DKIO_DEV_GONE && lsp->ls_vp == NULL)) && in lofi_ioctl()
2684 !lsp->ls_vp_closereq) { in lofi_ioctl()
2689 if (!cv_wait_sig(&lsp->ls_vp_cv, in lofi_ioctl()
2690 &lsp->ls_vp_lock)) { in lofi_ioctl()
2691 lsp->ls_vp_iocount--; in lofi_ioctl()
2692 cv_broadcast(&lsp->ls_vp_cv); in lofi_ioctl()
2693 mutex_exit(&lsp->ls_vp_lock); in lofi_ioctl()
2698 dkstate = (!lsp->ls_vp_closereq && lsp->ls_vp != NULL ? in lofi_ioctl()
2700 lsp->ls_vp_iocount--; in lofi_ioctl()
2701 cv_broadcast(&lsp->ls_vp_cv); in lofi_ioctl()
2702 mutex_exit(&lsp->ls_vp_lock); in lofi_ioctl()