9512 zfs remap poolname@snapname coredumps
Only filesystems and volumes are valid "zfs remap" parameters: when passed a snapshot name zfs_remap_indirects() does not handle the EINVAL returned from libzfs_core, which results in failing an assertion and consequently crashing. illumos/illumos-gate@0b2e825398 Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: John Wren Kennedy <john.kennedy@delphix.com> Reviewed by: Sara Hartse <sara.hartse@delphix.com> Approved by: Matt Ahrens <mahrens@delphix.com> Author: loli10K <ezomori.nozomu@gmail.com>
This commit is contained in:
parent
2395a7f52d
commit
cf8fc527c9
@ -6924,11 +6924,28 @@ zfs_do_diff(int argc, char **argv)
|
|||||||
return (err != 0);
|
return (err != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* zfs remap <filesystem | volume>
|
||||||
|
*
|
||||||
|
* Remap the indirect blocks in the given fileystem or volume.
|
||||||
|
*/
|
||||||
static int
|
static int
|
||||||
zfs_do_remap(int argc, char **argv)
|
zfs_do_remap(int argc, char **argv)
|
||||||
{
|
{
|
||||||
const char *fsname;
|
const char *fsname;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
/* check options */
|
||||||
|
while ((c = getopt(argc, argv, "")) != -1) {
|
||||||
|
switch (c) {
|
||||||
|
case '?':
|
||||||
|
(void) fprintf(stderr,
|
||||||
|
gettext("invalid option '%c'\n"), optopt);
|
||||||
|
usage(B_FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (argc != 2) {
|
if (argc != 2) {
|
||||||
(void) fprintf(stderr, gettext("wrong number of arguments\n"));
|
(void) fprintf(stderr, gettext("wrong number of arguments\n"));
|
||||||
usage(B_FALSE);
|
usage(B_FALSE);
|
||||||
|
@ -3877,12 +3877,24 @@ zfs_remap_indirects(libzfs_handle_t *hdl, const char *fs)
|
|||||||
char errbuf[1024];
|
char errbuf[1024];
|
||||||
|
|
||||||
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
|
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
|
||||||
"cannot remap filesystem '%s' "), fs);
|
"cannot remap dataset '%s'"), fs);
|
||||||
|
|
||||||
err = lzc_remap(fs);
|
err = lzc_remap(fs);
|
||||||
|
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
(void) zfs_standard_error(hdl, err, errbuf);
|
switch (err) {
|
||||||
|
case ENOTSUP:
|
||||||
|
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||||
|
"pool must be upgraded"));
|
||||||
|
(void) zfs_error(hdl, EZFS_BADVERSION, errbuf);
|
||||||
|
break;
|
||||||
|
case EINVAL:
|
||||||
|
(void) zfs_error(hdl, EZFS_BADTYPE, errbuf);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
(void) zfs_standard_error(hdl, err, errbuf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (err);
|
return (err);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user