diff -r 53e4f9da98a1 usr/src/uts/common/fs/zfs/dmu_object.c --- a/usr/src/uts/common/fs/zfs/dmu_object.c Sun Mar 24 13:24:51 2013 -0800 +++ b/usr/src/uts/common/fs/zfs/dmu_object.c Thu Apr 04 11:39:20 2013 +0200 @@ -105,10 +105,9 @@ dmu_object_claim(objset_t *os, uint64_t int dmu_object_reclaim(objset_t *os, uint64_t object, dmu_object_type_t ot, - int blocksize, dmu_object_type_t bonustype, int bonuslen) + int blocksize, dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx) { dnode_t *dn; - dmu_tx_t *tx; int nblkptr; int err; @@ -138,24 +137,11 @@ 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) { - 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; - } + if (dn->dn_nblkptr > nblkptr || dn->dn_datablksz != blocksize) + dnode_free_range(dn, 0, DMU_OBJECT_END, tx); dnode_reallocate(dn, ot, blocksize, bonustype, bonuslen, tx); - dmu_tx_commit(tx); -out: dnode_rele(dn, FTAG); return (err); diff -r 53e4f9da98a1 usr/src/uts/common/fs/zfs/dmu_send.c --- a/usr/src/uts/common/fs/zfs/dmu_send.c Sun Mar 24 13:24:51 2013 -0800 +++ b/usr/src/uts/common/fs/zfs/dmu_send.c Thu Apr 04 11:39:20 2013 +0200 @@ -1083,7 +1083,7 @@ backup_byteswap(dmu_replay_record_t *drr static int restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro) { - int err; + int err, obj_err; dmu_tx_t *tx; void *data = NULL; @@ -1099,9 +1099,9 @@ restore_object(struct restorearg *ra, ob return (SET_ERROR(EINVAL)); } - err = dmu_object_info(os, drro->drr_object, NULL); + obj_err = dmu_object_info(os, drro->drr_object, NULL); - if (err != 0 && err != ENOENT) + if (obj_err != 0 && obj_err != ENOENT) return (SET_ERROR(EINVAL)); if (drro->drr_bonuslen) { @@ -1110,37 +1110,31 @@ restore_object(struct restorearg *ra, ob return (ra->err); } - if (err == ENOENT) { + tx = dmu_tx_create(os); + dmu_tx_hold_bonus(tx, + obj_err == ENOENT ? DMU_NEW_OBJECT : drro->drr_object); + err = dmu_tx_assign(tx, TXG_WAIT); + if (err != 0) { + dmu_tx_abort(tx); + return (err); + } + + if (obj_err == ENOENT) { /* currently free, want to be allocated */ - tx = dmu_tx_create(os); - dmu_tx_hold_bonus(tx, DMU_NEW_OBJECT); - err = dmu_tx_assign(tx, TXG_WAIT); - if (err != 0) { - dmu_tx_abort(tx); - return (err); - } err = dmu_object_claim(os, drro->drr_object, drro->drr_type, drro->drr_blksz, drro->drr_bonustype, drro->drr_bonuslen, tx); - dmu_tx_commit(tx); } else { /* currently allocated, want to be allocated */ err = dmu_object_reclaim(os, drro->drr_object, drro->drr_type, drro->drr_blksz, - drro->drr_bonustype, drro->drr_bonuslen); + drro->drr_bonustype, drro->drr_bonuslen, tx); } if (err != 0) { + dmu_tx_commit(tx); return (SET_ERROR(EINVAL)); } - tx = dmu_tx_create(os); - dmu_tx_hold_bonus(tx, drro->drr_object); - err = dmu_tx_assign(tx, TXG_WAIT); - if (err != 0) { - dmu_tx_abort(tx); - return (err); - } - dmu_object_set_checksum(os, drro->drr_object, drro->drr_checksumtype, tx); dmu_object_set_compress(os, drro->drr_object, drro->drr_compress, tx); diff -r 53e4f9da98a1 usr/src/uts/common/fs/zfs/sys/dmu.h --- a/usr/src/uts/common/fs/zfs/sys/dmu.h Sun Mar 24 13:24:51 2013 -0800 +++ b/usr/src/uts/common/fs/zfs/sys/dmu.h Thu Apr 04 11:39:20 2013 +0200 @@ -329,7 +329,7 @@ uint64_t dmu_object_alloc(objset_t *os, int dmu_object_claim(objset_t *os, uint64_t object, dmu_object_type_t ot, int blocksize, dmu_object_type_t bonus_type, int bonus_len, dmu_tx_t *tx); int dmu_object_reclaim(objset_t *os, uint64_t object, dmu_object_type_t ot, - int blocksize, dmu_object_type_t bonustype, int bonuslen); + int blocksize, dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx); /* * Free an object from this objset.