Fix error handling for "zpool online -e".
The error handling code around zpool_relabel_disk() is either inexistent or wrong. The function call itself is not checked, and zpool_relabel_disk() is generating error messages from an unitialized buffer. Before: # zpool online -e homez sdb; echo $? `: cannot relabel 'sdb1': unable to open device: 2 0 After: # zpool online -e homez sdb; echo $? cannot expand sdb: cannot relabel 'sdb1': unable to open device: 2 1 Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #808
This commit is contained in:
parent
c7f2d69de3
commit
8adf486422
|
@ -2083,15 +2083,14 @@ zpool_get_physpath(zpool_handle_t *zhp, char *physpath, size_t phypath_size)
|
|||
* the disk to use the new unallocated space.
|
||||
*/
|
||||
static int
|
||||
zpool_relabel_disk(libzfs_handle_t *hdl, const char *path)
|
||||
zpool_relabel_disk(libzfs_handle_t *hdl, const char *path, const char *msg)
|
||||
{
|
||||
char errbuf[1024];
|
||||
int fd, error;
|
||||
|
||||
if ((fd = open(path, O_RDWR|O_DIRECT)) < 0) {
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "cannot "
|
||||
"relabel '%s': unable to open device: %d"), path, errno);
|
||||
return (zfs_error(hdl, EZFS_OPENFAILED, errbuf));
|
||||
return (zfs_error(hdl, EZFS_OPENFAILED, msg));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2104,7 +2103,7 @@ zpool_relabel_disk(libzfs_handle_t *hdl, const char *path)
|
|||
if (error && error != VT_ENOSPC) {
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "cannot "
|
||||
"relabel '%s': unable to read disk capacity"), path);
|
||||
return (zfs_error(hdl, EZFS_NOCAP, errbuf));
|
||||
return (zfs_error(hdl, EZFS_NOCAP, msg));
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
@ -2122,6 +2121,7 @@ zpool_vdev_online(zpool_handle_t *zhp, const char *path, int flags,
|
|||
nvlist_t *tgt;
|
||||
boolean_t avail_spare, l2cache, islog;
|
||||
libzfs_handle_t *hdl = zhp->zpool_hdl;
|
||||
int error;
|
||||
|
||||
if (flags & ZFS_ONLINE_EXPAND) {
|
||||
(void) snprintf(msg, sizeof (msg),
|
||||
|
@ -2162,7 +2162,9 @@ zpool_vdev_online(zpool_handle_t *zhp, const char *path, int flags,
|
|||
|
||||
if (wholedisk) {
|
||||
pathname += strlen(DISK_ROOT) + 1;
|
||||
(void) zpool_relabel_disk(hdl, pathname);
|
||||
error = zpool_relabel_disk(hdl, pathname, msg);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue