> Author: mav
> Date: Wed Nov 21 18:18:57 2018
> New Revision: 340737
> URL: https://svnweb.freebsd.org/changeset/base/340737
> 
> Log:
>   Revert r340096: 9952 Block size change during zfs receive drops spill block
>   
>   It was reported, and I easily reproduced it, that this change triggers panic
>   when receiving replication stream with enabled embedded blocks, when short
>   file compressing into one embedded block changes its block size.  I am not
>   sure that the problem is in this particuler patch, not just triggered by it,
>   but since investigation and fix will take some time, I've decided to revert
>   this for now.
>   
>   PR:         198457, 233277

Is there any impact to stable/12, and more specifically, releng/12?

Thanks,
Rod

> 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    Wed Nov 
> 21 17:47:40 2018        (r340736)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c    Wed Nov 
> 21 18:18:57 2018        (r340737)
> @@ -2143,7 +2143,6 @@ receive_object(struct receive_writer_arg *rwa, struct 
>  {
>       dmu_object_info_t doi;
>       dmu_tx_t *tx;
> -     dmu_buf_t *db;
>       uint64_t object;
>       int err;
>  
> @@ -2191,14 +2190,12 @@ receive_object(struct receive_writer_arg *rwa, struct 
>  
>       tx = dmu_tx_create(rwa->os);
>       dmu_tx_hold_bonus(tx, object);
> -     dmu_tx_hold_write(tx, object, 0, 0);
>       err = dmu_tx_assign(tx, TXG_WAIT);
>       if (err != 0) {
>               dmu_tx_abort(tx);
>               return (err);
>       }
>  
> -     db = NULL;
>       if (object == DMU_NEW_OBJECT) {
>               /* currently free, want to be allocated */
>               err = dmu_object_claim_dnsize(rwa->os, drro->drr_object,
> @@ -2206,33 +2203,15 @@ receive_object(struct receive_writer_arg *rwa, struct 
>                   drro->drr_bonustype, drro->drr_bonuslen,
>                   drro->drr_dn_slots << DNODE_SHIFT, tx);
>       } else if (drro->drr_type != doi.doi_type ||
> -         (drro->drr_blksz != doi.doi_data_block_size &&
> -          doi.doi_max_offset > doi.doi_data_block_size)) {
> +         drro->drr_blksz != doi.doi_data_block_size ||
> +         drro->drr_bonustype != doi.doi_bonus_type ||
> +         drro->drr_bonuslen != doi.doi_bonus_size) {
>               /* currently allocated, but with different properties */
>               err = dmu_object_reclaim(rwa->os, drro->drr_object,
>                   drro->drr_type, drro->drr_blksz,
>                   drro->drr_bonustype, drro->drr_bonuslen, tx);
> -     } else {
> -             /*
> -              * Currently allocated, but with slightly different properties,
> -              * that may change live, like block size or bonus buffer.
> -              * Change those specifically to not loose the spill block, etc.
> -              */
> -             if (drro->drr_bonustype != doi.doi_bonus_type ||
> -                 drro->drr_bonuslen != doi.doi_bonus_size)
> -                     VERIFY0(dmu_bonus_hold(rwa->os, drro->drr_object, FTAG,
> -                         &db));
> -             if (drro->drr_bonustype != doi.doi_bonus_type)
> -                     VERIFY0(dmu_set_bonustype(db, drro->drr_bonustype, tx));
> -             if (drro->drr_bonuslen != doi.doi_bonus_size)
> -                     VERIFY0(dmu_set_bonus(db, drro->drr_bonuslen, tx));
> -             if (drro->drr_blksz != doi.doi_data_block_size)
> -                     err = dmu_object_set_blocksize(rwa->os, 
> drro->drr_object,
> -                         drro->drr_blksz, 0, tx);
>       }
>       if (err != 0) {
> -             if (db != NULL)
> -                     dmu_buf_rele(db, FTAG);
>               dmu_tx_commit(tx);
>               return (SET_ERROR(EINVAL));
>       }
> @@ -2243,9 +2222,9 @@ receive_object(struct receive_writer_arg *rwa, struct 
>           drro->drr_compress, tx);
>  
>       if (data != NULL) {
> -             if (db == NULL)
> -                     VERIFY0(dmu_bonus_hold(rwa->os, drro->drr_object, FTAG,
> -                         &db));
> +             dmu_buf_t *db;
> +
> +             VERIFY0(dmu_bonus_hold(rwa->os, drro->drr_object, FTAG, &db));
>               dmu_buf_will_dirty(db, tx);
>  
>               ASSERT3U(db->db_size, >=, drro->drr_bonuslen);
> @@ -2256,9 +2235,8 @@ receive_object(struct receive_writer_arg *rwa, struct 
>                       dmu_ot_byteswap[byteswap].ob_func(db->db_data,
>                           drro->drr_bonuslen);
>               }
> -     }
> -     if (db != NULL)
>               dmu_buf_rele(db, FTAG);
> +     }
>       dmu_tx_commit(tx);
>  
>       return (0);
> 
> 

-- 
Rod Grimes                                                 rgri...@freebsd.org
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to