mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
Fix activating large_microzap on receive
This ensures that the in-memory state of the feature is recorded and that `dsl_dataset_activate_feature` is not called when the feature is already active. Reviewed-by: Alexander Motin <alexander.motin@TrueNAS.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Austin Wise <AustinWise@gmail.com> Closes #18143 Closes #18144
This commit is contained in:
+20
-18
@@ -997,24 +997,6 @@ dmu_recv_begin_sync(void *arg, dmu_tx_t *tx)
|
||||
numredactsnaps, tx);
|
||||
}
|
||||
|
||||
if (featureflags & DMU_BACKUP_FEATURE_LARGE_MICROZAP) {
|
||||
/*
|
||||
* The source has seen a large microzap at least once in its
|
||||
* life, so we activate the feature here to match. It's not
|
||||
* strictly necessary since a large microzap is usable without
|
||||
* the feature active, but if that object is sent on from here,
|
||||
* we need this info to know to add the stream feature.
|
||||
*
|
||||
* There may be no large microzap in the incoming stream, or
|
||||
* ever again, but this is a very niche feature and its very
|
||||
* difficult to spot a large microzap in the stream, so its
|
||||
* not worth the effort of trying harder to activate the
|
||||
* feature at first use.
|
||||
*/
|
||||
dsl_dataset_activate_feature(dsobj, SPA_FEATURE_LARGE_MICROZAP,
|
||||
(void *)B_TRUE, tx);
|
||||
}
|
||||
|
||||
dmu_buf_will_dirty(newds->ds_dbuf, tx);
|
||||
dsl_dataset_phys(newds)->ds_flags |= DS_FLAG_INCONSISTENT;
|
||||
|
||||
@@ -1044,6 +1026,26 @@ dmu_recv_begin_sync(void *arg, dmu_tx_t *tx)
|
||||
newds->ds_feature[SPA_FEATURE_LONGNAME] = (void *)B_TRUE;
|
||||
}
|
||||
|
||||
if (featureflags & DMU_BACKUP_FEATURE_LARGE_MICROZAP &&
|
||||
!dsl_dataset_feature_is_active(newds, SPA_FEATURE_LARGE_MICROZAP)) {
|
||||
/*
|
||||
* The source has seen a large microzap at least once in its
|
||||
* life, so we activate the feature here to match. It's not
|
||||
* strictly necessary since a large microzap is usable without
|
||||
* the feature active, but if that object is sent on from here,
|
||||
* we need this info to know to add the stream feature.
|
||||
*
|
||||
* There may be no large microzap in the incoming stream, or
|
||||
* ever again, but this is a very niche feature and its very
|
||||
* difficult to spot a large microzap in the stream, so its
|
||||
* not worth the effort of trying harder to activate the
|
||||
* feature at first use.
|
||||
*/
|
||||
dsl_dataset_activate_feature(dsobj, SPA_FEATURE_LARGE_MICROZAP,
|
||||
(void *)B_TRUE, tx);
|
||||
newds->ds_feature[SPA_FEATURE_LARGE_MICROZAP] = (void *)B_TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we actually created a non-clone, we need to create the objset
|
||||
* in our new dataset. If this is a raw send we postpone this until
|
||||
|
||||
Reference in New Issue
Block a user