From: Alek P Date: Fri, 26 May 2017 18:42:10 +0000 (-1000) Subject: Don't dirty bpobj if it has no entries X-Git-Tag: zfs-0.7.0-rc5~75 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9210e43a1660bd1b742e80bfc121b86e2cfad57a;p=zfs 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 --- diff --git a/module/zfs/bpobj.c b/module/zfs/bpobj.c index 5f2aff453..82ca94e1d 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);