changeset 11689:ac2c63b73009

6917482 zvol_dumpify() needs to ensure no writes are in flight before doing traverse 6851545 zvols do not give correct unit values to the DKIOCINFO ioctl
author Eric Taylor <Eric.Taylor@Sun.COM>
date Thu, 18 Feb 2010 10:41:35 -0700
parents ff764624fbc9
children 1c19a1778a4f
files usr/src/uts/common/fs/zfs/zvol.c
diffstat 1 files changed, 5 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/fs/zfs/zvol.c	Thu Feb 18 12:22:26 2010 -0500
+++ b/usr/src/uts/common/fs/zfs/zvol.c	Thu Feb 18 10:41:35 2010 -0700
@@ -300,6 +300,7 @@
 static int
 zvol_get_lbas(zvol_state_t *zv)
 {
+	objset_t *os = zv->zv_objset;
 	struct maparg	ma;
 	int		err;
 
@@ -307,7 +308,9 @@
 	ma.ma_blks = 0;
 	zvol_free_extents(zv);
 
-	err = traverse_dataset(dmu_objset_ds(zv->zv_objset), 0,
+	/* commit any in-flight changes before traversing the dataset */
+	txg_wait_synced(dmu_objset_pool(os), 0);
+	err = traverse_dataset(dmu_objset_ds(os), 0,
 	    TRAVERSE_PRE | TRAVERSE_PREFETCH_METADATA, zvol_map_block, &ma);
 	if (err || ma.ma_blks != (zv->zv_volsize / zv->zv_volblocksize)) {
 		zvol_free_extents(zv);
@@ -1465,6 +1468,7 @@
 		(void) strcpy(dki.dki_cname, "zvol");
 		(void) strcpy(dki.dki_dname, "zvol");
 		dki.dki_ctype = DKC_UNKNOWN;
+		dki.dki_unit = getminor(dev);
 		dki.dki_maxtransfer = 1 << (SPA_MAXBLOCKSHIFT - zv->zv_min_bs);
 		mutex_exit(&zvol_state_lock);
 		if (ddi_copyout(&dki, (void *)arg, sizeof (dki), flag))