summaryrefslogtreecommitdiffstats
path: root/module/zfs
diff options
context:
space:
mode:
Diffstat (limited to 'module/zfs')
-rw-r--r--module/zfs/zvol.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c
index abe77ecd4..420282c4a 100644
--- a/module/zfs/zvol.c
+++ b/module/zfs/zvol.c
@@ -1215,20 +1215,29 @@ zvol_ioctl(struct block_device *bdev, fmode_t mode,
ASSERT(zv && zv->zv_open_count > 0);
- rw_enter(&zv->zv_suspend_lock, RW_READER);
switch (cmd) {
case BLKFLSBUF:
- zil_commit(zv->zv_zilog, ZVOL_OBJ);
+ fsync_bdev(bdev);
+ invalidate_bdev(bdev);
+ rw_enter(&zv->zv_suspend_lock, RW_READER);
+
+ if (dsl_dataset_is_dirty(dmu_objset_ds(zv->zv_objset)) &&
+ !(zv->zv_flags & ZVOL_RDONLY))
+ txg_wait_synced(dmu_objset_pool(zv->zv_objset), 0);
+
+ rw_exit(&zv->zv_suspend_lock);
break;
+
case BLKZNAME:
+ mutex_enter(&zvol_state_lock);
error = copy_to_user((void *)arg, zv->zv_name, MAXNAMELEN);
+ mutex_exit(&zvol_state_lock);
break;
default:
error = -ENOTTY;
break;
}
- rw_exit(&zv->zv_suspend_lock);
return (SET_ERROR(error));
}