svn commit: r340737 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Rodney W. Grimes
freebsd at pdx.rh.CN85.dnsmgr.net
Wed Nov 21 19:01:48 UTC 2018
> 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 rgrimes at freebsd.org
More information about the svn-src-all
mailing list