kern/146296: commit references a PR

dfilter service dfilter at FreeBSD.ORG
Tue May 4 17:40:04 UTC 2010


The following reply was made to PR kern/146296; it has been noted by GNATS.

From: dfilter at FreeBSD.ORG (dfilter service)
To: bug-followup at FreeBSD.org
Cc:  
Subject: Re: kern/146296: commit references a PR
Date: Tue,  4 May 2010 17:30:27 +0000 (UTC)

 Author: mm
 Date: Tue May  4 17:30:07 2010
 New Revision: 207624
 URL: http://svn.freebsd.org/changeset/base/207624
 
 Log:
   Fix deadlock during zfs receive.
   
   OpenSolaris onnv revision:	9299:8809e849f63e
   
   PR:		kern/146296
   Submitted by:	myself
   Approved by:	pjd, delphij (mentor)
   Obtained from:	OpenSolaris (Bug ID 6783818, 6826836)
   MFC after:	1 week
 
 Modified:
   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c
   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c
 
 Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c
 ==============================================================================
 --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c	Tue May  4 17:12:36 2010	(r207623)
 +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c	Tue May  4 17:30:07 2010	(r207624)
 @@ -464,15 +464,15 @@ dbuf_read_impl(dmu_buf_impl_t *db, zio_t
  	ASSERT(db->db_buf == NULL);
  
  	if (db->db_blkid == DB_BONUS_BLKID) {
 -		int bonuslen = dn->dn_bonuslen;
 +		int bonuslen = MIN(dn->dn_bonuslen, dn->dn_phys->dn_bonuslen);
  
  		ASSERT3U(bonuslen, <=, db->db.db_size);
  		db->db.db_data = zio_buf_alloc(DN_MAX_BONUSLEN);
  		arc_space_consume(DN_MAX_BONUSLEN);
  		if (bonuslen < DN_MAX_BONUSLEN)
  			bzero(db->db.db_data, DN_MAX_BONUSLEN);
 -		bcopy(DN_BONUS(dn->dn_phys), db->db.db_data,
 -		    bonuslen);
 +		if (bonuslen)
 +			bcopy(DN_BONUS(dn->dn_phys), db->db.db_data, bonuslen);
  		dbuf_update_data(db);
  		db->db_state = DB_CACHED;
  		mutex_exit(&db->db_mtx);
 
 Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c
 ==============================================================================
 --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c	Tue May  4 17:12:36 2010	(r207623)
 +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c	Tue May  4 17:30:07 2010	(r207624)
 @@ -128,15 +128,6 @@ dmu_object_reclaim(objset_t *os, uint64_
  		return (0);
  	}
  
 -	tx = dmu_tx_create(os);
 -	dmu_tx_hold_bonus(tx, object);
 -	err = dmu_tx_assign(tx, TXG_WAIT);
 -	if (err) {
 -		dmu_tx_abort(tx);
 -		dnode_rele(dn, FTAG);
 -		return (err);
 -	}
 -
  	nblkptr = 1 + ((DN_MAX_BONUSLEN - bonuslen) >> SPA_BLKPTRSHIFT);
  
  	/*
 @@ -144,16 +135,27 @@ dmu_object_reclaim(objset_t *os, uint64_
  	 * be a new file instance.   We must clear out the previous file
  	 * contents before we can change this type of metadata in the dnode.
  	 */
 -	if (dn->dn_nblkptr > nblkptr || dn->dn_datablksz != blocksize)
 -		dmu_free_long_range(os, object, 0, DMU_OBJECT_END);
 +	if (dn->dn_nblkptr > nblkptr || dn->dn_datablksz != blocksize) {
 +		err = dmu_free_long_range(os, object, 0, DMU_OBJECT_END);
 +		if (err)
 +			goto out;
 +	}
 +
 +	tx = dmu_tx_create(os);
 +	dmu_tx_hold_bonus(tx, object);
 +	err = dmu_tx_assign(tx, TXG_WAIT);
 +	if (err) {
 +		dmu_tx_abort(tx);
 +		goto out;
 +	}
  
  	dnode_reallocate(dn, ot, blocksize, bonustype, bonuslen, tx);
  
  	dmu_tx_commit(tx);
 -
 +out:
  	dnode_rele(dn, FTAG);
  
 -	return (0);
 +	return (err);
  }
  
  int
 _______________________________________________
 svn-src-all at freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
 


More information about the freebsd-fs mailing list