diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c index 4254f9b4d..cc13e3739 100644 --- a/cmd/zpool/zpool_main.c +++ b/cmd/zpool/zpool_main.c @@ -49,6 +49,7 @@ #include #include #include +#include #include @@ -5465,7 +5466,7 @@ zpool_do_events_next(ev_opts_t *opts) while (1) { ret = zpool_events_next(g_zfs, &nvl, &dropped, - !!opts->follow, zevent_fd); + (opts->follow ? ZEVENT_NONE : ZEVENT_NONBLOCK), zevent_fd); if (ret || nvl == NULL) break; diff --git a/include/libzfs.h b/include/libzfs.h index cb78f1d62..5bc8b03ef 100644 --- a/include/libzfs.h +++ b/include/libzfs.h @@ -408,7 +408,8 @@ extern int zpool_upgrade(zpool_handle_t *, uint64_t); extern int zpool_get_history(zpool_handle_t *, nvlist_t **); extern int zpool_history_unpack(char *, uint64_t, uint64_t *, nvlist_t ***, uint_t *); -extern int zpool_events_next(libzfs_handle_t *, nvlist_t **, int *, int, int); +extern int zpool_events_next(libzfs_handle_t *, nvlist_t **, int *, unsigned, + int); extern int zpool_events_clear(libzfs_handle_t *, int *); extern int zpool_events_seek(libzfs_handle_t *, uint64_t, int); extern void zpool_obj_to_path(zpool_handle_t *, uint64_t, uint64_t, char *, diff --git a/include/sys/zfs_ioctl.h b/include/sys/zfs_ioctl.h index c63b16c78..0ab095c1a 100644 --- a/include/sys/zfs_ioctl.h +++ b/include/sys/zfs_ioctl.h @@ -259,6 +259,7 @@ typedef struct zinject_record { #define ZINJECT_FLUSH_ARC 0x2 #define ZINJECT_UNLOAD_SPA 0x4 +#define ZEVENT_NONE 0x0 #define ZEVENT_NONBLOCK 0x1 #define ZEVENT_SIZE 1024 diff --git a/lib/libzfs/libzfs_pool.c b/lib/libzfs/libzfs_pool.c index 2054385b8..db1f0d7cf 100644 --- a/lib/libzfs/libzfs_pool.c +++ b/lib/libzfs/libzfs_pool.c @@ -3790,11 +3790,12 @@ zpool_get_history(zpool_handle_t *zhp, nvlist_t **nvhisp) * no new events are available. In either case the function returns 0 and * it is up to the caller to free 'nvp'. In the case of a fatal error the * function will return a non-zero value. When the function is called in - * blocking mode it will not return until a new event is available. + * blocking mode (the default, unless the ZEVENT_NONBLOCK flag is passed), + * it will not return until a new event is available. */ int zpool_events_next(libzfs_handle_t *hdl, nvlist_t **nvp, - int *dropped, int block, int zevent_fd) + int *dropped, unsigned flags, int zevent_fd) { zfs_cmd_t zc = {"\0"}; int error = 0; @@ -3803,7 +3804,7 @@ zpool_events_next(libzfs_handle_t *hdl, nvlist_t **nvp, *dropped = 0; zc.zc_cleanup_fd = zevent_fd; - if (!block) + if (flags & ZEVENT_NONBLOCK) zc.zc_guid = ZEVENT_NONBLOCK; if (zcmd_alloc_dst_nvlist(hdl, &zc, ZEVENT_SIZE) != 0) @@ -3818,7 +3819,7 @@ retry: goto out; case ENOENT: /* Blocking error case should not occur */ - if (block) + if (!(flags & ZEVENT_NONBLOCK)) error = zpool_standard_error_fmt(hdl, errno, dgettext(TEXT_DOMAIN, "cannot get event"));