Lines Matching defs:zv
49 static void zvol_request_impl(zvol_state_t *zv, struct bio *bio,
127 zvol_state_t *zv;
166 zvol_state_t *zv = rq->q->queuedata;
177 zvol_request_impl(zv, NULL, rq, 0);
188 static int zvol_blk_mq_alloc_tag_set(zvol_state_t *zv)
190 struct zvol_state_os *zso = zv->zv_zso;
206 zso->tag_set.driver_data = zv;
235 zvol_state_t *zv = zvr->zv;
241 ASSERT3P(zv, !=, NULL);
242 ASSERT3U(zv->zv_open_count, >, 0);
243 ASSERT3P(zv->zv_zilog, !=, NULL);
245 q = zv->zv_zso->zvo_queue;
246 disk = zv->zv_zso->zvo_disk;
250 zil_commit(zv->zv_zilog, ZVOL_OBJ);
254 rw_exit(&zv->zv_suspend_lock);
276 io_is_fua(bio, rq) || zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS;
278 zfs_locked_range_t *lr = zfs_rangelock_enter(&zv->zv_rangelock,
281 uint64_t volsize = zv->zv_volsize;
285 dmu_tx_t *tx = dmu_tx_create(zv->zv_objset);
290 dmu_tx_hold_write_by_dnode(tx, zv->zv_dn, off, bytes);
298 error = dmu_write_uio_dnode(zv->zv_dn, &uio, bytes, tx);
300 zvol_log_write(zv, tx, off, bytes, sync);
310 dataset_kstats_update_write_kstats(&zv->zv_kstat, nwritten);
314 zil_commit(zv->zv_zilog, ZVOL_OBJ);
316 rw_exit(&zv->zv_suspend_lock);
338 zvol_state_t *zv = zvr->zv;
345 struct request_queue *q = zv->zv_zso->zvo_queue;
346 struct gendisk *disk = zv->zv_zso->zvo_disk;
350 ASSERT3P(zv, !=, NULL);
351 ASSERT3U(zv->zv_open_count, >, 0);
352 ASSERT3P(zv->zv_zilog, !=, NULL);
362 sync = io_is_fua(bio, rq) || zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS;
364 if (end > zv->zv_volsize) {
376 start = P2ROUNDUP(start, zv->zv_volblocksize);
377 end = P2ALIGN_TYPED(end, zv->zv_volblocksize, uint64_t);
384 zfs_locked_range_t *lr = zfs_rangelock_enter(&zv->zv_rangelock,
387 tx = dmu_tx_create(zv->zv_objset);
393 zvol_log_truncate(zv, tx, start, size);
395 error = dmu_free_long_range(zv->zv_objset,
401 zil_commit(zv->zv_zilog, ZVOL_OBJ);
404 rw_exit(&zv->zv_suspend_lock);
430 zvol_state_t *zv = zvr->zv;
435 ASSERT3P(zv, !=, NULL);
436 ASSERT3U(zv->zv_open_count, >, 0);
440 q = zv->zv_zso->zvo_queue;
441 disk = zv->zv_zso->zvo_disk;
456 zfs_locked_range_t *lr = zfs_rangelock_enter(&zv->zv_rangelock,
459 uint64_t volsize = zv->zv_volsize;
468 error = dmu_read_uio_dnode(zv->zv_dn, &uio, bytes);
479 dataset_kstats_update_read_kstats(&zv->zv_kstat, nread);
482 rw_exit(&zv->zv_suspend_lock);
510 zvol_request_impl(zvol_state_t *zv, struct bio *bio, struct request *rq,
518 if (unlikely(zv->zv_flags & ZVOL_REMOVING)) {
523 if (zvol_request_sync || zv->zv_threading == B_FALSE)
527 .zv = zv,
532 if (io_has_data(bio, rq) && offset + size > zv->zv_volsize) {
534 zv->zv_zso->zvo_disk->disk_name,
554 taskq_hash = cityhash3((uintptr_t)zv, offset >> ZVOL_TASKQ_OFFSET_SHIFT,
559 if (unlikely(zv->zv_flags & ZVOL_RDONLY)) {
569 rw_enter(&zv->zv_suspend_lock, RW_READER);
573 * zvol. We protect zv->zv_zilog with zv_suspend_lock rather
577 if (zv->zv_zilog == NULL) {
578 rw_exit(&zv->zv_suspend_lock);
579 rw_enter(&zv->zv_suspend_lock, RW_WRITER);
580 if (zv->zv_zilog == NULL) {
581 zv->zv_zilog = zil_open(zv->zv_objset,
582 zvol_get_data, &zv->zv_kstat.dk_zil_sums);
583 zv->zv_flags |= ZVOL_WRITTEN_TO;
585 VERIFY0((zv->zv_zilog->zl_header->zh_flags &
588 rw_downgrade(&zv->zv_suspend_lock);
649 rw_enter(&zv->zv_suspend_lock, RW_READER);
685 zvol_state_t *zv = q->queuedata;
687 zvol_request_impl(zv, bio, NULL, 0);
702 zvol_state_t *zv;
716 * is not called on this zv because of the positive zv_open_count.
719 zv = disk->private_data;
721 zv = bdev->bd_disk->private_data;
723 if (zv == NULL) {
728 mutex_enter(&zv->zv_state_lock);
730 if (unlikely(zv->zv_flags & ZVOL_REMOVING)) {
731 mutex_exit(&zv->zv_state_lock);
741 if (zv->zv_open_count == 0) {
742 if (!rw_tryenter(&zv->zv_suspend_lock, RW_READER)) {
743 mutex_exit(&zv->zv_state_lock);
744 rw_enter(&zv->zv_suspend_lock, RW_READER);
745 mutex_enter(&zv->zv_state_lock);
747 if (zv->zv_open_count != 0) {
748 rw_exit(&zv->zv_suspend_lock);
758 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
760 if (zv->zv_open_count == 0) {
763 ASSERT(RW_READ_HELD(&zv->zv_suspend_lock));
791 mutex_exit(&zv->zv_state_lock);
792 rw_exit(&zv->zv_suspend_lock);
811 error = -zvol_first_open(zv, !(blk_mode_is_open_write(flag)));
819 (zv->zv_flags & ZVOL_RDONLY)) {
820 if (zv->zv_open_count == 0)
821 zvol_last_close(zv);
825 zv->zv_open_count++;
829 mutex_exit(&zv->zv_state_lock);
831 rw_exit(&zv->zv_suspend_lock);
853 zvol_state_t *zv;
857 zv = disk->private_data;
859 mutex_enter(&zv->zv_state_lock);
860 ASSERT3U(zv->zv_open_count, >, 0);
866 if (zv->zv_open_count == 1) {
867 if (!rw_tryenter(&zv->zv_suspend_lock, RW_READER)) {
868 mutex_exit(&zv->zv_state_lock);
869 rw_enter(&zv->zv_suspend_lock, RW_READER);
870 mutex_enter(&zv->zv_state_lock);
872 if (zv->zv_open_count != 1) {
873 rw_exit(&zv->zv_suspend_lock);
882 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
884 zv->zv_open_count--;
885 if (zv->zv_open_count == 0) {
886 ASSERT(RW_READ_HELD(&zv->zv_suspend_lock));
887 zvol_last_close(zv);
890 mutex_exit(&zv->zv_state_lock);
893 rw_exit(&zv->zv_suspend_lock);
900 zvol_state_t *zv = bdev->bd_disk->private_data;
903 ASSERT3U(zv->zv_open_count, >, 0);
915 rw_enter(&zv->zv_suspend_lock, RW_READER);
917 if (!(zv->zv_flags & ZVOL_RDONLY))
918 txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0);
920 rw_exit(&zv->zv_suspend_lock);
924 mutex_enter(&zv->zv_state_lock);
925 error = copy_to_user((void *)arg, zv->zv_name, MAXNAMELEN);
926 mutex_exit(&zv->zv_state_lock);
955 zvol_state_t *zv = disk->private_data;
956 if (zv != NULL) {
957 mutex_enter(&zv->zv_state_lock);
958 mask = zv->zv_changed ? DISK_EVENT_MEDIA_CHANGE : 0;
959 zv->zv_changed = 0;
960 mutex_exit(&zv->zv_state_lock);
973 zvol_state_t *zv = disk->private_data;
974 if (zv != NULL) {
975 mutex_enter(&zv->zv_state_lock);
976 set_capacity(zv->zv_zso->zvo_disk,
977 zv->zv_volsize >> SECTOR_BITS);
978 mutex_exit(&zv->zv_state_lock);
987 zvol_os_update_volsize(zvol_state_t *zv, uint64_t volsize)
989 struct gendisk *disk = zv->zv_zso->zvo_disk;
1002 zvol_os_clear_private(zvol_state_t *zv)
1008 zv->zv_zso->zvo_disk->private_data = NULL;
1020 zvol_state_t *zv = bdev->bd_disk->private_data;
1023 ASSERT3U(zv->zv_open_count, >, 0);
1025 sectors = get_capacity(zv->zv_zso->zvo_disk);
1117 zvol_queue_limits_init(zvol_queue_limits_t *limits, zvol_state_t *zv,
1165 (zv->zv_volblocksize * chunks) / PAGE_SIZE;
1181 limits->zql_physical_block_size = zv->zv_volblocksize;
1183 (zvol_max_discard_blocks * zv->zv_volblocksize) >> 9;
1184 limits->zql_discard_granularity = zv->zv_volblocksize;
1285 zvol_alloc_blk_mq(zvol_state_t *zv, zvol_queue_limits_t *limits)
1287 struct zvol_state_os *zso = zv->zv_zso;
1290 if (zvol_blk_mq_alloc_tag_set(zv) != 0)
1294 zso->zvo_disk = blk_mq_alloc_disk(&zso->tag_set, zv);
1304 struct gendisk *disk = blk_mq_alloc_disk(&zso->tag_set, &qlimits, zv);
1344 zvol_state_t *zv;
1358 zv = kmem_zalloc(sizeof (zvol_state_t), KM_SLEEP);
1360 zv->zv_zso = zso;
1361 zv->zv_volmode = volmode;
1362 zv->zv_volblocksize = volblocksize;
1364 list_link_init(&zv->zv_next);
1365 mutex_init(&zv->zv_state_lock, NULL, MUTEX_DEFAULT, NULL);
1366 cv_init(&zv->zv_removing_cv, NULL, CV_DEFAULT, NULL);
1368 zv->zv_zso->use_blk_mq = zvol_use_blk_mq;
1371 zvol_queue_limits_init(&limits, zv, zv->zv_zso->use_blk_mq);
1388 if (zv->zv_zso->use_blk_mq) {
1389 ret = zvol_alloc_blk_mq(zv, &limits);
1401 if (!zv->zv_zso->use_blk_mq) {
1406 zso->zvo_queue->queuedata = zv;
1408 zv->zv_open_count = 0;
1409 strlcpy(zv->zv_name, name, sizeof (zv->zv_name));
1411 zfs_rangelock_init(&zv->zv_rangelock, NULL, NULL);
1412 rw_init(&zv->zv_suspend_lock, NULL, RW_DEFAULT, NULL);
1429 zso->zvo_disk->private_data = zv;
1433 return (zv);
1437 kmem_free(zv, sizeof (zvol_state_t));
1453 zvol_os_free(zvol_state_t *zv)
1456 ASSERT(!RW_LOCK_HELD(&zv->zv_suspend_lock));
1457 ASSERT(!MUTEX_HELD(&zv->zv_state_lock));
1458 ASSERT0(zv->zv_open_count);
1459 ASSERT3P(zv->zv_zso->zvo_disk->private_data, ==, NULL);
1461 rw_destroy(&zv->zv_suspend_lock);
1462 zfs_rangelock_fini(&zv->zv_rangelock);
1464 del_gendisk(zv->zv_zso->zvo_disk);
1468 blk_cleanup_disk(zv->zv_zso->zvo_disk);
1470 put_disk(zv->zv_zso->zvo_disk);
1473 blk_cleanup_queue(zv->zv_zso->zvo_queue);
1474 put_disk(zv->zv_zso->zvo_disk);
1477 if (zv->zv_zso->use_blk_mq)
1478 blk_mq_free_tag_set(&zv->zv_zso->tag_set);
1481 MINOR(zv->zv_zso->zvo_dev) >> ZVOL_MINOR_BITS);
1483 cv_destroy(&zv->zv_removing_cv);
1484 mutex_destroy(&zv->zv_state_lock);
1485 dataset_kstats_destroy(&zv->zv_kstat);
1487 kmem_free(zv->zv_zso, sizeof (struct zvol_state_os));
1488 kmem_free(zv, sizeof (zvol_state_t));
1492 zvol_wait_close(zvol_state_t *zv)
1599 zvol_state_t *zv;
1626 zv = zvol_find_by_name_hash(name, hash, RW_NONE);
1627 if (zv) {
1628 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
1629 mutex_exit(&zv->zv_state_lock);
1648 zv = zvol_alloc(MKDEV(zvol_major, minor), name,
1650 if (zv == NULL) {
1654 zv->zv_hash = hash;
1657 zv->zv_flags |= ZVOL_RDONLY;
1659 zv->zv_volsize = volsize;
1660 zv->zv_objset = os;
1663 zv->zv_threading = B_TRUE;
1666 zv->zv_threading = volthreading;
1668 set_capacity(zv->zv_zso->zvo_disk, zv->zv_volsize >> 9);
1671 blk_queue_flag_set(QUEUE_FLAG_DISCARD, zv->zv_zso->zvo_queue);
1674 blk_queue_flag_set(QUEUE_FLAG_NONROT, zv->zv_zso->zvo_queue);
1677 blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, zv->zv_zso->zvo_queue);
1681 blk_queue_flag_set(QUEUE_FLAG_SCSI_PASSTHROUGH, zv->zv_zso->zvo_queue);
1684 ASSERT3P(zv->zv_kstat.dk_kstats, ==, NULL);
1685 error = dataset_kstats_create(&zv->zv_kstat, zv->zv_objset);
1688 ASSERT3P(zv->zv_zilog, ==, NULL);
1689 zv->zv_zilog = zil_open(os, zvol_get_data, &zv->zv_kstat.dk_zil_sums);
1692 replayed_zil = zil_destroy(zv->zv_zilog, B_FALSE);
1694 replayed_zil = zil_replay(os, zv, zvol_replay_vector);
1697 zil_close(zv->zv_zilog);
1698 zv->zv_zilog = NULL;
1713 zv->zv_objset = NULL;
1728 zvol_insert(zv);
1730 error = zvol_os_add_disk(zv->zv_zso->zvo_disk);
1739 zvol_os_rename_minor(zvol_state_t *zv, const char *newname)
1741 int readonly = get_disk_ro(zv->zv_zso->zvo_disk);
1744 ASSERT(MUTEX_HELD(&zv->zv_state_lock));
1746 strlcpy(zv->zv_name, newname, sizeof (zv->zv_name));
1749 zv->zv_hash = zvol_name_hash(newname);
1750 hlist_del(&zv->zv_hlink);
1751 hlist_add_head(&zv->zv_hlink, ZVOL_HT_HEAD(zv->zv_hash));
1757 * ZVOL_RDONLY in zv->zv_flags so the actual read-only state never
1761 set_disk_ro(zv->zv_zso->zvo_disk, !readonly);
1762 set_disk_ro(zv->zv_zso->zvo_disk, readonly);
1764 dataset_kstats_rename(&zv->zv_kstat, newname);
1768 zvol_os_set_disk_ro(zvol_state_t *zv, int flags)
1771 set_disk_ro(zv->zv_zso->zvo_disk, flags);
1775 zvol_os_set_capacity(zvol_state_t *zv, uint64_t capacity)
1778 set_capacity(zv->zv_zso->zvo_disk, capacity);