summaryrefslogtreecommitdiff
path: root/usr/src/lib/libzfs/common/libzfs_dataset.c
diff options
context:
space:
mode:
authorEric Taylor <Eric.Taylor@Sun.COM>2009-02-13 10:32:09 -0700
committerEric Taylor <Eric.Taylor@Sun.COM>2009-02-13 10:32:09 -0700
commitb2634b9c57bbcfa01bb5dec2e196aec32957925f (patch)
treef78fefc7ff78db6a1c87a6cb6574ff8058a66c0e /usr/src/lib/libzfs/common/libzfs_dataset.c
parent81af778e872fc2ec5f0ac36e7b25bdb24ebd2d6a (diff)
downloadillumos-joyent-b2634b9c57bbcfa01bb5dec2e196aec32957925f.tar.gz
6790687 libzfs mnttab caching ignores external changes
6791101 memory leak from libzfs_mnttab_init
Diffstat (limited to 'usr/src/lib/libzfs/common/libzfs_dataset.c')
-rw-r--r--usr/src/lib/libzfs/common/libzfs_dataset.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/usr/src/lib/libzfs/common/libzfs_dataset.c b/usr/src/lib/libzfs/common/libzfs_dataset.c
index 80dd06cb4a..a9f01ebc13 100644
--- a/usr/src/lib/libzfs/common/libzfs_dataset.c
+++ b/usr/src/lib/libzfs/common/libzfs_dataset.c
@@ -605,11 +605,15 @@ libzfs_mnttab_cache_compare(const void *arg1, const void *arg2)
void
libzfs_mnttab_init(libzfs_handle_t *hdl)
{
- struct mnttab entry;
-
assert(avl_numnodes(&hdl->libzfs_mnttab_cache) == 0);
avl_create(&hdl->libzfs_mnttab_cache, libzfs_mnttab_cache_compare,
sizeof (mnttab_node_t), offsetof(mnttab_node_t, mtn_node));
+}
+
+void
+libzfs_mnttab_update(libzfs_handle_t *hdl)
+{
+ struct mnttab entry;
rewind(hdl->libzfs_mnttab);
while (getmntent(hdl->libzfs_mnttab, &entry) == 0) {
@@ -642,6 +646,12 @@ libzfs_mnttab_fini(libzfs_handle_t *hdl)
avl_destroy(&hdl->libzfs_mnttab_cache);
}
+void
+libzfs_mnttab_cache(libzfs_handle_t *hdl, boolean_t enable)
+{
+ hdl->libzfs_mnttab_enable = enable;
+}
+
int
libzfs_mnttab_find(libzfs_handle_t *hdl, const char *fsname,
struct mnttab *entry)
@@ -649,8 +659,22 @@ libzfs_mnttab_find(libzfs_handle_t *hdl, const char *fsname,
mnttab_node_t find;
mnttab_node_t *mtn;
+ if (!hdl->libzfs_mnttab_enable) {
+ struct mnttab srch = { 0 };
+
+ if (avl_numnodes(&hdl->libzfs_mnttab_cache))
+ libzfs_mnttab_fini(hdl);
+ rewind(hdl->libzfs_mnttab);
+ srch.mnt_special = (char *)fsname;
+ srch.mnt_fstype = MNTTYPE_ZFS;
+ if (getmntany(hdl->libzfs_mnttab, entry, &srch) == 0)
+ return (0);
+ else
+ return (ENOENT);
+ }
+
if (avl_numnodes(&hdl->libzfs_mnttab_cache) == 0)
- libzfs_mnttab_init(hdl);
+ libzfs_mnttab_update(hdl);
find.mtn_mt.mnt_special = (char *)fsname;
mtn = avl_find(&hdl->libzfs_mnttab_cache, &find, NULL);