]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Don't dirty bpobj if it has no entries
authorAlek P <alek-p@users.noreply.github.com>
Fri, 26 May 2017 18:42:10 +0000 (08:42 -1000)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 26 May 2017 18:42:10 +0000 (11:42 -0700)
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 <mail@gmelikov.ru>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Signed-off-by: Alek Pinchuk <apinchuk@datto.com>
Closes #6164

module/zfs/bpobj.c

index 5f2aff45349f490146b79a12fde1250344347990..82ca94e1d11b105b06e2529acb0bee300c32b701 100644 (file)
@@ -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 <sys/bpobj.h>
@@ -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);