From 9210e43a1660bd1b742e80bfc121b86e2cfad57a Mon Sep 17 00:00:00 2001 From: Alek P Date: Fri, 26 May 2017 08:42:10 -1000 Subject: [PATCH] Don't dirty bpobj if it has no entries In certain cases (dsl_scan_sync() is one), we may end up calling bpobj_iterate() on an empty bpobj. Even though we don't end up modifying the bpobj it still gets dirtied, causing unneeded writes to the pool. This patch adds an early bail from bpobj_iterate_impl() if bpobj is empty to prevent unneeded writes. Reviewed-by: George Melikov Reviewed-by: Brian Behlendorf Reviewed by: Matthew Ahrens Signed-off-by: Alek Pinchuk Closes #6164 --- module/zfs/bpobj.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/module/zfs/bpobj.c b/module/zfs/bpobj.c index 5f2aff4534..82ca94e1d1 100644 --- a/module/zfs/bpobj.c +++ b/module/zfs/bpobj.c @@ -21,6 +21,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2016 by Delphix. All rights reserved. + * Copyright (c) 2017 Datto Inc. */ #include @@ -211,6 +212,9 @@ bpobj_iterate_impl(bpobj_t *bpo, bpobj_itor_t func, void *arg, dmu_tx_t *tx, mutex_enter(&bpo->bpo_lock); + if (!bpobj_hasentries(bpo)) + goto out; + if (free) dmu_buf_will_dirty(bpo->bpo_dbuf, tx);