Lines Matching defs:zv
50 * zvol_state_list. The zv->zv_state_lock is used to protect the contents
133 zvol_state_t *zv;
138 zv = hlist_entry(p, zvol_state_t, zv_hlink);
139 mutex_enter(&zv->zv_state_lock);
140 if (zv->zv_hash == hash && strcmp(zv->zv_name, name) == 0) {
146 !rw_tryenter(&zv->zv_suspend_lock, mode)) {
147 mutex_exit(&zv->zv_state_lock);
148 rw_enter(&zv->zv_suspend_lock, mode);
149 mutex_enter(&zv->zv_state_lock);
154 ASSERT(zv->zv_hash == hash &&
155 strcmp(zv->zv_name, name) == 0);
158 return (zv);
160 mutex_exit(&zv->zv_state_lock);
317 zvol_state_t *zv = zvol_find_by_name(name, RW_READER);
319 ASSERT(zv == NULL || (MUTEX_HELD(&zv->zv_state_lock) &&
320 RW_READ_HELD(&zv->zv_suspend_lock)));
322 if (zv == NULL || zv->zv_objset == NULL) {
323 if (zv != NULL)
324 rw_exit(&zv->zv_suspend_lock);
327 if (zv != NULL)
328 mutex_exit(&zv->zv_state_lock);
332 if (zv != NULL)
333 zv->zv_objset = os;
335 os = zv->zv_objset;
345 if (error == 0 && zv != NULL) {
346 zv->zv_volsize = volsize;
347 zv->zv_changed = 1;
354 if (zv != NULL)
355 zv->zv_objset = NULL;
357 rw_exit(&zv->zv_suspend_lock);
360 if (zv != NULL)
361 mutex_exit(&zv->zv_state_lock);
363 if (error == 0 && zv != NULL)
364 zvol_os_update_volsize(zv, volsize);
375 zvol_state_t *zv = zvol_find_by_name(name, RW_NONE);
376 if (zv == NULL)
378 zv->zv_threading = value;
379 mutex_exit(&zv->zv_state_lock);
389 zvol_state_t *zv = zvol_find_by_name(name, RW_NONE);
390 if (zv == NULL)
393 zvol_os_set_disk_ro(zv, 1);
394 zv->zv_flags |= ZVOL_RDONLY;
396 zvol_os_set_disk_ro(zv, 0);
397 zv->zv_flags &= ~ZVOL_RDONLY;
399 mutex_exit(&zv->zv_state_lock);
447 zvol_state_t *zv = arg1;
459 dmu_tx_t *tx = dmu_tx_create(zv->zv_objset);
465 (void) zil_replaying(zv->zv_zilog, tx);
467 error = dmu_free_long_range(zv->zv_objset, ZVOL_OBJ, offset,
481 zvol_state_t *zv = arg1;
483 objset_t *os = zv->zv_objset;
513 (void) zil_replaying(zv->zv_zilog, tx);
527 zvol_state_t *zv = arg1;
529 objset_t *os = zv->zv_objset;
554 error = dnode_hold(os, ZVOL_OBJ, zv, &zv->zv_dn);
555 if (error != 0 || !zv->zv_dn)
558 dmu_tx_hold_clone_by_dnode(tx, zv->zv_dn, off, len);
564 error = dmu_brt_clone(zv->zv_objset, ZVOL_OBJ, off, len,
575 VERIFY(zil_replaying(zv->zv_zilog, tx));
579 dnode_rele(zv->zv_dn, zv);
580 zv->zv_dn = NULL;
847 zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx, uint64_t offset,
850 uint32_t blocksize = zv->zv_volblocksize;
851 zilog_t *zilog = zv->zv_zilog;
882 if (wr_state == WR_COPIED && dmu_read_by_dnode(zv->zv_dn,
897 itx->itx_private = zv;
914 zvol_log_truncate(zvol_state_t *zv, dmu_tx_t *tx, uint64_t off, uint64_t len)
918 zilog_t *zilog = zv->zv_zilog;
952 zvol_state_t *zv = arg;
973 zgd->zgd_lr = zfs_rangelock_enter(&zv->zv_rangelock, offset,
975 error = dmu_read_by_dnode(zv->zv_dn, offset, size, buf,
985 size = zv->zv_volblocksize;
987 zgd->zgd_lr = zfs_rangelock_enter(&zv->zv_rangelock, offset,
989 error = dmu_buf_hold_noread_by_dnode(zv->zv_dn, offset, zgd,
1019 zvol_insert(zvol_state_t *zv)
1022 list_insert_head(&zvol_state_list, zv);
1023 hlist_add_head(&zv->zv_hlink, ZVOL_HT_HEAD(zv->zv_hash));
1030 zvol_remove(zvol_state_t *zv)
1033 list_remove(&zvol_state_list, zv);
1034 hlist_del(&zv->zv_hlink);
1038 * Setup zv after we just own the zv->objset
1041 zvol_setup_zv(zvol_state_t *zv)
1046 objset_t *os = zv->zv_objset;
1048 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
1049 ASSERT(RW_LOCK_HELD(&zv->zv_suspend_lock));
1051 zv->zv_zilog = NULL;
1052 zv->zv_flags &= ~ZVOL_WRITTEN_TO;
1054 error = dsl_prop_get_integer(zv->zv_name, "readonly", &ro, NULL);
1062 error = dnode_hold(os, ZVOL_OBJ, zv, &zv->zv_dn);
1066 zvol_os_set_capacity(zv, volsize >> 9);
1067 zv->zv_volsize = volsize;
1071 zvol_os_set_disk_ro(zv, 1);
1072 zv->zv_flags |= ZVOL_RDONLY;
1074 zvol_os_set_disk_ro(zv, 0);
1075 zv->zv_flags &= ~ZVOL_RDONLY;
1085 zvol_shutdown_zv(zvol_state_t *zv)
1087 ASSERT(MUTEX_HELD(&zv->zv_state_lock) &&
1088 RW_LOCK_HELD(&zv->zv_suspend_lock));
1090 if (zv->zv_flags & ZVOL_WRITTEN_TO) {
1091 ASSERT(zv->zv_zilog != NULL);
1092 zil_close(zv->zv_zilog);
1095 zv->zv_zilog = NULL;
1097 dnode_rele(zv->zv_dn, zv);
1098 zv->zv_dn = NULL;
1104 if (zv->zv_flags & ZVOL_WRITTEN_TO)
1105 txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0);
1106 (void) dmu_objset_evict_dbufs(zv->zv_objset);
1113 zvol_tag(zvol_state_t *zv)
1115 ASSERT(RW_WRITE_HELD(&zv->zv_suspend_lock));
1116 return (zv->zv_open_count > 0 ? zv : NULL);
1125 zvol_state_t *zv;
1127 zv = zvol_find_by_name(name, RW_WRITER);
1129 if (zv == NULL)
1133 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
1134 ASSERT(RW_WRITE_HELD(&zv->zv_suspend_lock));
1136 atomic_inc(&zv->zv_suspend_ref);
1138 if (zv->zv_open_count > 0)
1139 zvol_shutdown_zv(zv);
1145 mutex_exit(&zv->zv_state_lock);
1148 return (zv);
1152 zvol_resume(zvol_state_t *zv)
1156 ASSERT(RW_WRITE_HELD(&zv->zv_suspend_lock));
1158 mutex_enter(&zv->zv_state_lock);
1160 if (zv->zv_open_count > 0) {
1161 VERIFY0(dmu_objset_hold(zv->zv_name, zv, &zv->zv_objset));
1162 VERIFY3P(zv->zv_objset->os_dsl_dataset->ds_owner, ==, zv);
1163 VERIFY(dsl_dataset_long_held(zv->zv_objset->os_dsl_dataset));
1164 dmu_objset_rele(zv->zv_objset, zv);
1166 error = zvol_setup_zv(zv);
1169 mutex_exit(&zv->zv_state_lock);
1171 rw_exit(&zv->zv_suspend_lock);
1178 atomic_dec(&zv->zv_suspend_ref);
1180 if (zv->zv_flags & ZVOL_REMOVING)
1181 cv_broadcast(&zv->zv_removing_cv);
1187 zvol_first_open(zvol_state_t *zv, boolean_t readonly)
1192 ASSERT(RW_READ_HELD(&zv->zv_suspend_lock));
1193 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
1196 boolean_t ro = (readonly || (strchr(zv->zv_name, '@') != NULL));
1197 error = dmu_objset_own(zv->zv_name, DMU_OST_ZVOL, ro, B_TRUE, zv, &os);
1201 zv->zv_objset = os;
1203 error = zvol_setup_zv(zv);
1205 dmu_objset_disown(os, 1, zv);
1206 zv->zv_objset = NULL;
1213 zvol_last_close(zvol_state_t *zv)
1215 ASSERT(RW_READ_HELD(&zv->zv_suspend_lock));
1216 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
1218 if (zv->zv_flags & ZVOL_REMOVING)
1219 cv_broadcast(&zv->zv_removing_cv);
1221 zvol_shutdown_zv(zv);
1223 dmu_objset_disown(zv->zv_objset, 1, zv);
1224 zv->zv_objset = NULL;
1524 zvol_state_t *zv = (zvol_state_t *)arg;
1527 ASSERT(!MUTEX_HELD(&zv->zv_state_lock));
1529 mutex_enter(&zv->zv_state_lock);
1530 while (zv->zv_open_count > 0 || atomic_read(&zv->zv_suspend_ref)) {
1531 zv->zv_flags |= ZVOL_REMOVING;
1532 cv_wait(&zv->zv_removing_cv, &zv->zv_state_lock);
1534 mutex_exit(&zv->zv_state_lock);
1537 mutex_enter(&zv->zv_state_lock);
1539 zvol_remove(zv);
1540 zvol_os_clear_private(zv);
1542 mutex_exit(&zv->zv_state_lock);
1545 zvol_os_free(zv);
1557 zvol_state_t *zv, *zv_next;
1572 for (zv = list_head(&zvol_state_list); zv != NULL; zv = zv_next) {
1573 zv_next = list_next(&zvol_state_list, zv);
1575 mutex_enter(&zv->zv_state_lock);
1576 if (name == NULL || strcmp(zv->zv_name, name) == 0 ||
1577 (strncmp(zv->zv_name, name, namelen) == 0 &&
1578 (zv->zv_name[namelen] == '/' ||
1579 zv->zv_name[namelen] == '@'))) {
1582 * one is currently using this zv
1589 if (zv->zv_open_count > 0 ||
1590 atomic_read(&zv->zv_suspend_ref)) {
1591 zv->zv_flags |= ZVOL_REMOVING;
1593 zv->zv_objset->os_spa->spa_zvol_taskq,
1594 zvol_remove_minor_task, zv, TQ_SLEEP);
1601 list_insert_head(&delay_list, zv);
1603 mutex_exit(&zv->zv_state_lock);
1607 zvol_remove(zv);
1613 zvol_os_clear_private(zv);
1616 mutex_exit(&zv->zv_state_lock);
1619 t = taskq_dispatch(system_taskq, zvol_free_task, zv,
1622 list_insert_head(&free_list, zv);
1624 mutex_exit(&zv->zv_state_lock);
1630 while ((zv = list_remove_head(&delay_list)) != NULL)
1631 zvol_remove_minor_task(zv);
1634 while ((zv = list_remove_head(&free_list)) != NULL)
1635 zvol_os_free(zv);
1642 zvol_state_t *zv = NULL, *zv_next;
1649 for (zv = list_head(&zvol_state_list); zv != NULL; zv = zv_next) {
1650 zv_next = list_next(&zvol_state_list, zv);
1652 mutex_enter(&zv->zv_state_lock);
1653 if (strcmp(zv->zv_name, name) == 0)
1656 mutex_exit(&zv->zv_state_lock);
1659 if (zv == NULL) {
1664 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
1666 if (zv->zv_open_count > 0 || atomic_read(&zv->zv_suspend_ref)) {
1671 zv->zv_flags |= ZVOL_REMOVING;
1672 mutex_exit(&zv->zv_state_lock);
1674 zvol_remove_minor_task(zv);
1678 zvol_remove(zv);
1679 zvol_os_clear_private(zv);
1681 mutex_exit(&zv->zv_state_lock);
1684 zvol_os_free(zv);
1693 zvol_state_t *zv, *zv_next;
1703 for (zv = list_head(&zvol_state_list); zv != NULL; zv = zv_next) {
1704 zv_next = list_next(&zvol_state_list, zv);
1706 mutex_enter(&zv->zv_state_lock);
1708 if (strcmp(zv->zv_name, oldname) == 0) {
1709 zvol_os_rename_minor(zv, newname);
1710 } else if (strncmp(zv->zv_name, oldname, oldnamelen) == 0 &&
1711 (zv->zv_name[oldnamelen] == '/' ||
1712 zv->zv_name[oldnamelen] == '@')) {
1714 zv->zv_name[oldnamelen],
1715 zv->zv_name + oldnamelen + 1);
1716 zvol_os_rename_minor(zv, name);
1720 mutex_exit(&zv->zv_state_lock);
1768 zvol_state_t *zv;
1779 zv = zvol_find_by_name(name, RW_NONE);
1780 if (zv == NULL && volmode == ZFS_VOLMODE_NONE)
1782 if (zv != NULL) {
1783 old_volmode = zv->zv_volmode;
1784 mutex_exit(&zv->zv_state_lock);
1787 zvol_wait_close(zv);