Author: mav
Date: Tue Jun 11 14:25:03 2019
New Revision: 348916
URL: https://svnweb.freebsd.org/changeset/base/348916

Log:
  MFC r348567: MFV r348555:
  9690 metaslab of vdev with no space maps was flushed during removal
  
  illumos/illumos-gate@4e75ba682600b2bf19d158577d528c3db65050e8
  
  Reviewed by: Matt Ahrens <m...@delphix.com>
  Reviewed by: Brad Lewis <brad.le...@delphix.com>
  Approved by: Robert Mustacchi <r...@joyent.com>
  Author:     Serapheim Dimitropoulos <seraph...@delphix.com>

Modified:
  stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
==============================================================================
--- stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c     Tue Jun 
11 14:24:15 2019        (r348915)
+++ stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c     Tue Jun 
11 14:25:03 2019        (r348916)
@@ -3031,11 +3031,11 @@ vdev_destroy_spacemaps(vdev_t *vd, dmu_tx_t *tx)
 }
 
 static void
-vdev_remove_empty(vdev_t *vd, uint64_t txg)
+vdev_remove_empty_log(vdev_t *vd, uint64_t txg)
 {
        spa_t *spa = vd->vdev_spa;
-       dmu_tx_t *tx;
 
+       ASSERT(vd->vdev_islog);
        ASSERT(vd == vd->vdev_top);
        ASSERT3U(txg, ==, spa_syncing_txg(spa));
 
@@ -3079,13 +3079,14 @@ vdev_remove_empty(vdev_t *vd, uint64_t txg)
                        ASSERT0(mg->mg_histogram[i]);
        }
 
-       tx = dmu_tx_create_assigned(spa_get_dsl(spa), txg);
-       vdev_destroy_spacemaps(vd, tx);
+       dmu_tx_t *tx = dmu_tx_create_assigned(spa_get_dsl(spa), txg);
 
-       if (vd->vdev_islog && vd->vdev_top_zap != 0) {
+       vdev_destroy_spacemaps(vd, tx);
+       if (vd->vdev_top_zap != 0) {
                vdev_destroy_unlink_zap(vd, vd->vdev_top_zap, tx);
                vd->vdev_top_zap = 0;
        }
+
        dmu_tx_commit(tx);
 }
 
@@ -3157,14 +3158,11 @@ vdev_sync(vdev_t *vd, uint64_t txg)
                vdev_dtl_sync(lvd, txg);
 
        /*
-        * Remove the metadata associated with this vdev once it's empty.
-        * Note that this is typically used for log/cache device removal;
-        * we don't empty toplevel vdevs when removing them.  But if
-        * a toplevel happens to be emptied, this is not harmful.
+        * If this is an empty log device being removed, destroy the
+        * metadata associated with it.
         */
-       if (vd->vdev_stat.vs_alloc == 0 && vd->vdev_removing) {
-               vdev_remove_empty(vd, txg);
-       }
+       if (vd->vdev_islog && vd->vdev_stat.vs_alloc == 0 && vd->vdev_removing)
+               vdev_remove_empty_log(vd, txg);
 
        (void) txg_list_add(&spa->spa_vdev_txg_list, vd, TXG_CLEAN(txg));
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to