Lines Matching refs:zv
155 static int zvol_dumpify(zvol_state_t *zv);
156 static int zvol_dump_fini(zvol_state_t *zv);
157 static int zvol_dump_init(zvol_state_t *zv, boolean_t resize);
160 zvol_size_changed(zvol_state_t *zv, uint64_t volsize) in zvol_size_changed() argument
162 dev_t dev = makedevice(ddi_driver_major(zfs_dip), zv->zv_minor); in zvol_size_changed()
164 zv->zv_volsize = volsize; in zvol_size_changed()
229 zvol_state_t *zv; in zvol_minor_lookup() local
234 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_minor_lookup()
235 if (zv == NULL) in zvol_minor_lookup()
237 if (strcmp(zv->zv_name, name) == 0) in zvol_minor_lookup()
238 return (zv); in zvol_minor_lookup()
295 zvol_free_extents(zvol_state_t *zv) in zvol_free_extents() argument
299 while (ze = list_head(&zv->zv_extents)) { in zvol_free_extents()
300 list_remove(&zv->zv_extents, ze); in zvol_free_extents()
306 zvol_get_lbas(zvol_state_t *zv) in zvol_get_lbas() argument
308 objset_t *os = zv->zv_objset; in zvol_get_lbas()
312 ma.ma_zv = zv; in zvol_get_lbas()
314 zvol_free_extents(zv); in zvol_get_lbas()
320 if (err || ma.ma_blks != (zv->zv_volsize / zv->zv_volblocksize)) { in zvol_get_lbas()
321 zvol_free_extents(zv); in zvol_get_lbas()
369 zvol_replay_truncate(zvol_state_t *zv, lr_truncate_t *lr, boolean_t byteswap) in zvol_replay_truncate() argument
379 return (dmu_free_long_range(zv->zv_objset, ZVOL_OBJ, offset, length)); in zvol_replay_truncate()
387 zvol_replay_write(zvol_state_t *zv, lr_write_t *lr, boolean_t byteswap) in zvol_replay_write() argument
389 objset_t *os = zv->zv_objset; in zvol_replay_write()
425 zvol_replay_err(zvol_state_t *zv, lr_t *lr, boolean_t byteswap) in zvol_replay_err() argument
460 zvol_state_t *zv; in zvol_name2minor() local
463 zv = zvol_minor_lookup(name); in zvol_name2minor()
464 if (minor && zv) in zvol_name2minor()
465 *minor = zv->zv_minor; in zvol_name2minor()
467 return (zv ? 0 : -1); in zvol_name2minor()
477 zvol_state_t *zv; in zvol_create_minor() local
536 zv = zs->zss_data = kmem_zalloc(sizeof (zvol_state_t), KM_SLEEP); in zvol_create_minor()
537 (void) strlcpy(zv->zv_name, name, MAXPATHLEN); in zvol_create_minor()
538 zv->zv_min_bs = DEV_BSHIFT; in zvol_create_minor()
539 zv->zv_minor = minor; in zvol_create_minor()
540 zv->zv_objset = os; in zvol_create_minor()
542 zv->zv_flags |= ZVOL_RDONLY; in zvol_create_minor()
543 mutex_init(&zv->zv_znode.z_range_lock, NULL, MUTEX_DEFAULT, NULL); in zvol_create_minor()
544 avl_create(&zv->zv_znode.z_range_avl, zfs_range_compare, in zvol_create_minor()
546 list_create(&zv->zv_extents, sizeof (zvol_extent_t), in zvol_create_minor()
551 zv->zv_volblocksize = doi.doi_data_block_size; in zvol_create_minor()
557 zil_replay(os, zv, zvol_replay_vector); in zvol_create_minor()
560 zv->zv_objset = NULL; in zvol_create_minor()
573 zvol_remove_zv(zvol_state_t *zv) in zvol_remove_zv() argument
576 minor_t minor = zv->zv_minor; in zvol_remove_zv()
579 if (zv->zv_total_opens != 0) in zvol_remove_zv()
588 avl_destroy(&zv->zv_znode.z_range_avl); in zvol_remove_zv()
589 mutex_destroy(&zv->zv_znode.z_range_lock); in zvol_remove_zv()
591 kmem_free(zv, sizeof (zvol_state_t)); in zvol_remove_zv()
602 zvol_state_t *zv; in zvol_remove_minor() local
606 if ((zv = zvol_minor_lookup(name)) == NULL) { in zvol_remove_minor()
610 rc = zvol_remove_zv(zv); in zvol_remove_minor()
616 zvol_first_open(zvol_state_t *zv) in zvol_first_open() argument
624 error = dmu_objset_own(zv->zv_name, DMU_OST_ZVOL, B_TRUE, in zvol_first_open()
629 zv->zv_objset = os; in zvol_first_open()
637 error = dmu_bonus_hold(os, ZVOL_OBJ, zvol_tag, &zv->zv_dbuf); in zvol_first_open()
643 zvol_size_changed(zv, volsize); in zvol_first_open()
644 zv->zv_zilog = zil_open(os, zvol_get_data); in zvol_first_open()
646 VERIFY(dsl_prop_get_integer(zv->zv_name, "readonly", &readonly, in zvol_first_open()
650 zv->zv_flags |= ZVOL_RDONLY; in zvol_first_open()
652 zv->zv_flags &= ~ZVOL_RDONLY; in zvol_first_open()
657 zvol_last_close(zvol_state_t *zv) in zvol_last_close() argument
659 zil_close(zv->zv_zilog); in zvol_last_close()
660 zv->zv_zilog = NULL; in zvol_last_close()
662 dmu_buf_rele(zv->zv_dbuf, zvol_tag); in zvol_last_close()
663 zv->zv_dbuf = NULL; in zvol_last_close()
668 if (dsl_dataset_is_dirty(dmu_objset_ds(zv->zv_objset)) && in zvol_last_close()
669 !(zv->zv_flags & ZVOL_RDONLY)) in zvol_last_close()
670 txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0); in zvol_last_close()
671 dmu_objset_evict_dbufs(zv->zv_objset); in zvol_last_close()
673 dmu_objset_disown(zv->zv_objset, zvol_tag); in zvol_last_close()
674 zv->zv_objset = NULL; in zvol_last_close()
678 zvol_prealloc(zvol_state_t *zv) in zvol_prealloc() argument
680 objset_t *os = zv->zv_objset; in zvol_prealloc()
683 uint64_t resid = zv->zv_volsize; in zvol_prealloc()
688 if (avail < zv->zv_volsize) in zvol_prealloc()
692 zvol_free_extents(zv); in zvol_prealloc()
746 zvol_state_t *zv; in zvol_remove_minors() local
756 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_remove_minors()
757 if (zv == NULL) in zvol_remove_minors()
759 if (strncmp(namebuf, zv->zv_name, strlen(namebuf)) == 0) in zvol_remove_minors()
760 (void) zvol_remove_zv(zv); in zvol_remove_minors()
768 zvol_update_live_volsize(zvol_state_t *zv, uint64_t volsize) in zvol_update_live_volsize() argument
782 old_volsize = zv->zv_volsize; in zvol_update_live_volsize()
783 zvol_size_changed(zv, volsize); in zvol_update_live_volsize()
785 if (zv->zv_flags & ZVOL_DUMPIFIED) { in zvol_update_live_volsize()
786 if ((error = zvol_dumpify(zv)) != 0 || in zvol_update_live_volsize()
790 (void) zvol_update_volsize(zv->zv_objset, old_volsize); in zvol_update_live_volsize()
791 zvol_size_changed(zv, old_volsize); in zvol_update_live_volsize()
792 dumpify_error = zvol_dumpify(zv); in zvol_update_live_volsize()
806 zv->zv_minor); in zvol_update_live_volsize()
823 zvol_state_t *zv = NULL; in zvol_set_volsize() local
838 zv = zvol_minor_lookup(name); in zvol_set_volsize()
840 if (zv == NULL || zv->zv_objset == NULL) { in zvol_set_volsize()
847 if (zv != NULL) in zvol_set_volsize()
848 zv->zv_objset = os; in zvol_set_volsize()
850 os = zv->zv_objset; in zvol_set_volsize()
859 if (error == 0 && zv != NULL) in zvol_set_volsize()
860 error = zvol_update_live_volsize(zv, volsize); in zvol_set_volsize()
864 if (zv != NULL) in zvol_set_volsize()
865 zv->zv_objset = NULL; in zvol_set_volsize()
875 zvol_state_t *zv; in zvol_open() local
880 zv = zfsdev_get_soft_state(getminor(*devp), ZSST_ZVOL); in zvol_open()
881 if (zv == NULL) { in zvol_open()
886 if (zv->zv_total_opens == 0) in zvol_open()
887 err = zvol_first_open(zv); in zvol_open()
892 if ((flag & FWRITE) && (zv->zv_flags & ZVOL_RDONLY)) { in zvol_open()
896 if (zv->zv_flags & ZVOL_EXCL) { in zvol_open()
901 if (zv->zv_total_opens != 0) { in zvol_open()
905 zv->zv_flags |= ZVOL_EXCL; in zvol_open()
908 if (zv->zv_open_count[otyp] == 0 || otyp == OTYP_LYR) { in zvol_open()
909 zv->zv_open_count[otyp]++; in zvol_open()
910 zv->zv_total_opens++; in zvol_open()
916 if (zv->zv_total_opens == 0) in zvol_open()
917 zvol_last_close(zv); in zvol_open()
927 zvol_state_t *zv; in zvol_close() local
932 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_close()
933 if (zv == NULL) { in zvol_close()
938 if (zv->zv_flags & ZVOL_EXCL) { in zvol_close()
939 ASSERT(zv->zv_total_opens == 1); in zvol_close()
940 zv->zv_flags &= ~ZVOL_EXCL; in zvol_close()
947 ASSERT(zv->zv_open_count[otyp] != 0); in zvol_close()
948 ASSERT(zv->zv_total_opens != 0); in zvol_close()
953 zv->zv_open_count[otyp]--; in zvol_close()
954 zv->zv_total_opens--; in zvol_close()
956 if (zv->zv_total_opens == 0) in zvol_close()
957 zvol_last_close(zv); in zvol_close()
983 zvol_state_t *zv = arg; in zvol_get_data() local
984 objset_t *os = zv->zv_objset; in zvol_get_data()
997 zgd->zgd_zilog = zv->zv_zilog; in zvol_get_data()
998 zgd->zgd_rl = zfs_range_lock(&zv->zv_znode, offset, size, RL_READER); in zvol_get_data()
1011 size = zv->zv_volblocksize; in zvol_get_data()
1050 zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx, offset_t off, ssize_t resid, in zvol_log_write() argument
1053 uint32_t blocksize = zv->zv_volblocksize; in zvol_log_write()
1054 zilog_t *zilog = zv->zv_zilog; in zvol_log_write()
1092 if (write_state == WR_COPIED && dmu_read(zv->zv_objset, in zvol_log_write()
1109 itx->itx_private = zv; in zvol_log_write()
1116 rz_zev_callbacks->rz_zev_zvol_write(zv->zv_name, in zvol_log_write()
1117 zv->zv_objset, tx, off, len); in zvol_log_write()
1179 zvol_dumpio(zvol_state_t *zv, void *addr, uint64_t offset, uint64_t size, in zvol_dumpio() argument
1185 spa_t *spa = dmu_objset_spa(zv->zv_objset); in zvol_dumpio()
1189 P2BOUNDARY(offset, size, zv->zv_volblocksize)) { in zvol_dumpio()
1192 ASSERT(size <= zv->zv_volblocksize); in zvol_dumpio()
1195 ze = list_head(&zv->zv_extents); in zvol_dumpio()
1196 while (offset >= ze->ze_nblks * zv->zv_volblocksize) { in zvol_dumpio()
1197 offset -= ze->ze_nblks * zv->zv_volblocksize; in zvol_dumpio()
1198 ze = list_next(&zv->zv_extents, ze); in zvol_dumpio()
1222 zvol_state_t *zv; in zvol_strategy() local
1249 zv = zs->zss_data; in zvol_strategy()
1251 if (!(bp->b_flags & B_READ) && (zv->zv_flags & ZVOL_RDONLY)) { in zvol_strategy()
1258 volsize = zv->zv_volsize; in zvol_strategy()
1260 os = zv->zv_objset; in zvol_strategy()
1273 is_dumpified = zv->zv_flags & ZVOL_DUMPIFIED; in zvol_strategy()
1275 !(zv->zv_flags & ZVOL_WCE)) || in zvol_strategy()
1276 (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS)) && in zvol_strategy()
1283 rl = zfs_range_lock(&zv->zv_znode, off, resid, in zvol_strategy()
1289 size = MIN(size, P2END(off, zv->zv_volblocksize) - off); in zvol_strategy()
1290 error = zvol_dumpio(zv, addr, off, size, in zvol_strategy()
1303 zvol_log_write(zv, tx, off, size, sync); in zvol_strategy()
1323 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_strategy()
1348 zvol_state_t *zv; in zvol_dump() local
1354 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_dump()
1355 if (zv == NULL) in zvol_dump()
1358 if ((zv->zv_flags & ZVOL_DUMPIFIED) == 0) in zvol_dump()
1364 VERIFY3U(boff + resid, <=, zv->zv_volsize); in zvol_dump()
1367 size = MIN(resid, P2END(boff, zv->zv_volblocksize) - boff); in zvol_dump()
1368 error = zvol_dumpio(zv, addr, boff, size, B_FALSE, B_TRUE); in zvol_dump()
1384 zvol_state_t *zv; in zvol_read() local
1389 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_read()
1390 if (zv == NULL) in zvol_read()
1393 volsize = zv->zv_volsize; in zvol_read()
1398 if (zv->zv_flags & ZVOL_DUMPIFIED) { in zvol_read()
1404 rl = zfs_range_lock(&zv->zv_znode, uio->uio_loffset, uio->uio_resid, in zvol_read()
1413 error = dmu_read_uio(zv->zv_objset, ZVOL_OBJ, uio, bytes); in zvol_read()
1430 zvol_state_t *zv; in zvol_write() local
1436 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_write()
1437 if (zv == NULL) in zvol_write()
1440 volsize = zv->zv_volsize; in zvol_write()
1445 if (zv->zv_flags & ZVOL_DUMPIFIED) { in zvol_write()
1451 sync = !(zv->zv_flags & ZVOL_WCE) || in zvol_write()
1452 (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS); in zvol_write()
1454 rl = zfs_range_lock(&zv->zv_znode, uio->uio_loffset, uio->uio_resid, in zvol_write()
1459 dmu_tx_t *tx = dmu_tx_create(zv->zv_objset); in zvol_write()
1470 error = dmu_write_uio_dbuf(zv->zv_dbuf, uio, bytes, tx); in zvol_write()
1472 zvol_log_write(zv, tx, off, bytes, sync); in zvol_write()
1480 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_write()
1553 zvol_state_t *zv; in zvol_get_volume_params() local
1555 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_get_volume_params()
1556 if (zv == NULL) in zvol_get_volume_params()
1558 if (zv->zv_flags & ZVOL_DUMPIFIED) in zvol_get_volume_params()
1564 *blksize = zv->zv_volblocksize; in zvol_get_volume_params()
1566 *minor_hdl = zv; in zvol_get_volume_params()
1567 *objset_hdl = zv->zv_objset; in zvol_get_volume_params()
1568 *zil_hdl = zv->zv_zilog; in zvol_get_volume_params()
1569 *rl_hdl = &zv->zv_znode; in zvol_get_volume_params()
1570 *bonus_hdl = zv->zv_dbuf; in zvol_get_volume_params()
1581 zvol_state_t *zv = minor_hdl; in zvol_get_volume_size() local
1583 return (zv->zv_volsize); in zvol_get_volume_size()
1593 zvol_state_t *zv = minor_hdl; in zvol_get_volume_wce() local
1595 return ((zv->zv_flags & ZVOL_WCE) ? 1 : 0); in zvol_get_volume_wce()
1605 zvol_state_t *zv = minor_hdl; in zvol_log_write_minor() local
1607 zvol_log_write(zv, tx, off, resid, sync); in zvol_log_write_minor()
1617 zvol_log_truncate(zvol_state_t *zv, dmu_tx_t *tx, uint64_t off, uint64_t len, in zvol_log_truncate() argument
1622 zilog_t *zilog = zv->zv_zilog; in zvol_log_truncate()
1638 rz_zev_callbacks->rz_zev_zvol_truncate(zv->zv_name, in zvol_log_truncate()
1639 zv->zv_objset, tx, off, len); in zvol_log_truncate()
1651 zvol_state_t *zv; in zvol_ioctl() local
1658 zv = zfsdev_get_soft_state(getminor(dev), ZSST_ZVOL); in zvol_ioctl()
1660 if (zv == NULL) { in zvol_ioctl()
1664 ASSERT(zv->zv_total_opens > 0); in zvol_ioctl()
1678 1 << (SPA_OLD_MAXBLOCKSHIFT - zv->zv_min_bs); in zvol_ioctl()
1690 dkm.dki_lbsize = 1U << zv->zv_min_bs; in zvol_ioctl()
1691 dkm.dki_capacity = zv->zv_volsize >> zv->zv_min_bs; in zvol_ioctl()
1704 dkmext.dki_lbsize = 1U << zv->zv_min_bs; in zvol_ioctl()
1705 dkmext.dki_pbsize = zv->zv_volblocksize; in zvol_ioctl()
1706 dkmext.dki_capacity = zv->zv_volsize >> zv->zv_min_bs; in zvol_ioctl()
1716 uint64_t vs = zv->zv_volsize; in zvol_ioctl()
1717 uint8_t bs = zv->zv_min_bs; in zvol_ioctl()
1727 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_ioctl()
1736 int wce = (zv->zv_flags & ZVOL_WCE) ? 1 : 0; in zvol_ioctl()
1751 zv->zv_flags |= ZVOL_WCE; in zvol_ioctl()
1754 zv->zv_flags &= ~ZVOL_WCE; in zvol_ioctl()
1756 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_ioctl()
1771 rl = zfs_range_lock(&zv->zv_znode, 0, zv->zv_volsize, in zvol_ioctl()
1773 error = zvol_dumpify(zv); in zvol_ioctl()
1778 if (!(zv->zv_flags & ZVOL_DUMPIFIED)) in zvol_ioctl()
1780 rl = zfs_range_lock(&zv->zv_znode, 0, zv->zv_volsize, in zvol_ioctl()
1782 error = zvol_dump_fini(zv); in zvol_ioctl()
1804 if (df.df_start >= zv->zv_volsize) in zvol_ioctl()
1809 rl = zfs_range_lock(&zv->zv_znode, df.df_start, df.df_length, in zvol_ioctl()
1811 tx = dmu_tx_create(zv->zv_objset); in zvol_ioctl()
1817 zvol_log_truncate(zv, tx, df.df_start, in zvol_ioctl()
1820 error = dmu_free_long_range(zv->zv_objset, ZVOL_OBJ, in zvol_ioctl()
1832 if (!(zv->zv_flags & ZVOL_WCE) || in zvol_ioctl()
1833 (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS)) in zvol_ioctl()
1834 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_ioctl()
1843 dmu_objset_pool(zv->zv_objset), 0); in zvol_ioctl()
1900 zvol_dump_init(zvol_state_t *zv, boolean_t resize) in zvol_dump_init() argument
1904 objset_t *os = zv->zv_objset; in zvol_dump_init()
1914 error = dmu_free_long_range(zv->zv_objset, ZVOL_OBJ, 0, in zvol_dump_init()
1917 txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0); in zvol_dump_init()
1965 &zv->zv_volsize, tx); in zvol_dump_init()
1969 error = dsl_prop_get_integer(zv->zv_name, in zvol_dump_init()
1971 error = error ? error : dsl_prop_get_integer(zv->zv_name, in zvol_dump_init()
1973 error = error ? error : dsl_prop_get_integer(zv->zv_name, in zvol_dump_init()
1975 error = error ? error : dsl_prop_get_integer(zv->zv_name, in zvol_dump_init()
1979 dsl_prop_get_integer(zv->zv_name, in zvol_dump_init()
2002 zv->zv_volblocksize = SPA_OLD_MAXBLOCKSIZE; in zvol_dump_init()
2026 error = zfs_set_prop_nvlist(zv->zv_name, ZPROP_SRC_LOCAL, in zvol_dump_init()
2035 error = zvol_prealloc(zv); in zvol_dump_init()
2040 zvol_dumpify(zvol_state_t *zv) in zvol_dumpify() argument
2045 objset_t *os = zv->zv_objset; in zvol_dumpify()
2047 if (zv->zv_flags & ZVOL_RDONLY) in zvol_dumpify()
2050 if (zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, ZVOL_DUMPSIZE, in zvol_dumpify()
2051 8, 1, &dumpsize) != 0 || dumpsize != zv->zv_volsize) { in zvol_dumpify()
2054 if ((error = zvol_dump_init(zv, resize)) != 0) { in zvol_dumpify()
2055 (void) zvol_dump_fini(zv); in zvol_dumpify()
2063 error = zvol_get_lbas(zv); in zvol_dumpify()
2065 (void) zvol_dump_fini(zv); in zvol_dumpify()
2074 (void) zvol_dump_fini(zv); in zvol_dumpify()
2078 zv->zv_flags |= ZVOL_DUMPIFIED; in zvol_dumpify()
2080 &zv->zv_volsize, tx); in zvol_dumpify()
2084 (void) zvol_dump_fini(zv); in zvol_dumpify()
2093 zvol_dump_fini(zvol_state_t *zv) in zvol_dump_fini() argument
2096 objset_t *os = zv->zv_objset; in zvol_dump_fini()
2100 uint64_t version = spa_version(dmu_objset_spa(zv->zv_objset)); in zvol_dump_fini()
2119 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2121 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2123 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2125 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2136 zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2141 (void) zfs_set_prop_nvlist(zv->zv_name, ZPROP_SRC_LOCAL, in zvol_dump_fini()
2145 zvol_free_extents(zv); in zvol_dump_fini()
2146 zv->zv_flags &= ~ZVOL_DUMPIFIED; in zvol_dump_fini()
2149 txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0); in zvol_dump_fini()
2158 zv->zv_volblocksize = vbs; in zvol_dump_fini()