mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Move dmu_buf_rele() after dsl_dataset_sync_done()
Otherwise the dataset may be freed after the last dmu_buf_rele() leading to a panic. Reviewed-by: Mark Maybee <mark.maybee@delphix.com> Reviewed-by: Matthew Ahrens <mahrens@delphix.com> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14522 Closes #14523
This commit is contained in:
		
							parent
							
								
									083239575a
								
							
						
					
					
						commit
						aa256549d1
					
				@ -1301,6 +1301,7 @@ dmu_objset_create_sync(void *arg, dmu_tx_t *tx)
 | 
			
		||||
			ASSERT3P(ds->ds_key_mapping, !=, NULL);
 | 
			
		||||
			key_mapping_rele(spa, ds->ds_key_mapping, ds);
 | 
			
		||||
			dsl_dataset_sync_done(ds, tx);
 | 
			
		||||
			dmu_buf_rele(ds->ds_dbuf, ds);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		mutex_enter(&ds->ds_lock);
 | 
			
		||||
 | 
			
		||||
@ -2120,9 +2120,6 @@ dsl_crypto_recv_raw_objset_sync(dsl_dataset_t *ds, dmu_objset_type_t ostype,
 | 
			
		||||
		zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
 | 
			
		||||
		dsl_dataset_sync(ds, zio, tx);
 | 
			
		||||
		VERIFY0(zio_wait(zio));
 | 
			
		||||
 | 
			
		||||
		/* dsl_dataset_sync_done will drop this reference. */
 | 
			
		||||
		dmu_buf_add_ref(ds->ds_dbuf, ds);
 | 
			
		||||
		dsl_dataset_sync_done(ds, tx);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1259,9 +1259,6 @@ dsl_dataset_zero_zil(dsl_dataset_t *ds, dmu_tx_t *tx)
 | 
			
		||||
		zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
 | 
			
		||||
		dsl_dataset_sync(ds, zio, tx);
 | 
			
		||||
		VERIFY0(zio_wait(zio));
 | 
			
		||||
 | 
			
		||||
		/* dsl_dataset_sync_done will drop this reference. */
 | 
			
		||||
		dmu_buf_add_ref(ds->ds_dbuf, ds);
 | 
			
		||||
		dsl_dataset_sync_done(ds, tx);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -2260,10 +2257,6 @@ dsl_dataset_sync_done(dsl_dataset_t *ds, dmu_tx_t *tx)
 | 
			
		||||
	else
 | 
			
		||||
		ASSERT0(os->os_next_write_raw[tx->tx_txg & TXG_MASK]);
 | 
			
		||||
 | 
			
		||||
	ASSERT(!dmu_objset_is_dirty(os, dmu_tx_get_txg(tx)));
 | 
			
		||||
 | 
			
		||||
	dmu_buf_rele(ds->ds_dbuf, ds);
 | 
			
		||||
 | 
			
		||||
	for (spa_feature_t f = 0; f < SPA_FEATURES; f++) {
 | 
			
		||||
		if (zfeature_active(f,
 | 
			
		||||
		    ds->ds_feature_activation[f])) {
 | 
			
		||||
@ -2274,6 +2267,8 @@ dsl_dataset_sync_done(dsl_dataset_t *ds, dmu_tx_t *tx)
 | 
			
		||||
			ds->ds_feature[f] = ds->ds_feature_activation[f];
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ASSERT(!dmu_objset_is_dirty(os, dmu_tx_get_txg(tx)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
 | 
			
		||||
@ -786,6 +786,7 @@ dsl_pool_sync(dsl_pool_t *dp, uint64_t txg)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		dsl_dataset_sync_done(ds, tx);
 | 
			
		||||
		dmu_buf_rele(ds->ds_dbuf, ds);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while ((dd = txg_list_remove(&dp->dp_dirty_dirs, txg)) != NULL) {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user