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:
Etienne Dechamps 2012-07-06 15:44:14 +02:00 committed by Brian Behlendorf
parent c7f2d69de3
commit 8adf486422
1 changed files with 7 additions and 5 deletions

View File

@ -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. * the disk to use the new unallocated space.
*/ */
static int 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; int fd, error;
if ((fd = open(path, O_RDWR|O_DIRECT)) < 0) { if ((fd = open(path, O_RDWR|O_DIRECT)) < 0) {
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "cannot " zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "cannot "
"relabel '%s': unable to open device: %d"), path, errno); "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) { if (error && error != VT_ENOSPC) {
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "cannot " zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "cannot "
"relabel '%s': unable to read disk capacity"), path); "relabel '%s': unable to read disk capacity"), path);
return (zfs_error(hdl, EZFS_NOCAP, errbuf)); return (zfs_error(hdl, EZFS_NOCAP, msg));
} }
return (0); return (0);
} }
@ -2122,6 +2121,7 @@ zpool_vdev_online(zpool_handle_t *zhp, const char *path, int flags,
nvlist_t *tgt; nvlist_t *tgt;
boolean_t avail_spare, l2cache, islog; boolean_t avail_spare, l2cache, islog;
libzfs_handle_t *hdl = zhp->zpool_hdl; libzfs_handle_t *hdl = zhp->zpool_hdl;
int error;
if (flags & ZFS_ONLINE_EXPAND) { if (flags & ZFS_ONLINE_EXPAND) {
(void) snprintf(msg, sizeof (msg), (void) snprintf(msg, sizeof (msg),
@ -2162,7 +2162,9 @@ zpool_vdev_online(zpool_handle_t *zhp, const char *path, int flags,
if (wholedisk) { if (wholedisk) {
pathname += strlen(DISK_ROOT) + 1; pathname += strlen(DISK_ROOT) + 1;
(void) zpool_relabel_disk(hdl, pathname); error = zpool_relabel_disk(hdl, pathname, msg);
if (error != 0)
return (error);
} }
} }