From 5f2700eee5428b9ca4d4689c6985e751b733cbc6 Mon Sep 17 00:00:00 2001 From: Rob N Date: Wed, 6 Dec 2023 06:53:14 +1100 Subject: [PATCH] zpool: flush output before sleeping Several zpool commands (status, list, iostat) have modes that present some information, sleep a while, present the current state, sleep, etc. Some of those had ways to invoke them that when piped would appear to do nothing for a while, because non-terminals are block-buffered, not line-buffered, by default. Fix this by forcing a flush before sleeping. In particular, all of these buffered: - zpool status - zpool iostat -y - zpool list Reviewed-by: Brian Behlendorf Signed-off-by: Rob Norris Closes #15593 --- cmd/zpool/zpool_main.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c index 9dd1d2109..c143d6370 100644 --- a/cmd/zpool/zpool_main.c +++ b/cmd/zpool/zpool_main.c @@ -5950,6 +5950,7 @@ zpool_do_iostat(int argc, char **argv) print_iostat_header(&cb); if (skip) { + (void) fflush(stdout); (void) fsleep(interval); continue; } @@ -5980,18 +5981,13 @@ zpool_do_iostat(int argc, char **argv) } - /* - * Flush the output so that redirection to a file isn't buffered - * indefinitely. - */ - (void) fflush(stdout); - if (interval == 0) break; if (count != 0 && --count == 0) break; + (void) fflush(stdout); (void) fsleep(interval); } @@ -6514,6 +6510,8 @@ zpool_do_list(int argc, char **argv) break; pool_list_free(list); + + (void) fflush(stdout); (void) fsleep(interval); } @@ -9094,6 +9092,7 @@ zpool_do_status(int argc, char **argv) if (count != 0 && --count == 0) break; + (void) fflush(stdout); (void) fsleep(interval); }