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