usr/src/uts/common/fs/zfs/metaslab.c
changeset 2459 7511d9859fcd
parent 2391 2fa3fd1db808
child 2856 6f4d5ee1906a
equal deleted inserted replaced
2458:57289607cb87 2459:7511d9859fcd
   185 }
   185 }
   186 
   186 
   187 static void
   187 static void
   188 metaslab_group_sort(metaslab_group_t *mg, metaslab_t *msp, uint64_t weight)
   188 metaslab_group_sort(metaslab_group_t *mg, metaslab_t *msp, uint64_t weight)
   189 {
   189 {
       
   190 	/*
       
   191 	 * Although in principle the weight can be any value, in
       
   192 	 * practice we do not use values in the range [1, 510].
       
   193 	 */
       
   194 	ASSERT(weight >= SPA_MINBLOCKSIZE-1 || weight == 0);
   190 	ASSERT(MUTEX_HELD(&msp->ms_lock));
   195 	ASSERT(MUTEX_HELD(&msp->ms_lock));
   191 
   196 
   192 	mutex_enter(&mg->mg_lock);
   197 	mutex_enter(&mg->mg_lock);
   193 	ASSERT(msp->ms_group == mg);
   198 	ASSERT(msp->ms_group == mg);
   194 	avl_remove(&mg->mg_metaslab_tree, msp);
   199 	avl_remove(&mg->mg_metaslab_tree, msp);
   432 }
   437 }
   433 
   438 
   434 static void
   439 static void
   435 metaslab_passivate(metaslab_t *msp, uint64_t size)
   440 metaslab_passivate(metaslab_t *msp, uint64_t size)
   436 {
   441 {
       
   442 	/*
       
   443 	 * If size < SPA_MINBLOCKSIZE, then we will not allocate from
       
   444 	 * this metaslab again.  In that case, it had better be empty,
       
   445 	 * or we would be leaving space on the table.
       
   446 	 */
       
   447 	ASSERT(size >= SPA_MINBLOCKSIZE || msp->ms_map.sm_space == 0);
   437 	metaslab_group_sort(msp->ms_group, msp, MIN(msp->ms_weight, size));
   448 	metaslab_group_sort(msp->ms_group, msp, MIN(msp->ms_weight, size));
   438 	ASSERT((msp->ms_weight & METASLAB_ACTIVE_MASK) == 0);
   449 	ASSERT((msp->ms_weight & METASLAB_ACTIVE_MASK) == 0);
   439 }
   450 }
   440 
   451 
   441 /*
   452 /*
   656 		mutex_enter(&msp->ms_lock);
   667 		mutex_enter(&msp->ms_lock);
   657 
   668 
   658 		if ((msp->ms_weight & METASLAB_WEIGHT_SECONDARY) &&
   669 		if ((msp->ms_weight & METASLAB_WEIGHT_SECONDARY) &&
   659 		    activation_weight == METASLAB_WEIGHT_PRIMARY) {
   670 		    activation_weight == METASLAB_WEIGHT_PRIMARY) {
   660 			metaslab_passivate(msp,
   671 			metaslab_passivate(msp,
   661 			    (msp->ms_weight & ~METASLAB_ACTIVE_MASK) /
   672 			    msp->ms_weight & ~METASLAB_ACTIVE_MASK);
   662 			    METASLAB_SMO_BONUS_MULTIPLIER);
       
   663 			mutex_exit(&msp->ms_lock);
   673 			mutex_exit(&msp->ms_lock);
   664 			continue;
   674 			continue;
   665 		}
   675 		}
   666 
   676 
   667 		if (metaslab_activate(msp, activation_weight) != 0) {
   677 		if (metaslab_activate(msp, activation_weight) != 0) {