--- a/usr/src/cmd/zpool/zpool_main.c Thu Jan 18 13:37:54 2007 -0800
+++ b/usr/src/cmd/zpool/zpool_main.c Thu Jan 18 14:25:26 2007 -0800
@@ -2659,55 +2659,36 @@
static void
print_error_log(zpool_handle_t *zhp)
{
- nvlist_t **log;
- size_t nelem;
- size_t maxdsname = sizeof ("DATASET") - 1;
- size_t maxobjname = sizeof ("OBJECT") - 1;
- int i;
- nvlist_t *nv;
- size_t len;
- char *dsname, *objname, *range;
-
- if (zpool_get_errlog(zhp, &log, &nelem) != 0) {
+ nvlist_t *nverrlist;
+ nvpair_t *elem;
+ char *pathname;
+ size_t len = MAXPATHLEN * 2;
+
+ if (zpool_get_errlog(zhp, &nverrlist) != 0) {
(void) printf("errors: List of errors unavailable "
"(insufficient privileges)\n");
return;
}
- for (i = 0; i < nelem; i++) {
- nv = log[i];
-
- verify(nvlist_lookup_string(nv, ZPOOL_ERR_DATASET,
- &dsname) == 0);
- len = strlen(dsname);
- if (len > maxdsname)
- maxdsname = len;
-
- verify(nvlist_lookup_string(nv, ZPOOL_ERR_OBJECT,
- &objname) == 0);
- len = strlen(objname);
- if (len > maxobjname)
- maxobjname = len;
+ (void) printf("errors: Permanent errors have been "
+ "detected in the following files:\n\n");
+
+ pathname = safe_malloc(len);
+ elem = NULL;
+ while ((elem = nvlist_next_nvpair(nverrlist, elem)) != NULL) {
+ nvlist_t *nv;
+ uint64_t dsobj, obj;
+
+ verify(nvpair_value_nvlist(elem, &nv) == 0);
+ verify(nvlist_lookup_uint64(nv, ZPOOL_ERR_DATASET,
+ &dsobj) == 0);
+ verify(nvlist_lookup_uint64(nv, ZPOOL_ERR_OBJECT,
+ &obj) == 0);
+ zpool_obj_to_path(zhp, dsobj, obj, pathname, len);
+ (void) printf("%7s %s\n", "", pathname);
}
-
- (void) printf("errors: The following persistent errors have been "
- "detected:\n\n");
- (void) printf("%8s %-*s %-*s %s\n", "", (int)maxdsname, "DATASET",
- (int)maxobjname, "OBJECT", "RANGE");
-
- for (i = 0; i < nelem; i++) {
- nv = log[i];
-
- verify(nvlist_lookup_string(nv, ZPOOL_ERR_DATASET,
- &dsname) == 0);
- verify(nvlist_lookup_string(nv, ZPOOL_ERR_OBJECT,
- &objname) == 0);
- verify(nvlist_lookup_string(nv, ZPOOL_ERR_RANGE,
- &range) == 0);
-
- (void) printf("%8s %-*s %-*s %s\n", "", (int)maxdsname,
- dsname, (int)maxobjname, objname, range);
- }
+ free(pathname);
+ nvlist_free(nverrlist);
}
static void
@@ -2896,7 +2877,6 @@
if (config != NULL) {
int namewidth;
uint64_t nerr;
- size_t realerr;
nvlist_t **spares;
uint_t nspares;
@@ -2922,14 +2902,25 @@
if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_ERRCOUNT,
&nerr) == 0) {
+ nvlist_t *nverrlist = NULL;
+
/*
* If the approximate error count is small, get a
* precise count by fetching the entire log and
* uniquifying the results.
*/
if (nerr < 100 && !cbp->cb_verbose &&
- zpool_get_errlog(zhp, NULL, &realerr) == 0)
- nerr = realerr;
+ zpool_get_errlog(zhp, &nverrlist) == 0) {
+ nvpair_t *elem;
+
+ elem = NULL;
+ nerr = 0;
+ while ((elem = nvlist_next_nvpair(nverrlist,
+ elem)) != NULL) {
+ nerr++;
+ }
+ }
+ nvlist_free(nverrlist);
(void) printf("\n");