Author: delphij
Date: Sat Dec 19 11:49:20 2009
New Revision: 200727
URL: http://svn.freebsd.org/changeset/base/200727

Log:
  Apply fix for Solaris bug 6462803: zfs snapshot -r failed because
  filesystem was busy
  (onnv revision 8989)
  
  Submitted by: mm
  Approved by:  pjd
  Obtained from:        OpenSolaris
  MFC after:    2 weeks

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c      Sat Dec 
19 11:47:22 2009        (r200726)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c      Sat Dec 
19 11:49:20 2009        (r200727)
@@ -828,6 +828,7 @@ restore_object(struct restorearg *ra, ob
 {
        int err;
        dmu_tx_t *tx;
+       void *data = NULL;
 
        if (drro->drr_type == DMU_OT_NONE ||
            drro->drr_type >= DMU_OT_NUMTYPES ||
@@ -869,6 +870,12 @@ restore_object(struct restorearg *ra, ob
        if (err)
                return (EINVAL);
 
+       if (drro->drr_bonuslen) {
+               data = restore_read(ra, P2ROUNDUP(drro->drr_bonuslen, 8));
+               if (ra->err)
+                       return (ra->err);
+       }
+
        tx = dmu_tx_create(os);
        dmu_tx_hold_bonus(tx, drro->drr_object);
        err = dmu_tx_assign(tx, TXG_WAIT);
@@ -880,18 +887,13 @@ restore_object(struct restorearg *ra, ob
        dmu_object_set_checksum(os, drro->drr_object, drro->drr_checksum, tx);
        dmu_object_set_compress(os, drro->drr_object, drro->drr_compress, tx);
 
-       if (drro->drr_bonuslen) {
+       if (data != NULL) {
                dmu_buf_t *db;
-               void *data;
+
                VERIFY(0 == dmu_bonus_hold(os, drro->drr_object, FTAG, &db));
                dmu_buf_will_dirty(db, tx);
 
                ASSERT3U(db->db_size, >=, drro->drr_bonuslen);
-               data = restore_read(ra, P2ROUNDUP(drro->drr_bonuslen, 8));
-               if (data == NULL) {
-                       dmu_tx_commit(tx);
-                       return (ra->err);
-               }
                bcopy(data, db->db_data, drro->drr_bonuslen);
                if (ra->byteswap) {
                        dmu_ot[drro->drr_bonustype].ot_byteswap(db->db_data,
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to