mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
Enforce "-F" flag on resuming recv of full/newfs on existing dataset
When receiving full/newfs on existing dataset, then it should be done with "-F" flag. Its enforced for initial receive in checks done in zfs_receive_one function of libzfs. Similarly, on resuming full/newfs recv on existing dataset, it should be done with "-F" flag. When dataset doesn't exist, then full/new recv is done on newly created dataset and it's marked INCONSISTENT. But when receiving on existing dataset, recv is first done on %recv and its marked INCONSISTENT. Existing dataset is not marked INCONSISTENT. Resume of full/newfs receive with dataset not INCONSISTENT indicates that its resuming newfs on existing dataset. So, enforce "-F" flag in this case. Also return an error from dmu_recv_resume_begin_check() in zfs kernel, when its resuming full/newfs recv without force. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Chunwei Chen <david.chen@nutanix.com> Signed-off-by: Jitendra Patidar <jitendra.patidar@nutanix.com> Closes #13856 Closes #13857
This commit is contained in:
@@ -1045,13 +1045,24 @@ dmu_recv_resume_begin_check(void *arg, dmu_tx_t *tx)
|
||||
dsflags |= DS_HOLD_FLAG_DECRYPT;
|
||||
}
|
||||
|
||||
boolean_t recvexist = B_TRUE;
|
||||
if (dsl_dataset_hold_flags(dp, recvname, dsflags, FTAG, &ds) != 0) {
|
||||
/* %recv does not exist; continue in tofs */
|
||||
recvexist = B_FALSE;
|
||||
error = dsl_dataset_hold_flags(dp, tofs, dsflags, FTAG, &ds);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Resume of full/newfs recv on existing dataset should be done with
|
||||
* force flag
|
||||
*/
|
||||
if (recvexist && drrb->drr_fromguid == 0 && !drc->drc_force) {
|
||||
dsl_dataset_rele_flags(ds, dsflags, FTAG);
|
||||
return (SET_ERROR(ZFS_ERR_RESUME_EXISTS));
|
||||
}
|
||||
|
||||
/* check that ds is marked inconsistent */
|
||||
if (!DS_IS_INCONSISTENT(ds)) {
|
||||
dsl_dataset_rele_flags(ds, dsflags, FTAG);
|
||||
|
||||
Reference in New Issue
Block a user