From 5aaeed5c617553c4cec6328c1f4c19079a5a495a Mon Sep 17 00:00:00 2001 From: Sanjeev Bagewadi Date: Tue, 29 Jun 2010 15:11:58 +0530 Subject: [PATCH] 6937998 txg_wait_synced() is called when unmounting zfs snapshots --- usr/src/uts/common/fs/zfs/dmu_objset.c | 9 +++++++++ usr/src/uts/common/fs/zfs/sys/dmu_objset.h | 1 + usr/src/uts/common/fs/zfs/zfs_vfsops.c | 5 ++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/usr/src/uts/common/fs/zfs/dmu_objset.c b/usr/src/uts/common/fs/zfs/dmu_objset.c index 5554bda8f9b0..f5ef5d9d01c8 100644 --- a/usr/src/uts/common/fs/zfs/dmu_objset.c +++ b/usr/src/uts/common/fs/zfs/dmu_objset.c @@ -1116,6 +1116,15 @@ dmu_objset_is_dirty(objset_t *os, uint64_t txg) !list_is_empty(&os->os_free_dnodes[txg & TXG_MASK])); } +boolean_t +dmu_objset_is_dirty_anywhere(objset_t *os) +{ + for (int t = 0; t < TXG_SIZE; t++) + if (dmu_objset_is_dirty(os, t)) + return (B_TRUE); + return (B_FALSE); +} + static objset_used_cb_t *used_cbs[DMU_OST_NUMTYPES]; void diff --git a/usr/src/uts/common/fs/zfs/sys/dmu_objset.h b/usr/src/uts/common/fs/zfs/sys/dmu_objset.h index 12d5c4ddd497..e516c41115a5 100644 --- a/usr/src/uts/common/fs/zfs/sys/dmu_objset.h +++ b/usr/src/uts/common/fs/zfs/sys/dmu_objset.h @@ -161,6 +161,7 @@ timestruc_t dmu_objset_snap_cmtime(objset_t *os); /* called from dsl */ void dmu_objset_sync(objset_t *os, zio_t *zio, dmu_tx_t *tx); boolean_t dmu_objset_is_dirty(objset_t *os, uint64_t txg); +boolean_t dmu_objset_is_dirty_anywhere(objset_t *os); objset_t *dmu_objset_create_impl(spa_t *spa, struct dsl_dataset *ds, blkptr_t *bp, dmu_objset_type_t type, dmu_tx_t *tx); int dmu_objset_open_impl(spa_t *spa, struct dsl_dataset *ds, blkptr_t *bp, diff --git a/usr/src/uts/common/fs/zfs/zfs_vfsops.c b/usr/src/uts/common/fs/zfs/zfs_vfsops.c index 1731889f83b9..46aa3260e758 100644 --- a/usr/src/uts/common/fs/zfs/zfs_vfsops.c +++ b/usr/src/uts/common/fs/zfs/zfs_vfsops.c @@ -1812,10 +1812,9 @@ zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting) /* * Evict cached data */ - if (dmu_objset_evict_dbufs(zfsvfs->z_os)) { + if (dmu_objset_is_dirty_anywhere(zfsvfs->z_os)) txg_wait_synced(dmu_objset_pool(zfsvfs->z_os), 0); - (void) dmu_objset_evict_dbufs(zfsvfs->z_os); - } + (void) dmu_objset_evict_dbufs(zfsvfs->z_os); return (0); }