Add libzfs_error_init() function
All fprintf() error messages are moved out of the libzfs_init() library function where they never belonged in the first place. A libzfs_error_init() function is added to provide useful error messages for the most common causes of failure. Additionally, in libzfs_run_process() the 'rc' variable was renamed to 'error' for consistency with the rest of the code base. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Chris Dunlap <cdunlap@llnl.gov> Signed-off-by: Richard Yao <ryao@gentoo.org>
This commit is contained in:
parent
87abfcba22
commit
65037d9b25
|
@ -473,8 +473,10 @@ main(int argc, char **argv)
|
||||||
if (zfsflags & ZS_ZFSUTIL)
|
if (zfsflags & ZS_ZFSUTIL)
|
||||||
zfsutil = 1;
|
zfsutil = 1;
|
||||||
|
|
||||||
if ((g_zfs = libzfs_init()) == NULL)
|
if ((g_zfs = libzfs_init()) == NULL) {
|
||||||
|
(void) fprintf(stderr, "%s", libzfs_error_init(errno));
|
||||||
return (MOUNT_SYSERR);
|
return (MOUNT_SYSERR);
|
||||||
|
}
|
||||||
|
|
||||||
/* try to open the dataset to access the mount point */
|
/* try to open the dataset to access the mount point */
|
||||||
if ((zhp = zfs_open(g_zfs, dataset,
|
if ((zhp = zfs_open(g_zfs, dataset,
|
||||||
|
|
|
@ -3699,8 +3699,10 @@ main(int argc, char **argv)
|
||||||
zfs_vdev_async_read_max_active = 10;
|
zfs_vdev_async_read_max_active = 10;
|
||||||
|
|
||||||
kernel_init(FREAD);
|
kernel_init(FREAD);
|
||||||
if ((g_zfs = libzfs_init()) == NULL)
|
if ((g_zfs = libzfs_init()) == NULL) {
|
||||||
|
(void) fprintf(stderr, "%s", libzfs_error_init(errno));
|
||||||
return (1);
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
if (dump_all)
|
if (dump_all)
|
||||||
verbose = MAX(verbose, 1);
|
verbose = MAX(verbose, 1);
|
||||||
|
|
|
@ -6708,8 +6708,10 @@ main(int argc, char **argv)
|
||||||
(strcmp(cmdname, "--help") == 0))
|
(strcmp(cmdname, "--help") == 0))
|
||||||
usage(B_TRUE);
|
usage(B_TRUE);
|
||||||
|
|
||||||
if ((g_zfs = libzfs_init()) == NULL)
|
if ((g_zfs = libzfs_init()) == NULL) {
|
||||||
|
(void) fprintf(stderr, "%s", libzfs_error_init(errno));
|
||||||
return (1);
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
mnttab_file = g_zfs->libzfs_mnttab;
|
mnttab_file = g_zfs->libzfs_mnttab;
|
||||||
|
|
||||||
|
|
|
@ -572,8 +572,10 @@ main(int argc, char **argv)
|
||||||
int ret;
|
int ret;
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
|
||||||
if ((g_zfs = libzfs_init()) == NULL)
|
if ((g_zfs = libzfs_init()) == NULL) {
|
||||||
|
(void) fprintf(stderr, "%s", libzfs_error_init(errno));
|
||||||
return (1);
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
libzfs_print_on_error(g_zfs, B_TRUE);
|
libzfs_print_on_error(g_zfs, B_TRUE);
|
||||||
|
|
||||||
|
|
|
@ -5919,8 +5919,10 @@ main(int argc, char **argv)
|
||||||
if ((strcmp(cmdname, "-?") == 0) || strcmp(cmdname, "--help") == 0)
|
if ((strcmp(cmdname, "-?") == 0) || strcmp(cmdname, "--help") == 0)
|
||||||
usage(B_TRUE);
|
usage(B_TRUE);
|
||||||
|
|
||||||
if ((g_zfs = libzfs_init()) == NULL)
|
if ((g_zfs = libzfs_init()) == NULL) {
|
||||||
|
(void) fprintf(stderr, "%s", libzfs_error_init(errno));
|
||||||
return (1);
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
libzfs_print_on_error(g_zfs, B_TRUE);
|
libzfs_print_on_error(g_zfs, B_TRUE);
|
||||||
|
|
||||||
|
|
|
@ -203,6 +203,7 @@ extern void zfs_save_arguments(int argc, char **, char *, int);
|
||||||
extern int zpool_log_history(libzfs_handle_t *, const char *);
|
extern int zpool_log_history(libzfs_handle_t *, const char *);
|
||||||
|
|
||||||
extern int libzfs_errno(libzfs_handle_t *);
|
extern int libzfs_errno(libzfs_handle_t *);
|
||||||
|
extern const char *libzfs_error_init(int);
|
||||||
extern const char *libzfs_error_action(libzfs_handle_t *);
|
extern const char *libzfs_error_action(libzfs_handle_t *);
|
||||||
extern const char *libzfs_error_description(libzfs_handle_t *);
|
extern const char *libzfs_error_description(libzfs_handle_t *);
|
||||||
extern int zfs_standard_error(libzfs_handle_t *, int, const char *);
|
extern int zfs_standard_error(libzfs_handle_t *, int, const char *);
|
||||||
|
@ -749,7 +750,6 @@ extern int zfs_nicestrtonum(libzfs_handle_t *, const char *, uint64_t *);
|
||||||
#define STDERR_VERBOSE 0x02
|
#define STDERR_VERBOSE 0x02
|
||||||
|
|
||||||
int libzfs_run_process(const char *, char **, int flags);
|
int libzfs_run_process(const char *, char **, int flags);
|
||||||
int libzfs_load_module(const char *);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Given a device or file, determine if it is part of a pool.
|
* Given a device or file, determine if it is part of a pool.
|
||||||
|
|
|
@ -58,6 +58,31 @@ libzfs_errno(libzfs_handle_t *hdl)
|
||||||
return (hdl->libzfs_error);
|
return (hdl->libzfs_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
libzfs_error_init(int error)
|
||||||
|
{
|
||||||
|
switch (error) {
|
||||||
|
case ENXIO:
|
||||||
|
return (dgettext(TEXT_DOMAIN, "The ZFS modules are not "
|
||||||
|
"loaded.\nTry running '/sbin/modprobe zfs' as root "
|
||||||
|
"to load them.\n"));
|
||||||
|
case ENOENT:
|
||||||
|
return (dgettext(TEXT_DOMAIN, "The /dev/zfs device is "
|
||||||
|
"missing and must be created.\nTry running 'udevadm "
|
||||||
|
"trigger' as root to create it.\n"));
|
||||||
|
case ENOEXEC:
|
||||||
|
return (dgettext(TEXT_DOMAIN, "The ZFS modules cannot be "
|
||||||
|
"auto-loaded.\nTry running '/sbin/modprobe zfs' as "
|
||||||
|
"root to manually load them.\n"));
|
||||||
|
case EACCES:
|
||||||
|
return (dgettext(TEXT_DOMAIN, "Permission denied the "
|
||||||
|
"ZFS utilities must be run as root.\n"));
|
||||||
|
default:
|
||||||
|
return (dgettext(TEXT_DOMAIN, "Failed to initialize the "
|
||||||
|
"libzfs library.\n"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
libzfs_error_action(libzfs_handle_t *hdl)
|
libzfs_error_action(libzfs_handle_t *hdl)
|
||||||
{
|
{
|
||||||
|
@ -628,7 +653,7 @@ int
|
||||||
libzfs_run_process(const char *path, char *argv[], int flags)
|
libzfs_run_process(const char *path, char *argv[], int flags)
|
||||||
{
|
{
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int rc, devnull_fd;
|
int error, devnull_fd;
|
||||||
|
|
||||||
pid = vfork();
|
pid = vfork();
|
||||||
if (pid == 0) {
|
if (pid == 0) {
|
||||||
|
@ -650,9 +675,9 @@ libzfs_run_process(const char *path, char *argv[], int flags)
|
||||||
} else if (pid > 0) {
|
} else if (pid > 0) {
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
while ((rc = waitpid(pid, &status, 0)) == -1 &&
|
while ((error = waitpid(pid, &status, 0)) == -1 &&
|
||||||
errno == EINTR);
|
errno == EINTR);
|
||||||
if (rc < 0 || !WIFEXITED(status))
|
if (error < 0 || !WIFEXITED(status))
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
return (WEXITSTATUS(status));
|
return (WEXITSTATUS(status));
|
||||||
|
@ -670,7 +695,7 @@ libzfs_run_process(const char *path, char *argv[], int flags)
|
||||||
* - ZFS_MODULE_LOADING="YES|yes|ON|on" - Attempt to load modules.
|
* - ZFS_MODULE_LOADING="YES|yes|ON|on" - Attempt to load modules.
|
||||||
* - ZFS_MODULE_TIMEOUT="<seconds>" - Seconds to wait for ZFS_DEV
|
* - ZFS_MODULE_TIMEOUT="<seconds>" - Seconds to wait for ZFS_DEV
|
||||||
*/
|
*/
|
||||||
int
|
static int
|
||||||
libzfs_load_module(const char *module)
|
libzfs_load_module(const char *module)
|
||||||
{
|
{
|
||||||
char *argv[4] = {"/sbin/modprobe", "-q", (char *)module, (char *)0};
|
char *argv[4] = {"/sbin/modprobe", "-q", (char *)module, (char *)0};
|
||||||
|
@ -739,9 +764,7 @@ libzfs_init(void)
|
||||||
|
|
||||||
error = libzfs_load_module(ZFS_DRIVER);
|
error = libzfs_load_module(ZFS_DRIVER);
|
||||||
if (error) {
|
if (error) {
|
||||||
(void) fprintf(stderr, gettext("Failed to load ZFS module "
|
errno = error;
|
||||||
"stack.\nLoad the module manually by running "
|
|
||||||
"'insmod <location>/zfs.ko' as root.\n"));
|
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -750,13 +773,6 @@ libzfs_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((hdl->libzfs_fd = open(ZFS_DEV, O_RDWR)) < 0) {
|
if ((hdl->libzfs_fd = open(ZFS_DEV, O_RDWR)) < 0) {
|
||||||
(void) fprintf(stderr, gettext("Unable to open %s: %s.\n"),
|
|
||||||
ZFS_DEV, strerror(errno));
|
|
||||||
if (errno == ENOENT)
|
|
||||||
(void) fprintf(stderr,
|
|
||||||
gettext("Verify the ZFS module stack is "
|
|
||||||
"loaded by running '/sbin/modprobe zfs'.\n"));
|
|
||||||
|
|
||||||
free(hdl);
|
free(hdl);
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
@ -767,8 +783,6 @@ libzfs_init(void)
|
||||||
if ((hdl->libzfs_mnttab = fopen(MNTTAB, "r")) == NULL) {
|
if ((hdl->libzfs_mnttab = fopen(MNTTAB, "r")) == NULL) {
|
||||||
#endif
|
#endif
|
||||||
(void) close(hdl->libzfs_fd);
|
(void) close(hdl->libzfs_fd);
|
||||||
(void) fprintf(stderr,
|
|
||||||
gettext("mtab is not present at %s.\n"), MNTTAB);
|
|
||||||
free(hdl);
|
free(hdl);
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue