Author: mav
Date: Mon Jun  3 17:14:54 2019
New Revision: 348556
URL: https://svnweb.freebsd.org/changeset/base/348556

Log:
  9738 9112 broke third block copy allocations within one metaslab group
  
  illumos/illumos-gate@b86e7e3f0e50748bb5bb5cc91632d72ff17f08dd
  
  Reviewed by: Paul Dagnelie <p...@delphix.com>
  Reviewed by: George Wilson <george.wil...@delphix.com>
  Approved by: Robert Mustacchi <r...@joyent.com>
  Author:     Alexander Motin <m...@freebsd.org>

Modified:
  vendor-sys/illumos/dist/uts/common/fs/zfs/metaslab.c

Modified: vendor-sys/illumos/dist/uts/common/fs/zfs/metaslab.c
==============================================================================
--- vendor-sys/illumos/dist/uts/common/fs/zfs/metaslab.c        Mon Jun  3 
17:13:35 2019        (r348555)
+++ vendor-sys/illumos/dist/uts/common/fs/zfs/metaslab.c        Mon Jun  3 
17:14:54 2019        (r348556)
@@ -3080,7 +3080,6 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_
        metaslab_t *msp = NULL;
        uint64_t offset = -1ULL;
        uint64_t activation_weight;
-       boolean_t tertiary = B_FALSE;
 
        activation_weight = METASLAB_WEIGHT_PRIMARY;
        for (int i = 0; i < d; i++) {
@@ -3089,7 +3088,7 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_
                        activation_weight = METASLAB_WEIGHT_SECONDARY;
                } else if (activation_weight == METASLAB_WEIGHT_SECONDARY &&
                    DVA_GET_VDEV(&dva[i]) == mg->mg_vd->vdev_id) {
-                       tertiary = B_TRUE;
+                       activation_weight = METASLAB_WEIGHT_CLAIM;
                        break;
                }
        }
@@ -3098,10 +3097,8 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_
         * If we don't have enough metaslabs active to fill the entire array, we
         * just use the 0th slot.
         */
-       if (mg->mg_ms_ready < mg->mg_allocators * 2) {
-               tertiary = B_FALSE;
+       if (mg->mg_ms_ready < mg->mg_allocators * 3)
                allocator = 0;
-       }
 
        ASSERT3U(mg->mg_vd->vdev_ms_count, >=, 2);
 
@@ -3127,7 +3124,7 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_
                        msp = mg->mg_primaries[allocator];
                        was_active = B_TRUE;
                } else if (activation_weight == METASLAB_WEIGHT_SECONDARY &&
-                   mg->mg_secondaries[allocator] != NULL && !tertiary) {
+                   mg->mg_secondaries[allocator] != NULL) {
                        msp = mg->mg_secondaries[allocator];
                        was_active = B_TRUE;
                } else {
@@ -3170,7 +3167,8 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_
                        continue;
                }
 
-               if (msp->ms_weight & METASLAB_WEIGHT_CLAIM) {
+               if (msp->ms_weight & METASLAB_WEIGHT_CLAIM &&
+                   activation_weight != METASLAB_WEIGHT_CLAIM) {
                        metaslab_passivate(msp, msp->ms_weight &
                            ~METASLAB_WEIGHT_CLAIM);
                        mutex_exit(&msp->ms_lock);
_______________________________________________
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