Changeset View
Changeset View
Standalone View
Standalone View
cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
Show First 20 Lines • Show All 793 Lines • ▼ Show 20 Lines | libzfs_mnttab_cache_compare(const void *arg1, const void *arg2) | ||||
rv = strcmp(mtn1->mtn_mt.mnt_special, mtn2->mtn_mt.mnt_special); | rv = strcmp(mtn1->mtn_mt.mnt_special, mtn2->mtn_mt.mnt_special); | ||||
return (AVL_ISIGN(rv)); | return (AVL_ISIGN(rv)); | ||||
} | } | ||||
void | void | ||||
libzfs_mnttab_init(libzfs_handle_t *hdl) | libzfs_mnttab_init(libzfs_handle_t *hdl) | ||||
{ | { | ||||
pthread_mutex_init(&hdl->libzfs_mnttab_cache_lock, NULL); | |||||
assert(avl_numnodes(&hdl->libzfs_mnttab_cache) == 0); | assert(avl_numnodes(&hdl->libzfs_mnttab_cache) == 0); | ||||
avl_create(&hdl->libzfs_mnttab_cache, libzfs_mnttab_cache_compare, | avl_create(&hdl->libzfs_mnttab_cache, libzfs_mnttab_cache_compare, | ||||
sizeof (mnttab_node_t), offsetof(mnttab_node_t, mtn_node)); | sizeof (mnttab_node_t), offsetof(mnttab_node_t, mtn_node)); | ||||
} | } | ||||
void | void | ||||
libzfs_mnttab_update(libzfs_handle_t *hdl) | libzfs_mnttab_update(libzfs_handle_t *hdl) | ||||
{ | { | ||||
Show All 24 Lines | while ((mtn = avl_destroy_nodes(&hdl->libzfs_mnttab_cache, &cookie)) | ||||
!= NULL) { | != NULL) { | ||||
free(mtn->mtn_mt.mnt_special); | free(mtn->mtn_mt.mnt_special); | ||||
free(mtn->mtn_mt.mnt_mountp); | free(mtn->mtn_mt.mnt_mountp); | ||||
free(mtn->mtn_mt.mnt_fstype); | free(mtn->mtn_mt.mnt_fstype); | ||||
free(mtn->mtn_mt.mnt_mntopts); | free(mtn->mtn_mt.mnt_mntopts); | ||||
free(mtn); | free(mtn); | ||||
} | } | ||||
avl_destroy(&hdl->libzfs_mnttab_cache); | avl_destroy(&hdl->libzfs_mnttab_cache); | ||||
(void) pthread_mutex_destroy(&hdl->libzfs_mnttab_cache_lock); | |||||
} | } | ||||
void | void | ||||
libzfs_mnttab_cache(libzfs_handle_t *hdl, boolean_t enable) | libzfs_mnttab_cache(libzfs_handle_t *hdl, boolean_t enable) | ||||
{ | { | ||||
hdl->libzfs_mnttab_enable = enable; | hdl->libzfs_mnttab_enable = enable; | ||||
} | } | ||||
int | int | ||||
libzfs_mnttab_find(libzfs_handle_t *hdl, const char *fsname, | libzfs_mnttab_find(libzfs_handle_t *hdl, const char *fsname, | ||||
struct mnttab *entry) | struct mnttab *entry) | ||||
{ | { | ||||
mnttab_node_t find; | mnttab_node_t find; | ||||
mnttab_node_t *mtn; | mnttab_node_t *mtn; | ||||
int ret = ENOENT; | |||||
if (!hdl->libzfs_mnttab_enable) { | if (!hdl->libzfs_mnttab_enable) { | ||||
struct mnttab srch = { 0 }; | struct mnttab srch = { 0 }; | ||||
if (avl_numnodes(&hdl->libzfs_mnttab_cache)) | if (avl_numnodes(&hdl->libzfs_mnttab_cache)) | ||||
libzfs_mnttab_fini(hdl); | libzfs_mnttab_fini(hdl); | ||||
rewind(hdl->libzfs_mnttab); | rewind(hdl->libzfs_mnttab); | ||||
srch.mnt_special = (char *)fsname; | srch.mnt_special = (char *)fsname; | ||||
srch.mnt_fstype = MNTTYPE_ZFS; | srch.mnt_fstype = MNTTYPE_ZFS; | ||||
if (getmntany(hdl->libzfs_mnttab, entry, &srch) == 0) | if (getmntany(hdl->libzfs_mnttab, entry, &srch) == 0) | ||||
return (0); | return (0); | ||||
else | else | ||||
return (ENOENT); | return (ENOENT); | ||||
} | } | ||||
pthread_mutex_lock(&hdl->libzfs_mnttab_cache_lock); | |||||
if (avl_numnodes(&hdl->libzfs_mnttab_cache) == 0) | if (avl_numnodes(&hdl->libzfs_mnttab_cache) == 0) | ||||
libzfs_mnttab_update(hdl); | libzfs_mnttab_update(hdl); | ||||
find.mtn_mt.mnt_special = (char *)fsname; | find.mtn_mt.mnt_special = (char *)fsname; | ||||
mtn = avl_find(&hdl->libzfs_mnttab_cache, &find, NULL); | mtn = avl_find(&hdl->libzfs_mnttab_cache, &find, NULL); | ||||
if (mtn) { | if (mtn) { | ||||
*entry = mtn->mtn_mt; | *entry = mtn->mtn_mt; | ||||
return (0); | ret = 0; | ||||
} | } | ||||
return (ENOENT); | pthread_mutex_unlock(&hdl->libzfs_mnttab_cache_lock); | ||||
return (ret); | |||||
} | } | ||||
void | void | ||||
libzfs_mnttab_add(libzfs_handle_t *hdl, const char *special, | libzfs_mnttab_add(libzfs_handle_t *hdl, const char *special, | ||||
const char *mountp, const char *mntopts) | const char *mountp, const char *mntopts) | ||||
{ | { | ||||
mnttab_node_t *mtn; | mnttab_node_t *mtn; | ||||
if (avl_numnodes(&hdl->libzfs_mnttab_cache) == 0) | pthread_mutex_lock(&hdl->libzfs_mnttab_cache_lock); | ||||
return; | if (avl_numnodes(&hdl->libzfs_mnttab_cache) == 0) { | ||||
mtn = zfs_alloc(hdl, sizeof (mnttab_node_t)); | mtn = zfs_alloc(hdl, sizeof (mnttab_node_t)); | ||||
mtn->mtn_mt.mnt_special = zfs_strdup(hdl, special); | mtn->mtn_mt.mnt_special = zfs_strdup(hdl, special); | ||||
mtn->mtn_mt.mnt_mountp = zfs_strdup(hdl, mountp); | mtn->mtn_mt.mnt_mountp = zfs_strdup(hdl, mountp); | ||||
mtn->mtn_mt.mnt_fstype = zfs_strdup(hdl, MNTTYPE_ZFS); | mtn->mtn_mt.mnt_fstype = zfs_strdup(hdl, MNTTYPE_ZFS); | ||||
mtn->mtn_mt.mnt_mntopts = zfs_strdup(hdl, mntopts); | mtn->mtn_mt.mnt_mntopts = zfs_strdup(hdl, mntopts); | ||||
avl_add(&hdl->libzfs_mnttab_cache, mtn); | avl_add(&hdl->libzfs_mnttab_cache, mtn); | ||||
} | } | ||||
pthread_mutex_unlock(&hdl->libzfs_mnttab_cache_lock); | |||||
} | |||||
void | void | ||||
libzfs_mnttab_remove(libzfs_handle_t *hdl, const char *fsname) | libzfs_mnttab_remove(libzfs_handle_t *hdl, const char *fsname) | ||||
{ | { | ||||
mnttab_node_t find; | mnttab_node_t find; | ||||
mnttab_node_t *ret; | mnttab_node_t *ret; | ||||
pthread_mutex_lock(&hdl->libzfs_mnttab_cache_lock); | |||||
find.mtn_mt.mnt_special = (char *)fsname; | find.mtn_mt.mnt_special = (char *)fsname; | ||||
if ((ret = avl_find(&hdl->libzfs_mnttab_cache, (void *)&find, NULL)) | if ((ret = avl_find(&hdl->libzfs_mnttab_cache, (void *)&find, NULL)) | ||||
!= NULL) { | != NULL) { | ||||
avl_remove(&hdl->libzfs_mnttab_cache, ret); | avl_remove(&hdl->libzfs_mnttab_cache, ret); | ||||
free(ret->mtn_mt.mnt_special); | free(ret->mtn_mt.mnt_special); | ||||
free(ret->mtn_mt.mnt_mountp); | free(ret->mtn_mt.mnt_mountp); | ||||
free(ret->mtn_mt.mnt_fstype); | free(ret->mtn_mt.mnt_fstype); | ||||
free(ret->mtn_mt.mnt_mntopts); | free(ret->mtn_mt.mnt_mntopts); | ||||
free(ret); | free(ret); | ||||
} | } | ||||
pthread_mutex_unlock(&hdl->libzfs_mnttab_cache_lock); | |||||
} | } | ||||
int | int | ||||
zfs_spa_version(zfs_handle_t *zhp, int *spa_version) | zfs_spa_version(zfs_handle_t *zhp, int *spa_version) | ||||
{ | { | ||||
zpool_handle_t *zpool_handle = zhp->zpool_hdl; | zpool_handle_t *zpool_handle = zhp->zpool_hdl; | ||||
if (zpool_handle == NULL) | if (zpool_handle == NULL) | ||||
▲ Show 20 Lines • Show All 4,310 Lines • Show Last 20 Lines |