From f04caa18dd550dec15eb74c9b017303ee53d84c5 Mon Sep 17 00:00:00 2001 From: pjd Date: Sun, 8 Apr 2007 03:02:08 +0000 Subject: If we cannot open /dev/zfs try to load zfs.ko automatically and reopen. --- .../opensolaris/lib/libzfs/common/libzfs_util.c | 23 ++++++++++++++++++++-- .../opensolaris/lib/libzfs/common/libzfs_util.c | 23 ++++++++++++++++++++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_util.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_util.c index 279835b..b9d8b97 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_util.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_util.c @@ -490,6 +490,21 @@ libzfs_print_on_error(libzfs_handle_t *hdl, boolean_t printerr) hdl->libzfs_printerr = printerr; } +static int +libzfs_load(void) +{ + int error; + + if (modfind("zfs") < 0) { + /* Not present in kernel, try loading it. */ + if (kldload("zfs") < 0 || modfind("zfs") < 0) { + if (errno != EEXIST) + return (error); + } + } + return (0); +} + libzfs_handle_t * libzfs_init(void) { @@ -500,8 +515,12 @@ libzfs_init(void) } if ((hdl->libzfs_fd = open(ZFS_DEV, O_RDWR)) < 0) { - free(hdl); - return (NULL); + if (libzfs_load() == 0) + hdl->libzfs_fd = open(ZFS_DEV, O_RDWR); + if (hdl->libzfs_fd < 0) { + free(hdl); + return (NULL); + } } if ((hdl->libzfs_mnttab = fopen(MNTTAB, "r")) == NULL) { diff --git a/contrib/opensolaris/lib/libzfs/common/libzfs_util.c b/contrib/opensolaris/lib/libzfs/common/libzfs_util.c index 279835b..b9d8b97 100644 --- a/contrib/opensolaris/lib/libzfs/common/libzfs_util.c +++ b/contrib/opensolaris/lib/libzfs/common/libzfs_util.c @@ -490,6 +490,21 @@ libzfs_print_on_error(libzfs_handle_t *hdl, boolean_t printerr) hdl->libzfs_printerr = printerr; } +static int +libzfs_load(void) +{ + int error; + + if (modfind("zfs") < 0) { + /* Not present in kernel, try loading it. */ + if (kldload("zfs") < 0 || modfind("zfs") < 0) { + if (errno != EEXIST) + return (error); + } + } + return (0); +} + libzfs_handle_t * libzfs_init(void) { @@ -500,8 +515,12 @@ libzfs_init(void) } if ((hdl->libzfs_fd = open(ZFS_DEV, O_RDWR)) < 0) { - free(hdl); - return (NULL); + if (libzfs_load() == 0) + hdl->libzfs_fd = open(ZFS_DEV, O_RDWR); + if (hdl->libzfs_fd < 0) { + free(hdl); + return (NULL); + } } if ((hdl->libzfs_mnttab = fopen(MNTTAB, "r")) == NULL) { -- cgit v1.1