Lines Matching refs:zv
156 static int zvol_dumpify(zvol_state_t *zv);
157 static int zvol_dump_fini(zvol_state_t *zv);
158 static int zvol_dump_init(zvol_state_t *zv, boolean_t resize);
161 zvol_size_changed(zvol_state_t *zv, uint64_t volsize) in zvol_size_changed() argument
163 dev_t dev = makedevice(ddi_driver_major(zfs_dip), zv->zv_minor); in zvol_size_changed()
165 zv->zv_volsize = volsize; in zvol_size_changed()
230 zvol_state_t *zv; in zvol_minor_lookup() local
235 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_minor_lookup()
236 if (zv == NULL) in zvol_minor_lookup()
238 if (strcmp(zv->zv_name, name) == 0) in zvol_minor_lookup()
239 return (zv); in zvol_minor_lookup()
296 zvol_free_extents(zvol_state_t *zv) in zvol_free_extents() argument
300 while (ze = list_head(&zv->zv_extents)) { in zvol_free_extents()
301 list_remove(&zv->zv_extents, ze); in zvol_free_extents()
307 zvol_get_lbas(zvol_state_t *zv) in zvol_get_lbas() argument
309 objset_t *os = zv->zv_objset; in zvol_get_lbas()
313 ma.ma_zv = zv; in zvol_get_lbas()
315 zvol_free_extents(zv); in zvol_get_lbas()
321 if (err || ma.ma_blks != (zv->zv_volsize / zv->zv_volblocksize)) { in zvol_get_lbas()
322 zvol_free_extents(zv); in zvol_get_lbas()
370 zvol_replay_truncate(zvol_state_t *zv, lr_truncate_t *lr, boolean_t byteswap) in zvol_replay_truncate() argument
380 return (dmu_free_long_range(zv->zv_objset, ZVOL_OBJ, offset, length)); in zvol_replay_truncate()
388 zvol_replay_write(zvol_state_t *zv, lr_write_t *lr, boolean_t byteswap) in zvol_replay_write() argument
390 objset_t *os = zv->zv_objset; in zvol_replay_write()
426 zvol_replay_err(zvol_state_t *zv, lr_t *lr, boolean_t byteswap) in zvol_replay_err() argument
461 zvol_state_t *zv; in zvol_name2minor() local
464 zv = zvol_minor_lookup(name); in zvol_name2minor()
465 if (minor && zv) in zvol_name2minor()
466 *minor = zv->zv_minor; in zvol_name2minor()
468 return (zv ? 0 : -1); in zvol_name2minor()
478 zvol_state_t *zv; in zvol_create_minor() local
537 zv = zs->zss_data = kmem_zalloc(sizeof (zvol_state_t), KM_SLEEP); in zvol_create_minor()
538 (void) strlcpy(zv->zv_name, name, MAXPATHLEN); in zvol_create_minor()
539 zv->zv_min_bs = DEV_BSHIFT; in zvol_create_minor()
540 zv->zv_minor = minor; in zvol_create_minor()
541 zv->zv_objset = os; in zvol_create_minor()
543 zv->zv_flags |= ZVOL_RDONLY; in zvol_create_minor()
544 mutex_init(&zv->zv_znode.z_range_lock, NULL, MUTEX_DEFAULT, NULL); in zvol_create_minor()
545 avl_create(&zv->zv_znode.z_range_avl, zfs_range_compare, in zvol_create_minor()
547 list_create(&zv->zv_extents, sizeof (zvol_extent_t), in zvol_create_minor()
552 zv->zv_volblocksize = doi.doi_data_block_size; in zvol_create_minor()
558 zil_replay(os, zv, zvol_replay_vector); in zvol_create_minor()
561 zv->zv_objset = NULL; in zvol_create_minor()
574 zvol_remove_zv(zvol_state_t *zv) in zvol_remove_zv() argument
577 minor_t minor = zv->zv_minor; in zvol_remove_zv()
580 if (zv->zv_total_opens != 0) in zvol_remove_zv()
589 avl_destroy(&zv->zv_znode.z_range_avl); in zvol_remove_zv()
590 mutex_destroy(&zv->zv_znode.z_range_lock); in zvol_remove_zv()
592 kmem_free(zv, sizeof (zvol_state_t)); in zvol_remove_zv()
603 zvol_state_t *zv; in zvol_remove_minor() local
607 if ((zv = zvol_minor_lookup(name)) == NULL) { in zvol_remove_minor()
611 rc = zvol_remove_zv(zv); in zvol_remove_minor()
617 zvol_first_open(zvol_state_t *zv) in zvol_first_open() argument
625 error = dmu_objset_own(zv->zv_name, DMU_OST_ZVOL, B_TRUE, in zvol_first_open()
630 zv->zv_objset = os; in zvol_first_open()
638 error = dmu_bonus_hold(os, ZVOL_OBJ, zvol_tag, &zv->zv_dbuf); in zvol_first_open()
644 zvol_size_changed(zv, volsize); in zvol_first_open()
645 zv->zv_zilog = zil_open(os, zvol_get_data); in zvol_first_open()
647 VERIFY(dsl_prop_get_integer(zv->zv_name, "readonly", &readonly, in zvol_first_open()
651 zv->zv_flags |= ZVOL_RDONLY; in zvol_first_open()
653 zv->zv_flags &= ~ZVOL_RDONLY; in zvol_first_open()
658 zvol_last_close(zvol_state_t *zv) in zvol_last_close() argument
660 zil_close(zv->zv_zilog); in zvol_last_close()
661 zv->zv_zilog = NULL; in zvol_last_close()
663 dmu_buf_rele(zv->zv_dbuf, zvol_tag); in zvol_last_close()
664 zv->zv_dbuf = NULL; in zvol_last_close()
669 if (dsl_dataset_is_dirty(dmu_objset_ds(zv->zv_objset)) && in zvol_last_close()
670 !(zv->zv_flags & ZVOL_RDONLY)) in zvol_last_close()
671 txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0); in zvol_last_close()
672 dmu_objset_evict_dbufs(zv->zv_objset); in zvol_last_close()
674 dmu_objset_disown(zv->zv_objset, zvol_tag); in zvol_last_close()
675 zv->zv_objset = NULL; in zvol_last_close()
679 zvol_prealloc(zvol_state_t *zv) in zvol_prealloc() argument
681 objset_t *os = zv->zv_objset; in zvol_prealloc()
684 uint64_t resid = zv->zv_volsize; in zvol_prealloc()
689 if (avail < zv->zv_volsize) in zvol_prealloc()
693 zvol_free_extents(zv); in zvol_prealloc()
747 zvol_state_t *zv; in zvol_remove_minors() local
757 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_remove_minors()
758 if (zv == NULL) in zvol_remove_minors()
760 if (strncmp(namebuf, zv->zv_name, strlen(namebuf)) == 0) in zvol_remove_minors()
761 (void) zvol_remove_zv(zv); in zvol_remove_minors()
769 zvol_update_live_volsize(zvol_state_t *zv, uint64_t volsize) in zvol_update_live_volsize() argument
783 old_volsize = zv->zv_volsize; in zvol_update_live_volsize()
784 zvol_size_changed(zv, volsize); in zvol_update_live_volsize()
786 if (zv->zv_flags & ZVOL_DUMPIFIED) { in zvol_update_live_volsize()
787 if ((error = zvol_dumpify(zv)) != 0 || in zvol_update_live_volsize()
791 (void) zvol_update_volsize(zv->zv_objset, old_volsize); in zvol_update_live_volsize()
792 zvol_size_changed(zv, old_volsize); in zvol_update_live_volsize()
793 dumpify_error = zvol_dumpify(zv); in zvol_update_live_volsize()
807 zv->zv_minor); in zvol_update_live_volsize()
824 zvol_state_t *zv = NULL; in zvol_set_volsize() local
839 zv = zvol_minor_lookup(name); in zvol_set_volsize()
841 if (zv == NULL || zv->zv_objset == NULL) { in zvol_set_volsize()
848 if (zv != NULL) in zvol_set_volsize()
849 zv->zv_objset = os; in zvol_set_volsize()
851 os = zv->zv_objset; in zvol_set_volsize()
860 if (error == 0 && zv != NULL) in zvol_set_volsize()
861 error = zvol_update_live_volsize(zv, volsize); in zvol_set_volsize()
865 if (zv != NULL) in zvol_set_volsize()
866 zv->zv_objset = NULL; in zvol_set_volsize()
876 zvol_state_t *zv; in zvol_open() local
881 zv = zfsdev_get_soft_state(getminor(*devp), ZSST_ZVOL); in zvol_open()
882 if (zv == NULL) { in zvol_open()
887 if (zv->zv_total_opens == 0) in zvol_open()
888 err = zvol_first_open(zv); in zvol_open()
893 if ((flag & FWRITE) && (zv->zv_flags & ZVOL_RDONLY)) { in zvol_open()
897 if (zv->zv_flags & ZVOL_EXCL) { in zvol_open()
902 if (zv->zv_total_opens != 0) { in zvol_open()
906 zv->zv_flags |= ZVOL_EXCL; in zvol_open()
909 if (zv->zv_open_count[otyp] == 0 || otyp == OTYP_LYR) { in zvol_open()
910 zv->zv_open_count[otyp]++; in zvol_open()
911 zv->zv_total_opens++; in zvol_open()
917 if (zv->zv_total_opens == 0) in zvol_open()
918 zvol_last_close(zv); in zvol_open()
928 zvol_state_t *zv; in zvol_close() local
933 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_close()
934 if (zv == NULL) { in zvol_close()
939 if (zv->zv_flags & ZVOL_EXCL) { in zvol_close()
940 ASSERT(zv->zv_total_opens == 1); in zvol_close()
941 zv->zv_flags &= ~ZVOL_EXCL; in zvol_close()
948 ASSERT(zv->zv_open_count[otyp] != 0); in zvol_close()
949 ASSERT(zv->zv_total_opens != 0); in zvol_close()
954 zv->zv_open_count[otyp]--; in zvol_close()
955 zv->zv_total_opens--; in zvol_close()
957 if (zv->zv_total_opens == 0) in zvol_close()
958 zvol_last_close(zv); in zvol_close()
984 zvol_state_t *zv = arg; in zvol_get_data() local
985 objset_t *os = zv->zv_objset; in zvol_get_data()
998 zgd->zgd_zilog = zv->zv_zilog; in zvol_get_data()
999 zgd->zgd_rl = zfs_range_lock(&zv->zv_znode, offset, size, RL_READER); in zvol_get_data()
1012 size = zv->zv_volblocksize; in zvol_get_data()
1051 zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx, offset_t off, ssize_t resid, in zvol_log_write() argument
1054 uint32_t blocksize = zv->zv_volblocksize; in zvol_log_write()
1055 zilog_t *zilog = zv->zv_zilog; in zvol_log_write()
1093 if (write_state == WR_COPIED && dmu_read(zv->zv_objset, in zvol_log_write()
1110 itx->itx_private = zv; in zvol_log_write()
1117 rz_zev_callbacks->rz_zev_zvol_write(zv->zv_name, in zvol_log_write()
1118 zv->zv_objset, tx, off, len); in zvol_log_write()
1180 zvol_dumpio(zvol_state_t *zv, void *addr, uint64_t offset, uint64_t size, in zvol_dumpio() argument
1186 spa_t *spa = dmu_objset_spa(zv->zv_objset); in zvol_dumpio()
1190 P2BOUNDARY(offset, size, zv->zv_volblocksize)) { in zvol_dumpio()
1193 ASSERT(size <= zv->zv_volblocksize); in zvol_dumpio()
1196 ze = list_head(&zv->zv_extents); in zvol_dumpio()
1197 while (offset >= ze->ze_nblks * zv->zv_volblocksize) { in zvol_dumpio()
1198 offset -= ze->ze_nblks * zv->zv_volblocksize; in zvol_dumpio()
1199 ze = list_next(&zv->zv_extents, ze); in zvol_dumpio()
1223 zvol_state_t *zv; in zvol_strategy() local
1250 zv = zs->zss_data; in zvol_strategy()
1252 if (!(bp->b_flags & B_READ) && (zv->zv_flags & ZVOL_RDONLY)) { in zvol_strategy()
1259 volsize = zv->zv_volsize; in zvol_strategy()
1261 os = zv->zv_objset; in zvol_strategy()
1274 is_dumpified = zv->zv_flags & ZVOL_DUMPIFIED; in zvol_strategy()
1276 !(zv->zv_flags & ZVOL_WCE)) || in zvol_strategy()
1277 (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS)) && in zvol_strategy()
1284 rl = zfs_range_lock(&zv->zv_znode, off, resid, in zvol_strategy()
1290 size = MIN(size, P2END(off, zv->zv_volblocksize) - off); in zvol_strategy()
1291 error = zvol_dumpio(zv, addr, off, size, in zvol_strategy()
1304 zvol_log_write(zv, tx, off, size, sync); in zvol_strategy()
1324 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_strategy()
1349 zvol_state_t *zv; in zvol_dump() local
1355 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_dump()
1356 if (zv == NULL) in zvol_dump()
1359 if ((zv->zv_flags & ZVOL_DUMPIFIED) == 0) in zvol_dump()
1365 VERIFY3U(boff + resid, <=, zv->zv_volsize); in zvol_dump()
1368 size = MIN(resid, P2END(boff, zv->zv_volblocksize) - boff); in zvol_dump()
1369 error = zvol_dumpio(zv, addr, boff, size, B_FALSE, B_TRUE); in zvol_dump()
1385 zvol_state_t *zv; in zvol_read() local
1390 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_read()
1391 if (zv == NULL) in zvol_read()
1394 volsize = zv->zv_volsize; in zvol_read()
1399 if (zv->zv_flags & ZVOL_DUMPIFIED) { in zvol_read()
1405 rl = zfs_range_lock(&zv->zv_znode, uio->uio_loffset, uio->uio_resid, in zvol_read()
1414 error = dmu_read_uio(zv->zv_objset, ZVOL_OBJ, uio, bytes); in zvol_read()
1431 zvol_state_t *zv; in zvol_write() local
1437 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_write()
1438 if (zv == NULL) in zvol_write()
1441 volsize = zv->zv_volsize; in zvol_write()
1446 if (zv->zv_flags & ZVOL_DUMPIFIED) { in zvol_write()
1452 sync = !(zv->zv_flags & ZVOL_WCE) || in zvol_write()
1453 (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS); in zvol_write()
1455 rl = zfs_range_lock(&zv->zv_znode, uio->uio_loffset, uio->uio_resid, in zvol_write()
1460 dmu_tx_t *tx = dmu_tx_create(zv->zv_objset); in zvol_write()
1471 error = dmu_write_uio_dbuf(zv->zv_dbuf, uio, bytes, tx); in zvol_write()
1473 zvol_log_write(zv, tx, off, bytes, sync); in zvol_write()
1481 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_write()
1554 zvol_state_t *zv; in zvol_get_volume_params() local
1556 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_get_volume_params()
1557 if (zv == NULL) in zvol_get_volume_params()
1559 if (zv->zv_flags & ZVOL_DUMPIFIED) in zvol_get_volume_params()
1565 *blksize = zv->zv_volblocksize; in zvol_get_volume_params()
1567 *minor_hdl = zv; in zvol_get_volume_params()
1568 *objset_hdl = zv->zv_objset; in zvol_get_volume_params()
1569 *zil_hdl = zv->zv_zilog; in zvol_get_volume_params()
1570 *rl_hdl = &zv->zv_znode; in zvol_get_volume_params()
1571 *bonus_hdl = zv->zv_dbuf; in zvol_get_volume_params()
1582 zvol_state_t *zv = minor_hdl; in zvol_get_volume_size() local
1584 return (zv->zv_volsize); in zvol_get_volume_size()
1594 zvol_state_t *zv = minor_hdl; in zvol_get_volume_wce() local
1596 return ((zv->zv_flags & ZVOL_WCE) ? 1 : 0); in zvol_get_volume_wce()
1606 zvol_state_t *zv = minor_hdl; in zvol_log_write_minor() local
1608 zvol_log_write(zv, tx, off, resid, sync); in zvol_log_write_minor()
1618 zvol_log_truncate(zvol_state_t *zv, dmu_tx_t *tx, uint64_t off, uint64_t len, in zvol_log_truncate() argument
1623 zilog_t *zilog = zv->zv_zilog; in zvol_log_truncate()
1639 rz_zev_callbacks->rz_zev_zvol_truncate(zv->zv_name, in zvol_log_truncate()
1640 zv->zv_objset, tx, off, len); in zvol_log_truncate()
1652 zvol_state_t *zv; in zvol_ioctl() local
1659 zv = zfsdev_get_soft_state(getminor(dev), ZSST_ZVOL); in zvol_ioctl()
1661 if (zv == NULL) { in zvol_ioctl()
1665 ASSERT(zv->zv_total_opens > 0); in zvol_ioctl()
1679 1 << (SPA_OLD_MAXBLOCKSHIFT - zv->zv_min_bs); in zvol_ioctl()
1691 dkm.dki_lbsize = 1U << zv->zv_min_bs; in zvol_ioctl()
1692 dkm.dki_capacity = zv->zv_volsize >> zv->zv_min_bs; in zvol_ioctl()
1705 dkmext.dki_lbsize = 1U << zv->zv_min_bs; in zvol_ioctl()
1706 dkmext.dki_pbsize = zv->zv_volblocksize; in zvol_ioctl()
1707 dkmext.dki_capacity = zv->zv_volsize >> zv->zv_min_bs; in zvol_ioctl()
1717 uint64_t vs = zv->zv_volsize; in zvol_ioctl()
1718 uint8_t bs = zv->zv_min_bs; in zvol_ioctl()
1728 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_ioctl()
1737 int wce = (zv->zv_flags & ZVOL_WCE) ? 1 : 0; in zvol_ioctl()
1752 zv->zv_flags |= ZVOL_WCE; in zvol_ioctl()
1755 zv->zv_flags &= ~ZVOL_WCE; in zvol_ioctl()
1757 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_ioctl()
1772 rl = zfs_range_lock(&zv->zv_znode, 0, zv->zv_volsize, in zvol_ioctl()
1774 error = zvol_dumpify(zv); in zvol_ioctl()
1779 if (!(zv->zv_flags & ZVOL_DUMPIFIED)) in zvol_ioctl()
1781 rl = zfs_range_lock(&zv->zv_znode, 0, zv->zv_volsize, in zvol_ioctl()
1783 error = zvol_dump_fini(zv); in zvol_ioctl()
1805 if (df.df_start >= zv->zv_volsize) in zvol_ioctl()
1810 rl = zfs_range_lock(&zv->zv_znode, df.df_start, df.df_length, in zvol_ioctl()
1812 tx = dmu_tx_create(zv->zv_objset); in zvol_ioctl()
1818 zvol_log_truncate(zv, tx, df.df_start, in zvol_ioctl()
1821 error = dmu_free_long_range(zv->zv_objset, ZVOL_OBJ, in zvol_ioctl()
1833 if (!(zv->zv_flags & ZVOL_WCE) || in zvol_ioctl()
1834 (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS)) in zvol_ioctl()
1835 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_ioctl()
1844 dmu_objset_pool(zv->zv_objset), 0); in zvol_ioctl()
1901 zvol_dump_init(zvol_state_t *zv, boolean_t resize) in zvol_dump_init() argument
1905 objset_t *os = zv->zv_objset; in zvol_dump_init()
1915 error = dmu_free_long_range(zv->zv_objset, ZVOL_OBJ, 0, in zvol_dump_init()
1920 txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0); in zvol_dump_init()
1943 error = dsl_prop_get_integer(zv->zv_name, in zvol_dump_init()
1946 error = dsl_prop_get_integer(zv->zv_name, in zvol_dump_init()
1951 error = dsl_prop_get_integer(zv->zv_name, in zvol_dump_init()
1956 error = dsl_prop_get_integer(zv->zv_name, in zvol_dump_init()
1961 error = dsl_prop_get_integer(zv->zv_name, in zvol_dump_init()
1986 &zv->zv_volsize, tx); in zvol_dump_init()
2016 zv->zv_volblocksize = SPA_OLD_MAXBLOCKSIZE; in zvol_dump_init()
2048 error = zfs_set_prop_nvlist(zv->zv_name, ZPROP_SRC_LOCAL, in zvol_dump_init()
2055 error = zvol_prealloc(zv); in zvol_dump_init()
2060 zvol_dumpify(zvol_state_t *zv) in zvol_dumpify() argument
2065 objset_t *os = zv->zv_objset; in zvol_dumpify()
2067 if (zv->zv_flags & ZVOL_RDONLY) in zvol_dumpify()
2070 if (zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, ZVOL_DUMPSIZE, in zvol_dumpify()
2071 8, 1, &dumpsize) != 0 || dumpsize != zv->zv_volsize) { in zvol_dumpify()
2074 if ((error = zvol_dump_init(zv, resize)) != 0) { in zvol_dumpify()
2075 (void) zvol_dump_fini(zv); in zvol_dumpify()
2083 error = zvol_get_lbas(zv); in zvol_dumpify()
2085 (void) zvol_dump_fini(zv); in zvol_dumpify()
2094 (void) zvol_dump_fini(zv); in zvol_dumpify()
2098 zv->zv_flags |= ZVOL_DUMPIFIED; in zvol_dumpify()
2100 &zv->zv_volsize, tx); in zvol_dumpify()
2104 (void) zvol_dump_fini(zv); in zvol_dumpify()
2113 zvol_dump_fini(zvol_state_t *zv) in zvol_dump_fini() argument
2116 objset_t *os = zv->zv_objset; in zvol_dump_fini()
2120 uint64_t version = spa_version(dmu_objset_spa(zv->zv_objset)); in zvol_dump_fini()
2139 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2141 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2143 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2145 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2156 zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2161 (void) zfs_set_prop_nvlist(zv->zv_name, ZPROP_SRC_LOCAL, in zvol_dump_fini()
2165 zvol_free_extents(zv); in zvol_dump_fini()
2166 zv->zv_flags &= ~ZVOL_DUMPIFIED; in zvol_dump_fini()
2169 txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0); in zvol_dump_fini()
2178 zv->zv_volblocksize = vbs; in zvol_dump_fini()