diff options
author | Ryan Moeller <[email protected]> | 2020-10-13 12:38:40 -0400 |
---|---|---|
committer | GitHub <[email protected]> | 2020-10-13 09:38:40 -0700 |
commit | e191b60ddc2bc5697f2b28558f8156d4357d79c0 (patch) | |
tree | 740bd1853429eceb55841630c83dffe2fadc158a /lib/libzfs | |
parent | 7dfc56d8661aa862364f9ccf76751fe6d2946c29 (diff) |
FreeBSD: Improve libzfs_error_init messages
It is a common mistake to have failed to autoload the module due to
permission issues when running a ZFS command as a user. "Operation
not permitted" is an unhelpfully vague error message.
Use a thread-local message buffer to format a nicer error message.
We can infer that loading the kernel module failed if the module is
not loaded. This can be extended with heuristics for other errors
in the future.
While looking at this stuff, remove an unused thread-local message
buffer found in libspl and remove some inaccurate verbiage from the
comment on libzfs_load_module.
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Ryan Moeller <[email protected]>
Closes #11033
Diffstat (limited to 'lib/libzfs')
-rw-r--r-- | lib/libzfs/libzfs_util.c | 3 | ||||
-rw-r--r-- | lib/libzfs/os/freebsd/libzfs_compat.c | 21 |
2 files changed, 17 insertions, 7 deletions
diff --git a/lib/libzfs/libzfs_util.c b/lib/libzfs/libzfs_util.c index 651bca297..a457fbfd0 100644 --- a/lib/libzfs/libzfs_util.c +++ b/lib/libzfs/libzfs_util.c @@ -1010,8 +1010,7 @@ libzfs_init(void) int error; char *env; - error = libzfs_load_module(); - if (error) { + if ((error = libzfs_load_module()) != 0) { errno = error; return (NULL); } diff --git a/lib/libzfs/os/freebsd/libzfs_compat.c b/lib/libzfs/os/freebsd/libzfs_compat.c index 037ba56ef..2de90c7ce 100644 --- a/lib/libzfs/os/freebsd/libzfs_compat.c +++ b/lib/libzfs/os/freebsd/libzfs_compat.c @@ -176,11 +176,26 @@ execvpe(const char *name, char * const argv[], char * const envp[]) return (execvPe(name, path, argv, envp)); } +#define ERRBUFLEN 256 + +__thread static char errbuf[ERRBUFLEN]; + const char * libzfs_error_init(int error) { + char *msg = errbuf; + size_t len, msglen = ERRBUFLEN; - return (strerror(error)); + if (modfind("zfs") < 0) { + len = snprintf(msg, msglen, dgettext(TEXT_DOMAIN, + "Failed to load %s module: "), ZFS_KMOD); + msg += len; + msglen -= len; + } + + (void) snprintf(msg, msglen, "%s", strerror(error)); + + return (errbuf); } int @@ -193,10 +208,6 @@ zfs_ioctl(libzfs_handle_t *hdl, int request, zfs_cmd_t *zc) * Verify the required ZFS_DEV device is available and optionally attempt * to load the ZFS modules. Under normal circumstances the modules * should already have been loaded by some external mechanism. - * - * Environment variables: - * - ZFS_MODULE_LOADING="YES|yes|ON|on" - Attempt to load modules. - * - ZFS_MODULE_TIMEOUT="<seconds>" - Seconds to wait for ZFS_DEV */ int libzfs_load_module(void) |