'zfs receive' fails with "dataset is busy"
Receiving an incremental stream after an interrupted "zfs receive -s" fails with the message "dataset is busy": this is because we still have the hidden clone ../%recv from the resumable receive. Improve the error message suggesting the existence of a partially complete resumable stream from "zfs receive -s" which can be either aborted ("zfs receive -A") or resumed ("zfs send -t"). Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: George Melikov <mail@gmelikov.ru> Signed-off-by: loli10K <ezomori.nozomu@gmail.com> Closes #7129 Closes #7154
This commit is contained in:
parent
a9ff89e05c
commit
1d805a534b
|
@ -6072,7 +6072,7 @@ share_mount_one(zfs_handle_t *zhp, int op, int flags, char *protocol,
|
|||
|
||||
(void) fprintf(stderr, gettext("cannot %s '%s': "
|
||||
"Contains partially-completed state from "
|
||||
"\"zfs receive -r\", which can be resumed with "
|
||||
"\"zfs receive -s\", which can be resumed with "
|
||||
"\"zfs send -t\"\n"),
|
||||
cmdname, zfs_get_name(zhp));
|
||||
return (1);
|
||||
|
|
|
@ -3254,6 +3254,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
|
|||
zfs_type_t type;
|
||||
boolean_t toplevel = B_FALSE;
|
||||
boolean_t zoned = B_FALSE;
|
||||
boolean_t hastoken = B_FALSE;
|
||||
|
||||
begin_time = time(NULL);
|
||||
bzero(origin, MAXNAMELEN);
|
||||
|
@ -3535,6 +3536,11 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
|
|||
/* we want to know if we're zoned when validating -o|-x props */
|
||||
zoned = zfs_prop_get_int(zhp, ZFS_PROP_ZONED);
|
||||
|
||||
/* may need this info later, get it now we have zhp around */
|
||||
if (zfs_prop_get(zhp, ZFS_PROP_RECEIVE_RESUME_TOKEN, NULL, 0,
|
||||
NULL, NULL, 0, B_TRUE) == 0)
|
||||
hastoken = B_TRUE;
|
||||
|
||||
/* gather existing properties on destination */
|
||||
origprops = fnvlist_alloc();
|
||||
fnvlist_merge(origprops, zhp->zfs_props);
|
||||
|
@ -3741,9 +3747,19 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
|
|||
break;
|
||||
case EDQUOT:
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
"destination %s space quota exceeded"), name);
|
||||
"destination %s space quota exceeded."), name);
|
||||
(void) zfs_error(hdl, EZFS_NOSPC, errbuf);
|
||||
break;
|
||||
case EBUSY:
|
||||
if (hastoken) {
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
"destination %s contains "
|
||||
"partially-complete state from "
|
||||
"\"zfs receive -s\"."), name);
|
||||
(void) zfs_error(hdl, EZFS_BUSY, errbuf);
|
||||
break;
|
||||
}
|
||||
/* fallthru */
|
||||
default:
|
||||
(void) zfs_standard_error(hdl, ioctl_errno, errbuf);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue