Lines Matching refs:zv

161 static int zvol_dumpify(zvol_state_t *zv);
162 static int zvol_dump_fini(zvol_state_t *zv);
163 static int zvol_dump_init(zvol_state_t *zv, boolean_t resize);
166 zvol_size_changed(zvol_state_t *zv, uint64_t volsize)
168 dev_t dev = makedevice(ddi_driver_major(zfs_dip), zv->zv_minor);
170 zv->zv_volsize = volsize;
235 zvol_state_t *zv;
240 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL);
241 if (zv == NULL)
243 if (strcmp(zv->zv_name, name) == 0)
244 return (zv);
301 zvol_free_extents(zvol_state_t *zv)
305 while (ze = list_head(&zv->zv_extents)) {
306 list_remove(&zv->zv_extents, ze);
312 zvol_get_lbas(zvol_state_t *zv)
314 objset_t *os = zv->zv_objset;
318 ma.ma_zv = zv;
320 zvol_free_extents(zv);
326 if (err || ma.ma_blks != (zv->zv_volsize / zv->zv_volblocksize)) {
327 zvol_free_extents(zv);
375 zvol_replay_truncate(zvol_state_t *zv, lr_truncate_t *lr, boolean_t byteswap)
385 return (dmu_free_long_range(zv->zv_objset, ZVOL_OBJ, offset, length));
393 zvol_replay_write(zvol_state_t *zv, lr_write_t *lr, boolean_t byteswap)
395 objset_t *os = zv->zv_objset;
431 zvol_replay_err(zvol_state_t *zv, lr_t *lr, boolean_t byteswap)
466 zvol_state_t *zv;
469 zv = zvol_minor_lookup(name);
470 if (minor && zv)
471 *minor = zv->zv_minor;
473 return (zv ? 0 : -1);
483 zvol_state_t *zv;
542 zv = zs->zss_data = kmem_zalloc(sizeof (zvol_state_t), KM_SLEEP);
543 (void) strlcpy(zv->zv_name, name, MAXPATHLEN);
544 zv->zv_min_bs = DEV_BSHIFT;
545 zv->zv_minor = minor;
546 zv->zv_objset = os;
548 zv->zv_flags |= ZVOL_RDONLY;
549 mutex_init(&zv->zv_znode.z_range_lock, NULL, MUTEX_DEFAULT, NULL);
550 avl_create(&zv->zv_znode.z_range_avl, zfs_range_compare,
552 list_create(&zv->zv_extents, sizeof (zvol_extent_t),
557 zv->zv_volblocksize = doi.doi_data_block_size;
563 zil_replay(os, zv, zvol_replay_vector);
566 zv->zv_objset = NULL;
579 zvol_remove_zv(zvol_state_t *zv)
582 minor_t minor = zv->zv_minor;
585 if (zv->zv_total_opens != 0)
594 avl_destroy(&zv->zv_znode.z_range_avl);
595 mutex_destroy(&zv->zv_znode.z_range_lock);
597 kmem_free(zv, sizeof (zvol_state_t));
608 zvol_state_t *zv;
612 if ((zv = zvol_minor_lookup(name)) == NULL) {
616 rc = zvol_remove_zv(zv);
622 zvol_first_open(zvol_state_t *zv)
630 error = dmu_objset_own(zv->zv_name, DMU_OST_ZVOL, B_TRUE,
635 zv->zv_objset = os;
643 error = dmu_bonus_hold(os, ZVOL_OBJ, zvol_tag, &zv->zv_dbuf);
649 zvol_size_changed(zv, volsize);
650 zv->zv_zilog = zil_open(os, zvol_get_data);
652 VERIFY(dsl_prop_get_integer(zv->zv_name, "readonly", &readonly,
656 zv->zv_flags |= ZVOL_RDONLY;
658 zv->zv_flags &= ~ZVOL_RDONLY;
663 zvol_last_close(zvol_state_t *zv)
665 zil_close(zv->zv_zilog);
666 zv->zv_zilog = NULL;
668 dmu_buf_rele(zv->zv_dbuf, zvol_tag);
669 zv->zv_dbuf = NULL;
674 if (dsl_dataset_is_dirty(dmu_objset_ds(zv->zv_objset)) &&
675 !(zv->zv_flags & ZVOL_RDONLY))
676 txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0);
677 dmu_objset_evict_dbufs(zv->zv_objset);
679 dmu_objset_disown(zv->zv_objset, zvol_tag);
680 zv->zv_objset = NULL;
684 zvol_prealloc(zvol_state_t *zv)
686 objset_t *os = zv->zv_objset;
689 uint64_t resid = zv->zv_volsize;
694 if (avail < zv->zv_volsize)
698 zvol_free_extents(zv);
752 zvol_state_t *zv;
762 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL);
763 if (zv == NULL)
765 if (strncmp(namebuf, zv->zv_name, strlen(namebuf)) == 0)
766 (void) zvol_remove_zv(zv);
774 zvol_update_live_volsize(zvol_state_t *zv, uint64_t volsize)
788 old_volsize = zv->zv_volsize;
789 zvol_size_changed(zv, volsize);
791 if (zv->zv_flags & ZVOL_DUMPIFIED) {
792 if ((error = zvol_dumpify(zv)) != 0 ||
796 (void) zvol_update_volsize(zv->zv_objset, old_volsize);
797 zvol_size_changed(zv, old_volsize);
798 dumpify_error = zvol_dumpify(zv);
812 zv->zv_minor);
829 zvol_state_t *zv = NULL;
844 zv = zvol_minor_lookup(name);
846 if (zv == NULL || zv->zv_objset == NULL) {
853 if (zv != NULL)
854 zv->zv_objset = os;
856 os = zv->zv_objset;
865 if (error == 0 && zv != NULL)
866 error = zvol_update_live_volsize(zv, volsize);
870 if (zv != NULL)
871 zv->zv_objset = NULL;
881 zvol_state_t *zv;
886 zv = zfsdev_get_soft_state(getminor(*devp), ZSST_ZVOL);
887 if (zv == NULL) {
892 if (zv->zv_total_opens == 0)
893 err = zvol_first_open(zv);
898 if ((flag & FWRITE) && (zv->zv_flags & ZVOL_RDONLY)) {
902 if (zv->zv_flags & ZVOL_EXCL) {
907 if (zv->zv_total_opens != 0) {
911 zv->zv_flags |= ZVOL_EXCL;
914 if (zv->zv_open_count[otyp] == 0 || otyp == OTYP_LYR) {
915 zv->zv_open_count[otyp]++;
916 zv->zv_total_opens++;
922 if (zv->zv_total_opens == 0)
923 zvol_last_close(zv);
933 zvol_state_t *zv;
938 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL);
939 if (zv == NULL) {
944 if (zv->zv_flags & ZVOL_EXCL) {
945 ASSERT(zv->zv_total_opens == 1);
946 zv->zv_flags &= ~ZVOL_EXCL;
953 ASSERT(zv->zv_open_count[otyp] != 0);
954 ASSERT(zv->zv_total_opens != 0);
959 zv->zv_open_count[otyp]--;
960 zv->zv_total_opens--;
962 if (zv->zv_total_opens == 0)
963 zvol_last_close(zv);
989 zvol_state_t *zv = arg;
990 objset_t *os = zv->zv_objset;
1003 zgd->zgd_zilog = zv->zv_zilog;
1004 zgd->zgd_rl = zfs_range_lock(&zv->zv_znode, offset, size, RL_READER);
1017 size = zv->zv_volblocksize;
1056 zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx, offset_t off, ssize_t resid,
1059 uint32_t blocksize = zv->zv_volblocksize;
1060 zilog_t *zilog = zv->zv_zilog;
1098 if (write_state == WR_COPIED && dmu_read(zv->zv_objset,
1115 itx->itx_private = zv;
1179 zvol_dumpio(zvol_state_t *zv, void *addr, uint64_t offset, uint64_t size,
1185 spa_t *spa = dmu_objset_spa(zv->zv_objset);
1189 P2BOUNDARY(offset, size, zv->zv_volblocksize)) {
1192 ASSERT(size <= zv->zv_volblocksize);
1195 ze = list_head(&zv->zv_extents);
1196 while (offset >= ze->ze_nblks * zv->zv_volblocksize) {
1197 offset -= ze->ze_nblks * zv->zv_volblocksize;
1198 ze = list_next(&zv->zv_extents, ze);
1222 zvol_state_t *zv;
1249 zv = zs->zss_data;
1251 if (!(bp->b_flags & B_READ) && (zv->zv_flags & ZVOL_RDONLY)) {
1258 volsize = zv->zv_volsize;
1260 os = zv->zv_objset;
1273 is_dumpified = zv->zv_flags & ZVOL_DUMPIFIED;
1275 !(zv->zv_flags & ZVOL_WCE)) ||
1276 (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS)) &&
1283 rl = zfs_range_lock(&zv->zv_znode, off, resid,
1289 size = MIN(size, P2END(off, zv->zv_volblocksize) - off);
1290 error = zvol_dumpio(zv, addr, off, size,
1303 zvol_log_write(zv, tx, off, size, sync);
1323 zil_commit(zv->zv_zilog, ZVOL_OBJ);
1348 zvol_state_t *zv;
1354 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL);
1355 if (zv == NULL)
1358 if ((zv->zv_flags & ZVOL_DUMPIFIED) == 0)
1364 VERIFY3U(boff + resid, <=, zv->zv_volsize);
1367 size = MIN(resid, P2END(boff, zv->zv_volblocksize) - boff);
1368 error = zvol_dumpio(zv, addr, boff, size, B_FALSE, B_TRUE);
1384 zvol_state_t *zv;
1389 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL);
1390 if (zv == NULL)
1393 volsize = zv->zv_volsize;
1398 if (zv->zv_flags & ZVOL_DUMPIFIED) {
1404 rl = zfs_range_lock(&zv->zv_znode, uio->uio_loffset, uio->uio_resid,
1413 error = dmu_read_uio(zv->zv_objset, ZVOL_OBJ, uio, bytes);
1430 zvol_state_t *zv;
1436 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL);
1437 if (zv == NULL)
1440 volsize = zv->zv_volsize;
1445 if (zv->zv_flags & ZVOL_DUMPIFIED) {
1451 sync = !(zv->zv_flags & ZVOL_WCE) ||
1452 (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS);
1454 rl = zfs_range_lock(&zv->zv_znode, uio->uio_loffset, uio->uio_resid,
1459 dmu_tx_t *tx = dmu_tx_create(zv->zv_objset);
1470 error = dmu_write_uio_dbuf(zv->zv_dbuf, uio, bytes, tx);
1472 zvol_log_write(zv, tx, off, bytes, sync);
1480 zil_commit(zv->zv_zilog, ZVOL_OBJ);
1553 zvol_state_t *zv;
1555 zv = zfsdev_get_soft_state(minor, ZSST_ZVOL);
1556 if (zv == NULL)
1558 if (zv->zv_flags & ZVOL_DUMPIFIED)
1564 *blksize = zv->zv_volblocksize;
1566 *minor_hdl = zv;
1567 *objset_hdl = zv->zv_objset;
1568 *zil_hdl = zv->zv_zilog;
1569 *rl_hdl = &zv->zv_znode;
1570 *bonus_hdl = zv->zv_dbuf;
1581 zvol_state_t *zv = minor_hdl;
1583 return (zv->zv_volsize);
1593 zvol_state_t *zv = minor_hdl;
1595 return ((zv->zv_flags & ZVOL_WCE) ? 1 : 0);
1605 zvol_state_t *zv = minor_hdl;
1607 zvol_log_write(zv, tx, off, resid, sync);
1617 zvol_log_truncate(zvol_state_t *zv, dmu_tx_t *tx, uint64_t off, uint64_t len,
1622 zilog_t *zilog = zv->zv_zilog;
1645 zvol_state_t *zv;
1652 zv = zfsdev_get_soft_state(getminor(dev), ZSST_ZVOL);
1654 if (zv == NULL) {
1658 ASSERT(zv->zv_total_opens > 0);
1672 1 << (SPA_OLD_MAXBLOCKSHIFT - zv->zv_min_bs);
1684 dkm.dki_lbsize = 1U << zv->zv_min_bs;
1685 dkm.dki_capacity = zv->zv_volsize >> zv->zv_min_bs;
1698 dkmext.dki_lbsize = 1U << zv->zv_min_bs;
1699 dkmext.dki_pbsize = zv->zv_volblocksize;
1700 dkmext.dki_capacity = zv->zv_volsize >> zv->zv_min_bs;
1710 uint64_t vs = zv->zv_volsize;
1711 uint8_t bs = zv->zv_min_bs;
1721 zil_commit(zv->zv_zilog, ZVOL_OBJ);
1730 int wce = (zv->zv_flags & ZVOL_WCE) ? 1 : 0;
1745 zv->zv_flags |= ZVOL_WCE;
1748 zv->zv_flags &= ~ZVOL_WCE;
1750 zil_commit(zv->zv_zilog, ZVOL_OBJ);
1765 rl = zfs_range_lock(&zv->zv_znode, 0, zv->zv_volsize,
1767 error = zvol_dumpify(zv);
1772 if (!(zv->zv_flags & ZVOL_DUMPIFIED))
1774 rl = zfs_range_lock(&zv->zv_znode, 0, zv->zv_volsize,
1776 error = zvol_dump_fini(zv);
1798 if (df.df_start >= zv->zv_volsize)
1803 rl = zfs_range_lock(&zv->zv_znode, df.df_start, df.df_length,
1805 tx = dmu_tx_create(zv->zv_objset);
1811 zvol_log_truncate(zv, tx, df.df_start,
1814 error = dmu_free_long_range(zv->zv_objset, ZVOL_OBJ,
1829 (!(zv->zv_flags & ZVOL_WCE) ||
1830 (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS) ||
1832 zil_commit(zv->zv_zilog, ZVOL_OBJ);
1889 zvol_dump_init(zvol_state_t *zv, boolean_t resize)
1893 objset_t *os = zv->zv_objset;
1903 error = dmu_free_long_range(zv->zv_objset, ZVOL_OBJ, 0,
1908 txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0);
1931 error = dsl_prop_get_integer(zv->zv_name,
1934 error = dsl_prop_get_integer(zv->zv_name,
1939 error = dsl_prop_get_integer(zv->zv_name,
1944 error = dsl_prop_get_integer(zv->zv_name,
1949 error = dsl_prop_get_integer(zv->zv_name,
1974 &zv->zv_volsize, tx);
2004 zv->zv_volblocksize = SPA_OLD_MAXBLOCKSIZE;
2036 error = zfs_set_prop_nvlist(zv->zv_name, ZPROP_SRC_LOCAL,
2043 error = zvol_prealloc(zv);
2048 zvol_dumpify(zvol_state_t *zv)
2053 objset_t *os = zv->zv_objset;
2055 if (zv->zv_flags & ZVOL_RDONLY)
2058 if (zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ, ZVOL_DUMPSIZE,
2059 8, 1, &dumpsize) != 0 || dumpsize != zv->zv_volsize) {
2062 if ((error = zvol_dump_init(zv, resize)) != 0) {
2063 (void) zvol_dump_fini(zv);
2071 error = zvol_get_lbas(zv);
2073 (void) zvol_dump_fini(zv);
2082 (void) zvol_dump_fini(zv);
2086 zv->zv_flags |= ZVOL_DUMPIFIED;
2088 &zv->zv_volsize, tx);
2092 (void) zvol_dump_fini(zv);
2101 zvol_dump_fini(zvol_state_t *zv)
2104 objset_t *os = zv->zv_objset;
2108 uint64_t version = spa_version(dmu_objset_spa(zv->zv_objset));
2127 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ,
2129 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ,
2131 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ,
2133 (void) zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ,
2144 zap_lookup(zv->zv_objset, ZVOL_ZAP_OBJ,
2149 (void) zfs_set_prop_nvlist(zv->zv_name, ZPROP_SRC_LOCAL,
2153 zvol_free_extents(zv);
2154 zv->zv_flags &= ~ZVOL_DUMPIFIED;
2157 txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0);
2166 zv->zv_volblocksize = vbs;