diff options
author | pjd <pjd@FreeBSD.org> | 2007-04-08 03:02:08 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2007-04-08 03:02:08 +0000 |
commit | f04caa18dd550dec15eb74c9b017303ee53d84c5 (patch) | |
tree | 0a9afa399a3e77a94e2d26f11dfde2e6a57ea585 /cddl | |
parent | 314f7e910423221e34b2536e6382f36ea359f97b (diff) | |
download | FreeBSD-src-f04caa18dd550dec15eb74c9b017303ee53d84c5.zip FreeBSD-src-f04caa18dd550dec15eb74c9b017303ee53d84c5.tar.gz |
If we cannot open /dev/zfs try to load zfs.ko automatically and reopen.
Diffstat (limited to 'cddl')
-rw-r--r-- | cddl/contrib/opensolaris/lib/libzfs/common/libzfs_util.c | 23 |
1 files changed, 21 insertions, 2 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) { |