Lines Matching defs:zv
164 static void zvol_ensure_zilog(zvol_state_t *zv);
207 static void zvol_geom_run(zvol_state_t *zv);
208 static void zvol_geom_destroy(zvol_state_t *zv);
222 zvol_state_t *zv;
243 * or the zv is protected from being freed because of the positive
246 zv = pp->private;
247 if (zv == NULL) {
253 mutex_enter(&zv->zv_state_lock);
254 if (zv->zv_zso->zso_dying || zv->zv_flags & ZVOL_REMOVING) {
259 ASSERT3S(zv->zv_volmode, ==, ZFS_VOLMODE_GEOM);
266 if (zv->zv_open_count == 0) {
268 if (!rw_tryenter(&zv->zv_suspend_lock, ZVOL_RW_READER)) {
269 mutex_exit(&zv->zv_state_lock);
270 rw_enter(&zv->zv_suspend_lock, ZVOL_RW_READER);
271 mutex_enter(&zv->zv_state_lock);
273 if (zv->zv_open_count != 0) {
274 rw_exit(&zv->zv_suspend_lock);
281 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
283 if (zv->zv_open_count == 0) {
286 ASSERT(ZVOL_RW_READ_HELD(&zv->zv_suspend_lock));
294 mutex_exit(&zv->zv_state_lock);
295 rw_exit(&zv->zv_suspend_lock);
303 err = zvol_first_open(zv, !(flag & FWRITE));
308 pp->mediasize = zv->zv_volsize;
310 pp->stripesize = zv->zv_volblocksize;
313 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
319 if ((flag & FWRITE) && ((zv->zv_flags & ZVOL_RDONLY) ||
320 dmu_objset_incompatible_encryption_version(zv->zv_objset))) {
324 if (zv->zv_flags & ZVOL_EXCL) {
329 if (zv->zv_open_count != 0) {
333 zv->zv_flags |= ZVOL_EXCL;
336 zv->zv_open_count += count;
338 if (zv->zv_open_count == 0) {
339 zvol_last_close(zv);
340 wakeup(zv);
343 mutex_exit(&zv->zv_state_lock);
346 rw_exit(&zv->zv_suspend_lock);
354 zvol_state_t *zv;
359 zv = pp->private;
360 if (zv == NULL) {
365 mutex_enter(&zv->zv_state_lock);
366 if (zv->zv_flags & ZVOL_EXCL) {
367 ASSERT3U(zv->zv_open_count, ==, 1);
368 zv->zv_flags &= ~ZVOL_EXCL;
371 ASSERT3S(zv->zv_volmode, ==, ZFS_VOLMODE_GEOM);
377 ASSERT3U(zv->zv_open_count, >, 0);
384 new_open_count = zv->zv_open_count - count;
386 if (!rw_tryenter(&zv->zv_suspend_lock, ZVOL_RW_READER)) {
387 mutex_exit(&zv->zv_state_lock);
388 rw_enter(&zv->zv_suspend_lock, ZVOL_RW_READER);
389 mutex_enter(&zv->zv_state_lock);
391 new_open_count = zv->zv_open_count - count;
393 rw_exit(&zv->zv_suspend_lock);
402 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
407 zv->zv_open_count = new_open_count;
408 if (zv->zv_open_count == 0) {
409 ASSERT(ZVOL_RW_READ_HELD(&zv->zv_suspend_lock));
410 zvol_last_close(zv);
411 wakeup(zv);
414 mutex_exit(&zv->zv_state_lock);
417 rw_exit(&zv->zv_suspend_lock);
422 zvol_geom_run(zvol_state_t *zv)
424 struct zvol_state_geom *zsg = &zv->zv_zso->zso_geom;
427 ASSERT3S(zv->zv_volmode, ==, ZFS_VOLMODE_GEOM);
431 kproc_kthread_add(zvol_geom_worker, zv, &system_proc, NULL, 0, 0,
436 zvol_geom_destroy(zvol_state_t *zv)
438 struct zvol_state_geom *zsg = &zv->zv_zso->zso_geom;
441 ASSERT3S(zv->zv_volmode, ==, ZFS_VOLMODE_GEOM);
445 mutex_enter(&zv->zv_state_lock);
447 mutex_exit(&zv->zv_state_lock);
453 zvol_wait_close(zvol_state_t *zv)
456 if (zv->zv_volmode != ZFS_VOLMODE_GEOM)
458 mutex_enter(&zv->zv_state_lock);
459 zv->zv_zso->zso_dying = B_TRUE;
461 if (zv->zv_open_count)
462 msleep(zv, &zv->zv_state_lock,
464 mutex_exit(&zv->zv_state_lock);
521 zvol_state_t *zv = arg;
522 struct zvol_state_geom *zsg = &zv->zv_zso->zso_geom;
525 ASSERT3S(zv->zv_volmode, ==, ZFS_VOLMODE_GEOM);
553 zvol_state_t *zv = bp->bio_to->private;
557 if (zv == NULL) {
568 zsg = &zv->zv_zso->zso_geom;
584 zvol_state_t *zv;
586 zv = bp->bio_to->private;
587 ASSERT3P(zv, !=, NULL);
589 spa_t *spa = dmu_objset_spa(zv->zv_objset);
595 dmu_objset_space(zv->zv_objset, &refd, &avail,
600 dmu_objset_space(zv->zv_objset, &refd, &avail,
621 zvol_state_t *zv;
624 zv = kn->kn_hook;
625 zsd = &zv->zv_zso->zso_dev;
641 zvol_state_t *zv;
644 zv = dev->si_drv2;
645 zsd = &zv->zv_zso->zso_dev;
655 kn->kn_hook = zv;
664 zvol_state_t *zv;
676 zv = bp->bio_to->private;
678 zv = bp->bio_dev->si_drv2;
680 if (zv == NULL) {
685 rw_enter(&zv->zv_suspend_lock, ZVOL_RW_READER);
687 if (zv->zv_flags & ZVOL_REMOVING) {
699 if (zv->zv_flags & ZVOL_RDONLY) {
703 zvol_ensure_zilog(zv);
713 volsize = zv->zv_volsize;
715 os = zv->zv_objset;
728 zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS;
734 lr = zfs_rangelock_enter(&zv->zv_rangelock, off, resid,
738 dmu_tx_t *tx = dmu_tx_create(zv->zv_objset);
743 zvol_log_truncate(zv, tx, off, resid);
745 error = dmu_free_long_range(zv->zv_objset, ZVOL_OBJ,
758 dmu_tx_hold_write_by_dnode(tx, zv->zv_dn, off, size);
764 zvol_log_write(zv, tx, off, size, commit);
789 dataset_kstats_update_read_kstats(&zv->zv_kstat,
793 dataset_kstats_update_write_kstats(&zv->zv_kstat,
804 zil_commit(zv->zv_zilog, ZVOL_OBJ);
807 rw_exit(&zv->zv_suspend_lock);
822 zvol_state_t *zv;
830 zv = dev->si_drv2;
832 volsize = zv->zv_volsize;
841 rw_enter(&zv->zv_suspend_lock, ZVOL_RW_READER);
843 lr = zfs_rangelock_enter(&zv->zv_rangelock, zfs_uio_offset(&uio),
852 error = dmu_read_uio_dnode(zv->zv_dn, &uio, bytes);
862 dataset_kstats_update_read_kstats(&zv->zv_kstat, nread);
863 rw_exit(&zv->zv_suspend_lock);
871 zvol_state_t *zv;
878 zv = dev->si_drv2;
880 volsize = zv->zv_volsize;
890 (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS);
892 rw_enter(&zv->zv_suspend_lock, ZVOL_RW_READER);
893 zvol_ensure_zilog(zv);
895 lr = zfs_rangelock_enter(&zv->zv_rangelock, zfs_uio_offset(&uio),
900 dmu_tx_t *tx = dmu_tx_create(zv->zv_objset);
905 dmu_tx_hold_write_by_dnode(tx, zv->zv_dn, off, bytes);
911 error = dmu_write_uio_dnode(zv->zv_dn, &uio, bytes, tx);
913 zvol_log_write(zv, tx, off, bytes, commit);
921 dataset_kstats_update_write_kstats(&zv->zv_kstat, nwritten);
923 zil_commit(zv->zv_zilog, ZVOL_OBJ);
924 rw_exit(&zv->zv_suspend_lock);
932 zvol_state_t *zv;
941 * or the zv is protected from being freed because of the positive
944 zv = dev->si_drv2;
945 if (zv == NULL) {
951 mutex_enter(&zv->zv_state_lock);
952 if (zv->zv_zso->zso_dying) {
957 ASSERT3S(zv->zv_volmode, ==, ZFS_VOLMODE_DEV);
964 if (zv->zv_open_count == 0) {
966 if (!rw_tryenter(&zv->zv_suspend_lock, ZVOL_RW_READER)) {
967 mutex_exit(&zv->zv_state_lock);
968 rw_enter(&zv->zv_suspend_lock, ZVOL_RW_READER);
969 mutex_enter(&zv->zv_state_lock);
971 if (zv->zv_open_count != 0) {
972 rw_exit(&zv->zv_suspend_lock);
979 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
981 if (zv->zv_open_count == 0) {
984 ASSERT(ZVOL_RW_READ_HELD(&zv->zv_suspend_lock));
992 mutex_exit(&zv->zv_state_lock);
993 rw_exit(&zv->zv_suspend_lock);
1001 err = zvol_first_open(zv, !(flags & FWRITE));
1008 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
1010 if ((flags & FWRITE) && (zv->zv_flags & ZVOL_RDONLY)) {
1014 if (zv->zv_flags & ZVOL_EXCL) {
1019 if (zv->zv_open_count != 0) {
1023 zv->zv_flags |= ZVOL_EXCL;
1026 zv->zv_open_count++;
1028 if (zv->zv_open_count == 0) {
1029 zvol_last_close(zv);
1030 wakeup(zv);
1033 mutex_exit(&zv->zv_state_lock);
1036 rw_exit(&zv->zv_suspend_lock);
1043 zvol_state_t *zv;
1047 zv = dev->si_drv2;
1048 if (zv == NULL) {
1053 mutex_enter(&zv->zv_state_lock);
1054 if (zv->zv_flags & ZVOL_EXCL) {
1055 ASSERT3U(zv->zv_open_count, ==, 1);
1056 zv->zv_flags &= ~ZVOL_EXCL;
1059 ASSERT3S(zv->zv_volmode, ==, ZFS_VOLMODE_DEV);
1065 ASSERT3U(zv->zv_open_count, >, 0);
1071 if (zv->zv_open_count == 1) {
1072 if (!rw_tryenter(&zv->zv_suspend_lock, ZVOL_RW_READER)) {
1073 mutex_exit(&zv->zv_state_lock);
1074 rw_enter(&zv->zv_suspend_lock, ZVOL_RW_READER);
1075 mutex_enter(&zv->zv_state_lock);
1077 if (zv->zv_open_count != 1) {
1078 rw_exit(&zv->zv_suspend_lock);
1087 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
1092 zv->zv_open_count--;
1094 if (zv->zv_open_count == 0) {
1095 ASSERT(ZVOL_RW_READ_HELD(&zv->zv_suspend_lock));
1096 zvol_last_close(zv);
1097 wakeup(zv);
1100 mutex_exit(&zv->zv_state_lock);
1103 rw_exit(&zv->zv_suspend_lock);
1111 zvol_state_t *zv;
1117 zv = dev->si_drv2;
1120 KASSERT(zv->zv_open_count > 0,
1128 *(off_t *)data = zv->zv_volsize;
1131 rw_enter(&zv->zv_suspend_lock, ZVOL_RW_READER);
1132 if (zv->zv_zilog != NULL)
1133 zil_commit(zv->zv_zilog, ZVOL_OBJ);
1134 rw_exit(&zv->zv_suspend_lock);
1143 offset < 0 || offset >= zv->zv_volsize ||
1150 rw_enter(&zv->zv_suspend_lock, ZVOL_RW_READER);
1151 zvol_ensure_zilog(zv);
1152 lr = zfs_rangelock_enter(&zv->zv_rangelock, offset, length,
1154 dmu_tx_t *tx = dmu_tx_create(zv->zv_objset);
1160 sync = (zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS);
1161 zvol_log_truncate(zv, tx, offset, length);
1163 error = dmu_free_long_range(zv->zv_objset, ZVOL_OBJ,
1168 zil_commit(zv->zv_zilog, ZVOL_OBJ);
1169 rw_exit(&zv->zv_suspend_lock);
1172 *(off_t *)data = zv->zv_volblocksize;
1178 spa_t *spa = dmu_objset_spa(zv->zv_objset);
1185 dmu_objset_space(zv->zv_objset, &refd, &avail,
1189 dmu_objset_space(zv->zv_objset, &refd, &avail,
1212 lr = zfs_rangelock_enter(&zv->zv_rangelock, 0, UINT64_MAX,
1214 error = dmu_offset_next(zv->zv_objset, ZVOL_OBJ, hole, &noff);
1231 zvol_ensure_zilog(zvol_state_t *zv)
1233 ASSERT(ZVOL_RW_READ_HELD(&zv->zv_suspend_lock));
1237 * zvol. We protect zv->zv_zilog with zv_suspend_lock rather
1241 if (zv->zv_zilog == NULL) {
1242 if (!rw_tryupgrade(&zv->zv_suspend_lock)) {
1243 rw_exit(&zv->zv_suspend_lock);
1244 rw_enter(&zv->zv_suspend_lock, RW_WRITER);
1246 if (zv->zv_zilog == NULL) {
1247 zv->zv_zilog = zil_open(zv->zv_objset,
1248 zvol_get_data, &zv->zv_kstat.dk_zil_sums);
1249 zv->zv_flags |= ZVOL_WRITTEN_TO;
1251 VERIFY0(zv->zv_zilog->zl_header->zh_flags &
1254 rw_downgrade(&zv->zv_suspend_lock);
1265 zvol_os_rename_minor(zvol_state_t *zv, const char *newname)
1268 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
1271 zv->zv_hash = zvol_name_hash(newname);
1272 hlist_del(&zv->zv_hlink);
1273 hlist_add_head(&zv->zv_hlink, ZVOL_HT_HEAD(zv->zv_hash));
1275 if (zv->zv_volmode == ZFS_VOLMODE_GEOM) {
1276 struct zvol_state_geom *zsg = &zv->zv_zso->zso_geom;
1290 pp->mediasize = zv->zv_volsize;
1291 pp->private = zv;
1295 } else if (zv->zv_volmode == ZFS_VOLMODE_DEV) {
1296 struct zvol_state_dev *zsd = &zv->zv_zso->zso_dev;
1304 if (zv->zv_open_count > 0) {
1305 zv->zv_flags &= ~ZVOL_EXCL;
1306 zv->zv_open_count = 0;
1308 zvol_last_close(zv);
1319 args.mda_si_drv2 = zv;
1326 strlcpy(zv->zv_name, newname, sizeof (zv->zv_name));
1327 dataset_kstats_rename(&zv->zv_kstat, newname);
1334 zvol_os_free(zvol_state_t *zv)
1336 ASSERT(!RW_LOCK_HELD(&zv->zv_suspend_lock));
1337 ASSERT(!MUTEX_HELD(&zv->zv_state_lock));
1338 ASSERT0(zv->zv_open_count);
1340 ZFS_LOG(1, "ZVOL %s destroyed.", zv->zv_name);
1342 rw_destroy(&zv->zv_suspend_lock);
1343 zfs_rangelock_fini(&zv->zv_rangelock);
1345 if (zv->zv_volmode == ZFS_VOLMODE_GEOM) {
1346 struct zvol_state_geom *zsg = &zv->zv_zso->zso_geom;
1352 zvol_geom_destroy(zv);
1355 } else if (zv->zv_volmode == ZFS_VOLMODE_DEV) {
1356 struct zvol_state_dev *zsd = &zv->zv_zso->zso_dev;
1367 mutex_destroy(&zv->zv_state_lock);
1368 cv_destroy(&zv->zv_removing_cv);
1369 dataset_kstats_destroy(&zv->zv_kstat);
1370 kmem_free(zv->zv_zso, sizeof (struct zvol_state_os));
1371 kmem_free(zv, sizeof (zvol_state_t));
1381 zvol_state_t *zv;
1391 if ((zv = zvol_find_by_name_hash(name, hash, RW_NONE)) != NULL) {
1392 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
1393 mutex_exit(&zv->zv_state_lock);
1423 zv = kmem_zalloc(sizeof (*zv), KM_SLEEP);
1424 zv->zv_hash = hash;
1425 mutex_init(&zv->zv_state_lock, NULL, MUTEX_DEFAULT, NULL);
1426 cv_init(&zv->zv_removing_cv, NULL, CV_DEFAULT, NULL);
1427 zv->zv_zso = kmem_zalloc(sizeof (struct zvol_state_os), KM_SLEEP);
1428 zv->zv_volmode = volmode;
1429 if (zv->zv_volmode == ZFS_VOLMODE_GEOM) {
1430 struct zvol_state_geom *zsg = &zv->zv_zso->zso_geom;
1445 pp->private = zv;
1449 } else if (zv->zv_volmode == ZFS_VOLMODE_DEV) {
1450 struct zvol_state_dev *zsd = &zv->zv_zso->zso_dev;
1461 args.mda_si_drv2 = zv;
1467 &zv->zv_state_lock);
1470 (void) strlcpy(zv->zv_name, name, MAXPATHLEN);
1471 rw_init(&zv->zv_suspend_lock, NULL, RW_DEFAULT, NULL);
1472 zfs_rangelock_init(&zv->zv_rangelock, NULL, NULL);
1475 zv->zv_flags |= ZVOL_RDONLY;
1477 zv->zv_volblocksize = doi->doi_data_block_size;
1478 zv->zv_volsize = volsize;
1479 zv->zv_objset = os;
1481 ASSERT3P(zv->zv_kstat.dk_kstats, ==, NULL);
1482 error = dataset_kstats_create(&zv->zv_kstat, zv->zv_objset);
1485 ASSERT3P(zv->zv_zilog, ==, NULL);
1486 zv->zv_zilog = zil_open(os, zvol_get_data, &zv->zv_kstat.dk_zil_sums);
1489 replayed_zil = zil_destroy(zv->zv_zilog, B_FALSE);
1491 replayed_zil = zil_replay(os, zv, zvol_replay_vector);
1494 zil_close(zv->zv_zilog);
1495 zv->zv_zilog = NULL;
1499 zv->zv_objset = NULL;
1504 zvol_geom_run(zv);
1511 zvol_insert(zv);
1521 zvol_os_clear_private(zvol_state_t *zv)
1524 if (zv->zv_volmode == ZFS_VOLMODE_GEOM) {
1525 struct zvol_state_geom *zsg = &zv->zv_zso->zso_geom;
1539 ASSERT(!RW_LOCK_HELD(&zv->zv_suspend_lock));
1540 } else if (zv->zv_volmode == ZFS_VOLMODE_DEV) {
1541 struct zvol_state_dev *zsd = &zv->zv_zso->zso_dev;
1550 zvol_os_update_volsize(zvol_state_t *zv, uint64_t volsize)
1552 zv->zv_volsize = volsize;
1553 if (zv->zv_volmode == ZFS_VOLMODE_GEOM) {
1554 struct zvol_state_geom *zsg = &zv->zv_zso->zso_geom;
1570 pp->mediasize = zv->zv_volsize;
1572 g_resize_provider(pp, zv->zv_volsize);
1575 } else if (zv->zv_volmode == ZFS_VOLMODE_DEV) {
1576 struct zvol_state_dev *zsd = &zv->zv_zso->zso_dev;
1584 zvol_os_set_disk_ro(zvol_state_t *zv, int flags)
1586 // XXX? set_disk_ro(zv->zv_zso->zvo_disk, flags);
1590 zvol_os_set_capacity(zvol_state_t *zv, uint64_t capacity)
1592 // XXX? set_capacity(zv->zv_zso->zvo_disk, capacity);