Lines Matching refs:zv
164 static int zvol_dumpify(zvol_state_t *zv);
165 static int zvol_dump_fini(zvol_state_t *zv);
166 static int zvol_dump_init(zvol_state_t *zv, boolean_t resize);
169 zvol_size_changed(zvol_state_t *zv, uint64_t volsize) in zvol_size_changed() argument
171 dev_t dev = makedevice(ddi_driver_major(zfs_dip), zv->zv_minor); in zvol_size_changed()
173 zv->zv_volsize = volsize; in zvol_size_changed()
238 zvol_state_t *zv; in zvol_minor_lookup() local
243 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_minor_lookup()
244 if (zv == NULL) in zvol_minor_lookup()
246 if (strcmp(zv->zv_name, name) == 0) in zvol_minor_lookup()
247 return (zv); in zvol_minor_lookup()
304 zvol_free_extents(zvol_state_t *zv) in zvol_free_extents() argument
308 while (ze = list_head(&zv->zv_extents)) { in zvol_free_extents()
309 list_remove(&zv->zv_extents, ze); in zvol_free_extents()
315 zvol_get_lbas(zvol_state_t *zv) in zvol_get_lbas() argument
317 objset_t *os = zv->zv_objset; in zvol_get_lbas()
321 ma.ma_zv = zv; in zvol_get_lbas()
323 zvol_free_extents(zv); in zvol_get_lbas()
329 if (err || ma.ma_blks != (zv->zv_volsize / zv->zv_volblocksize)) { in zvol_get_lbas()
330 zvol_free_extents(zv); in zvol_get_lbas()
380 zvol_state_t *zv = arg1; in zvol_replay_truncate() local
390 return (dmu_free_long_range(zv->zv_objset, ZVOL_OBJ, offset, length)); in zvol_replay_truncate()
401 zvol_state_t *zv = arg1; in zvol_replay_write() local
403 objset_t *os = zv->zv_objset; in zvol_replay_write()
474 zvol_state_t *zv; in zvol_name2minor() local
477 zv = zvol_minor_lookup(name); in zvol_name2minor()
478 if (minor && zv) in zvol_name2minor()
479 *minor = zv->zv_minor; in zvol_name2minor()
481 return (zv ? 0 : -1); in zvol_name2minor()
491 zvol_state_t *zv; in zvol_create_minor() local
550 zv = zs->zss_data = kmem_zalloc(sizeof (zvol_state_t), KM_SLEEP); in zvol_create_minor()
551 (void) strlcpy(zv->zv_name, name, MAXPATHLEN); in zvol_create_minor()
552 zv->zv_min_bs = DEV_BSHIFT; in zvol_create_minor()
553 zv->zv_minor = minor; in zvol_create_minor()
554 zv->zv_objset = os; in zvol_create_minor()
556 zv->zv_flags |= ZVOL_RDONLY; in zvol_create_minor()
557 rangelock_init(&zv->zv_rangelock, NULL, NULL); in zvol_create_minor()
558 list_create(&zv->zv_extents, sizeof (zvol_extent_t), in zvol_create_minor()
563 zv->zv_volblocksize = doi.doi_data_block_size; in zvol_create_minor()
569 zil_replay(os, zv, zvol_replay_vector); in zvol_create_minor()
572 zv->zv_objset = NULL; in zvol_create_minor()
585 zvol_remove_zv(zvol_state_t *zv) in zvol_remove_zv() argument
588 minor_t minor = zv->zv_minor; in zvol_remove_zv()
591 if (zv->zv_total_opens != 0) in zvol_remove_zv()
600 rangelock_fini(&zv->zv_rangelock); in zvol_remove_zv()
602 kmem_free(zv, sizeof (zvol_state_t)); in zvol_remove_zv()
613 zvol_state_t *zv; in zvol_remove_minor() local
617 if ((zv = zvol_minor_lookup(name)) == NULL) { in zvol_remove_minor()
621 rc = zvol_remove_zv(zv); in zvol_remove_minor()
627 zvol_first_open(zvol_state_t *zv, boolean_t rdonly) in zvol_first_open() argument
635 ro = (rdonly || (strchr(zv->zv_name, '@') != NULL)); in zvol_first_open()
636 error = dmu_objset_own(zv->zv_name, DMU_OST_ZVOL, ro, B_TRUE, zv, &os); in zvol_first_open()
640 zv->zv_objset = os; in zvol_first_open()
644 dmu_objset_disown(os, 1, zv); in zvol_first_open()
648 error = dnode_hold(os, ZVOL_OBJ, zvol_tag, &zv->zv_dn); in zvol_first_open()
650 dmu_objset_disown(os, 1, zv); in zvol_first_open()
654 zvol_size_changed(zv, volsize); in zvol_first_open()
655 zv->zv_zilog = zil_open(os, zvol_get_data); in zvol_first_open()
657 VERIFY(dsl_prop_get_integer(zv->zv_name, "readonly", &readonly, in zvol_first_open()
661 zv->zv_flags |= ZVOL_RDONLY; in zvol_first_open()
663 zv->zv_flags &= ~ZVOL_RDONLY; in zvol_first_open()
668 zvol_last_close(zvol_state_t *zv) in zvol_last_close() argument
670 zil_close(zv->zv_zilog); in zvol_last_close()
671 zv->zv_zilog = NULL; in zvol_last_close()
673 dnode_rele(zv->zv_dn, zvol_tag); in zvol_last_close()
674 zv->zv_dn = NULL; in zvol_last_close()
679 if (dsl_dataset_is_dirty(dmu_objset_ds(zv->zv_objset)) && in zvol_last_close()
680 !(zv->zv_flags & ZVOL_RDONLY)) in zvol_last_close()
681 txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0); in zvol_last_close()
682 dmu_objset_evict_dbufs(zv->zv_objset); in zvol_last_close()
684 dmu_objset_disown(zv->zv_objset, 1, zv); in zvol_last_close()
685 zv->zv_objset = NULL; in zvol_last_close()
689 zvol_prealloc(zvol_state_t *zv) in zvol_prealloc() argument
691 objset_t *os = zv->zv_objset; in zvol_prealloc()
694 uint64_t resid = zv->zv_volsize; in zvol_prealloc()
699 if (avail < zv->zv_volsize) in zvol_prealloc()
703 zvol_free_extents(zv); in zvol_prealloc()
761 zvol_state_t *zv; in zvol_remove_minors() local
771 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_remove_minors()
772 if (zv == NULL) in zvol_remove_minors()
774 if (strncmp(namebuf, zv->zv_name, strlen(namebuf)) == 0) in zvol_remove_minors()
775 (void) zvol_remove_zv(zv); in zvol_remove_minors()
783 zvol_update_live_volsize(zvol_state_t *zv, uint64_t volsize) in zvol_update_live_volsize() argument
797 old_volsize = zv->zv_volsize; in zvol_update_live_volsize()
798 zvol_size_changed(zv, volsize); in zvol_update_live_volsize()
800 if (zv->zv_flags & ZVOL_DUMPIFIED) { in zvol_update_live_volsize()
801 if ((error = zvol_dumpify(zv)) != 0 || in zvol_update_live_volsize()
805 (void) zvol_update_volsize(zv->zv_objset, old_volsize); in zvol_update_live_volsize()
806 zvol_size_changed(zv, old_volsize); in zvol_update_live_volsize()
807 dumpify_error = zvol_dumpify(zv); in zvol_update_live_volsize()
819 zv->zv_minor); in zvol_update_live_volsize()
830 zvol_state_t *zv = NULL; in zvol_set_volsize() local
845 zv = zvol_minor_lookup(name); in zvol_set_volsize()
847 if (zv == NULL || zv->zv_objset == NULL) { in zvol_set_volsize()
854 if (zv != NULL) in zvol_set_volsize()
855 zv->zv_objset = os; in zvol_set_volsize()
857 os = zv->zv_objset; in zvol_set_volsize()
866 if (error == 0 && zv != NULL) in zvol_set_volsize()
867 error = zvol_update_live_volsize(zv, volsize); in zvol_set_volsize()
871 if (zv != NULL) in zvol_set_volsize()
872 zv->zv_objset = NULL; in zvol_set_volsize()
882 zvol_state_t *zv; in zvol_open() local
887 zv = zfsdev_get_soft_state(getminor(*devp), ZSST_ZVOL); in zvol_open()
888 if (zv == NULL) { in zvol_open()
893 if (zv->zv_total_opens == 0) in zvol_open()
894 err = zvol_first_open(zv, !(flag & FWRITE)); in zvol_open()
900 if ((flag & FWRITE) && (zv->zv_flags & ZVOL_RDONLY)) { in zvol_open()
904 if (zv->zv_flags & ZVOL_EXCL) { in zvol_open()
909 if (zv->zv_total_opens != 0) { in zvol_open()
913 zv->zv_flags |= ZVOL_EXCL; in zvol_open()
916 if (zv->zv_open_count[otyp] == 0 || otyp == OTYP_LYR) { in zvol_open()
917 zv->zv_open_count[otyp]++; in zvol_open()
918 zv->zv_total_opens++; in zvol_open()
924 if (zv->zv_total_opens == 0) in zvol_open()
925 zvol_last_close(zv); in zvol_open()
935 zvol_state_t *zv; in zvol_close() local
940 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_close()
941 if (zv == NULL) { in zvol_close()
946 if (zv->zv_flags & ZVOL_EXCL) { in zvol_close()
947 ASSERT(zv->zv_total_opens == 1); in zvol_close()
948 zv->zv_flags &= ~ZVOL_EXCL; in zvol_close()
955 ASSERT(zv->zv_open_count[otyp] != 0); in zvol_close()
956 ASSERT(zv->zv_total_opens != 0); in zvol_close()
961 zv->zv_open_count[otyp]--; in zvol_close()
962 zv->zv_total_opens--; in zvol_close()
964 if (zv->zv_total_opens == 0) in zvol_close()
965 zvol_last_close(zv); in zvol_close()
989 zvol_state_t *zv = arg; in zvol_get_data() local
1011 zgd->zgd_lr = rangelock_enter(&zv->zv_rangelock, offset, size, in zvol_get_data()
1013 error = dmu_read_by_dnode(zv->zv_dn, offset, size, buf, in zvol_get_data()
1022 size = zv->zv_volblocksize; in zvol_get_data()
1024 zgd->zgd_lr = rangelock_enter(&zv->zv_rangelock, offset, size, in zvol_get_data()
1026 error = dmu_buf_hold_by_dnode(zv->zv_dn, offset, zgd, &db, in zvol_get_data()
1059 zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx, offset_t off, ssize_t resid, in zvol_log_write() argument
1062 uint32_t blocksize = zv->zv_volblocksize; in zvol_log_write()
1063 zilog_t *zilog = zv->zv_zilog; in zvol_log_write()
1093 if (wr_state == WR_COPIED && dmu_read_by_dnode(zv->zv_dn, in zvol_log_write()
1108 itx->itx_private = zv; in zvol_log_write()
1134 zvol_dumpio(zvol_state_t *zv, void *addr, uint64_t offset, uint64_t size, in zvol_dumpio() argument
1140 spa_t *spa = dmu_objset_spa(zv->zv_objset); in zvol_dumpio()
1144 P2BOUNDARY(offset, size, zv->zv_volblocksize)) { in zvol_dumpio()
1147 VERIFY3U(size, <=, zv->zv_volblocksize); in zvol_dumpio()
1150 for (ze = list_head(&zv->zv_extents); in zvol_dumpio()
1151 ze != NULL && offset >= ze->ze_nblks * zv->zv_volblocksize; in zvol_dumpio()
1152 ze = list_next(&zv->zv_extents, ze)) { in zvol_dumpio()
1153 offset -= ze->ze_nblks * zv->zv_volblocksize; in zvol_dumpio()
1177 zvol_state_t *zv; in zvol_strategy() local
1203 zv = zs->zss_data; in zvol_strategy()
1205 if (!(bp->b_flags & B_READ) && (zv->zv_flags & ZVOL_RDONLY)) { in zvol_strategy()
1212 volsize = zv->zv_volsize; in zvol_strategy()
1214 os = zv->zv_objset; in zvol_strategy()
1227 is_dumpified = zv->zv_flags & ZVOL_DUMPIFIED; in zvol_strategy()
1229 !(zv->zv_flags & ZVOL_WCE)) || in zvol_strategy()
1230 (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS)) && in zvol_strategy()
1239 locked_range_t *lr = rangelock_enter(&zv->zv_rangelock, off, resid, in zvol_strategy()
1245 size = MIN(size, P2END(off, zv->zv_volblocksize) - off); in zvol_strategy()
1246 error = zvol_dumpio(zv, addr, off, size, in zvol_strategy()
1259 zvol_log_write(zv, tx, off, size, sync); in zvol_strategy()
1279 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_strategy()
1306 zvol_state_t *zv; in zvol_dump() local
1312 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_dump()
1313 if (zv == NULL) in zvol_dump()
1316 if ((zv->zv_flags & ZVOL_DUMPIFIED) == 0) in zvol_dump()
1322 VERIFY3U(boff + resid, <=, zv->zv_volsize); in zvol_dump()
1325 size = MIN(resid, P2END(boff, zv->zv_volblocksize) - boff); in zvol_dump()
1326 error = zvol_dumpio(zv, addr, boff, size, B_FALSE, B_TRUE); in zvol_dump()
1342 zvol_state_t *zv; in zvol_read() local
1346 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_read()
1347 if (zv == NULL) in zvol_read()
1350 volsize = zv->zv_volsize; in zvol_read()
1355 if (zv->zv_flags & ZVOL_DUMPIFIED) { in zvol_read()
1363 locked_range_t *lr = rangelock_enter(&zv->zv_rangelock, in zvol_read()
1372 error = dmu_read_uio(zv->zv_objset, ZVOL_OBJ, uio, bytes); in zvol_read()
1392 zvol_state_t *zv; in zvol_write() local
1397 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_write()
1398 if (zv == NULL) in zvol_write()
1401 volsize = zv->zv_volsize; in zvol_write()
1406 if (zv->zv_flags & ZVOL_DUMPIFIED) { in zvol_write()
1414 sync = !(zv->zv_flags & ZVOL_WCE) || in zvol_write()
1415 (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS); in zvol_write()
1417 locked_range_t *lr = rangelock_enter(&zv->zv_rangelock, in zvol_write()
1422 dmu_tx_t *tx = dmu_tx_create(zv->zv_objset); in zvol_write()
1427 dmu_tx_hold_write_by_dnode(tx, zv->zv_dn, off, bytes); in zvol_write()
1433 error = dmu_write_uio_dnode(zv->zv_dn, uio, bytes, tx); in zvol_write()
1435 zvol_log_write(zv, tx, off, bytes, sync); in zvol_write()
1444 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_write()
1520 zvol_state_t *zv; in zvol_get_volume_params() local
1522 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL); in zvol_get_volume_params()
1523 if (zv == NULL) in zvol_get_volume_params()
1525 if (zv->zv_flags & ZVOL_DUMPIFIED) in zvol_get_volume_params()
1531 *blksize = zv->zv_volblocksize; in zvol_get_volume_params()
1533 *minor_hdl = zv; in zvol_get_volume_params()
1534 *objset_hdl = zv->zv_objset; in zvol_get_volume_params()
1535 *zil_hdl = zv->zv_zilog; in zvol_get_volume_params()
1536 *rl_hdl = &zv->zv_rangelock; in zvol_get_volume_params()
1537 *dnode_hdl = zv->zv_dn; in zvol_get_volume_params()
1548 zvol_state_t *zv = minor_hdl; in zvol_get_volume_size() local
1550 return (zv->zv_volsize); in zvol_get_volume_size()
1560 zvol_state_t *zv = minor_hdl; in zvol_get_volume_wce() local
1562 return ((zv->zv_flags & ZVOL_WCE) ? 1 : 0); in zvol_get_volume_wce()
1572 zvol_state_t *zv = minor_hdl; in zvol_log_write_minor() local
1574 zvol_log_write(zv, tx, off, resid, sync); in zvol_log_write_minor()
1584 zvol_log_truncate(zvol_state_t *zv, dmu_tx_t *tx, uint64_t off, uint64_t len, in zvol_log_truncate() argument
1589 zilog_t *zilog = zv->zv_zilog; in zvol_log_truncate()
1612 zvol_state_t *zv; in zvol_ioctl() local
1619 zv = zfsdev_get_soft_state(getminor(dev), ZSST_ZVOL); in zvol_ioctl()
1621 if (zv == NULL) { in zvol_ioctl()
1625 ASSERT(zv->zv_total_opens > 0); in zvol_ioctl()
1639 1 << (SPA_OLD_MAXBLOCKSHIFT - zv->zv_min_bs); in zvol_ioctl()
1651 dkm.dki_lbsize = 1U << zv->zv_min_bs; in zvol_ioctl()
1652 dkm.dki_capacity = zv->zv_volsize >> zv->zv_min_bs; in zvol_ioctl()
1666 dkmext.dki_lbsize = 1U << zv->zv_min_bs; in zvol_ioctl()
1667 dkmext.dki_pbsize = zv->zv_volblocksize; in zvol_ioctl()
1668 dkmext.dki_capacity = zv->zv_volsize >> zv->zv_min_bs; in zvol_ioctl()
1688 uint64_t vs = zv->zv_volsize; in zvol_ioctl()
1689 uint8_t bs = zv->zv_min_bs; in zvol_ioctl()
1702 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_ioctl()
1714 int wce = (zv->zv_flags & ZVOL_WCE) ? 1 : 0; in zvol_ioctl()
1729 zv->zv_flags |= ZVOL_WCE; in zvol_ioctl()
1732 zv->zv_flags &= ~ZVOL_WCE; in zvol_ioctl()
1735 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_ioctl()
1751 lr = rangelock_enter(&zv->zv_rangelock, 0, zv->zv_volsize, in zvol_ioctl()
1753 error = zvol_dumpify(zv); in zvol_ioctl()
1758 if (!(zv->zv_flags & ZVOL_DUMPIFIED)) in zvol_ioctl()
1760 lr = rangelock_enter(&zv->zv_rangelock, 0, zv->zv_volsize, in zvol_ioctl()
1762 error = zvol_dump_fini(zv); in zvol_ioctl()
1801 if (start >= zv->zv_volsize) in zvol_ioctl()
1803 if (end > zv->zv_volsize) { in zvol_ioctl()
1808 lr = rangelock_enter(&zv->zv_rangelock, start, length, in zvol_ioctl()
1810 tx = dmu_tx_create(zv->zv_objset); in zvol_ioctl()
1815 zvol_log_truncate(zv, tx, start, length, in zvol_ioctl()
1818 error = dmu_free_long_range(zv->zv_objset, in zvol_ioctl()
1837 (!(zv->zv_flags & ZVOL_WCE) || in zvol_ioctl()
1838 (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS) || in zvol_ioctl()
1840 zil_commit(zv->zv_zilog, ZVOL_OBJ); in zvol_ioctl()
1911 zvol_dump_init(zvol_state_t *zv, boolean_t resize) in zvol_dump_init() argument
1915 objset_t *os = zv->zv_objset; in zvol_dump_init()
1925 error = dmu_free_long_range(zv->zv_objset, ZVOL_OBJ, 0, in zvol_dump_init()
1930 txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0); in zvol_dump_init()
1953 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()
1966 error = dsl_prop_get_integer(zv->zv_name, in zvol_dump_init()
1971 error = dsl_prop_get_integer(zv->zv_name, in zvol_dump_init()
1996 &zv->zv_volsize, tx); in zvol_dump_init()
2026 zv->zv_volblocksize = SPA_OLD_MAXBLOCKSIZE; in zvol_dump_init()
2058 error = zfs_set_prop_nvlist(zv->zv_name, ZPROP_SRC_LOCAL, in zvol_dump_init()
2065 error = zvol_prealloc(zv); in zvol_dump_init()
2070 zvol_dumpify(zvol_state_t *zv) in zvol_dumpify() argument
2075 objset_t *os = zv->zv_objset; in zvol_dumpify()
2077 if (zv->zv_flags & ZVOL_RDONLY) in zvol_dumpify()
2083 if (zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, ZVOL_DUMPSIZE, in zvol_dumpify()
2084 8, 1, &dumpsize) != 0 || dumpsize != zv->zv_volsize) { in zvol_dumpify()
2087 if ((error = zvol_dump_init(zv, resize)) != 0) { in zvol_dumpify()
2088 (void) zvol_dump_fini(zv); in zvol_dumpify()
2096 error = zvol_get_lbas(zv); in zvol_dumpify()
2098 (void) zvol_dump_fini(zv); in zvol_dumpify()
2107 (void) zvol_dump_fini(zv); in zvol_dumpify()
2111 zv->zv_flags |= ZVOL_DUMPIFIED; in zvol_dumpify()
2113 &zv->zv_volsize, tx); in zvol_dumpify()
2117 (void) zvol_dump_fini(zv); in zvol_dumpify()
2126 zvol_dump_fini(zvol_state_t *zv) in zvol_dump_fini() argument
2129 objset_t *os = zv->zv_objset; in zvol_dump_fini()
2133 uint64_t version = spa_version(dmu_objset_spa(zv->zv_objset)); in zvol_dump_fini()
2152 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2154 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2156 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2158 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2169 zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, in zvol_dump_fini()
2174 (void) zfs_set_prop_nvlist(zv->zv_name, ZPROP_SRC_LOCAL, in zvol_dump_fini()
2178 zvol_free_extents(zv); in zvol_dump_fini()
2179 zv->zv_flags &= ~ZVOL_DUMPIFIED; in zvol_dump_fini()
2182 txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0); in zvol_dump_fini()
2191 zv->zv_volblocksize = vbs; in zvol_dump_fini()