From: Brian Behlendorf Date: Thu, 23 Mar 2017 01:08:55 +0000 (-0700) Subject: Fix `zpool status -v` error message X-Git-Tag: zfs-0.7.0-rc4~102 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=56a6054d553fd7f1cf7d7c86bf4b33951e1d009f;p=zfs Fix `zpool status -v` error message When a pool is suspended it's impossible to read the list of damaged files from disk. This would result in a generic misleading "insufficient permissions" error message. Update zpool_get_errlog() to use the standard zpool error logging functions to generate a useful error message. In this case: errors: List of errors unavailable: pool I/O is currently suspended This patch does not address the related issue of potentially not being able to resume a suspend pool when the underlying device names have changed. Additionally, remove the error handling from zfs_alloc() in zpool_get_errlog() for readability since this function can never fail. Reviewed-by: George Melikov Signed-off-by: Brian Behlendorf Closes #4031 Closes #5731 Closes #5907 --- diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c index da6744b76..b984f5583 100644 --- a/cmd/zpool/zpool_main.c +++ b/cmd/zpool/zpool_main.c @@ -5603,11 +5603,8 @@ print_error_log(zpool_handle_t *zhp) char *pathname; size_t len = MAXPATHLEN * 2; - if (zpool_get_errlog(zhp, &nverrlist) != 0) { - (void) printf("errors: List of errors unavailable " - "(insufficient privileges)\n"); + if (zpool_get_errlog(zhp, &nverrlist) != 0) return; - } (void) printf("errors: Permanent errors have been " "detected in the following files:\n\n"); diff --git a/lib/libzfs/libzfs_pool.c b/lib/libzfs/libzfs_pool.c index 9abea9023..616f5061f 100644 --- a/lib/libzfs/libzfs_pool.c +++ b/lib/libzfs/libzfs_pool.c @@ -3568,6 +3568,7 @@ int zpool_get_errlog(zpool_handle_t *zhp, nvlist_t **nverrlistp) { zfs_cmd_t zc = {"\0"}; + libzfs_handle_t *hdl = zhp->zpool_hdl; uint64_t count; zbookmark_phys_t *zb = NULL; int i; @@ -3581,9 +3582,8 @@ zpool_get_errlog(zpool_handle_t *zhp, nvlist_t **nverrlistp) &count) == 0); if (count == 0) return (0); - if ((zc.zc_nvlist_dst = (uintptr_t)zfs_alloc(zhp->zpool_hdl, - count * sizeof (zbookmark_phys_t))) == (uintptr_t)NULL) - return (-1); + zc.zc_nvlist_dst = (uintptr_t)zfs_alloc(zhp->zpool_hdl, + count * sizeof (zbookmark_phys_t)); zc.zc_nvlist_dst_size = count; (void) strcpy(zc.zc_name, zhp->zpool_name); for (;;) { @@ -3596,11 +3596,11 @@ zpool_get_errlog(zpool_handle_t *zhp, nvlist_t **nverrlistp) count = zc.zc_nvlist_dst_size; dst = zfs_alloc(zhp->zpool_hdl, count * sizeof (zbookmark_phys_t)); - if (dst == NULL) - return (-1); zc.zc_nvlist_dst = (uintptr_t)dst; } else { - return (-1); + return (zpool_standard_error_fmt(hdl, errno, + dgettext(TEXT_DOMAIN, "errors: List of " + "errors unavailable"))); } } else { break;