]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Illumos 5117 - spacemap reallocation can cause corruption
authorGeorge Wilson <george.wilson@delphix.com>
Fri, 5 Sep 2014 00:50:36 +0000 (02:50 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 8 Sep 2014 16:42:39 +0000 (09:42 -0700)
5117 space map reallocation can cause corruption
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Sebastien Roy <sebastien.roy@delphix.com>
Reviewed by: Richard Elling <richard.elling@gmail.com>
Approved by: Richard Lowe <richlowe@richlowe.net>

References:
  https://www.illumos.org/projects/illumos-gate/issues/5117
  https://github.com/illumos/illumos-gate/commit/e503a68

Ported by: Turbo Fredriksson <turbo@bayour.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #2662

module/zfs/dnode_sync.c

index 676578859018ffa1813ea81b4f3745af5d3d84c9..6ad623998c2b6bcb9a65f75e3d1d57d0748bc485 100644 (file)
@@ -695,6 +695,11 @@ dnode_sync(dnode_t *dn, dmu_tx_t *tx)
                return;
        }
 
+       if (dn->dn_next_nlevels[txgoff]) {
+               dnode_increase_indirection(dn, tx);
+               dn->dn_next_nlevels[txgoff] = 0;
+       }
+
        if (dn->dn_next_nblkptr[txgoff]) {
                /* this should only happen on a realloc */
                ASSERT(dn->dn_allocated_txg == tx->tx_txg);
@@ -720,11 +725,6 @@ dnode_sync(dnode_t *dn, dmu_tx_t *tx)
                mutex_exit(&dn->dn_mtx);
        }
 
-       if (dn->dn_next_nlevels[txgoff]) {
-               dnode_increase_indirection(dn, tx);
-               dn->dn_next_nlevels[txgoff] = 0;
-       }
-
        dbuf_sync_list(list, tx);
 
        if (!DMU_OBJECT_IS_SPECIAL(dn->dn_object)) {