|
|
9a499a |
autofs-5.1.6 - make external mounts use simpler hashtable
|
|
|
9a499a |
|
|
|
9a499a |
From: Ian Kent <raven@themaw.net>
|
|
|
9a499a |
|
|
|
9a499a |
Use the added hashtable implementation for the external mounts
|
|
|
9a499a |
hashtable.
|
|
|
9a499a |
|
|
|
9a499a |
Signed-off-by: Ian Kent <raven@themaw.net>
|
|
|
9a499a |
---
|
|
|
9a499a |
CHANGELOG | 1 +
|
|
|
9a499a |
lib/mounts.c | 49 +++++++++++++++----------------------------------
|
|
|
9a499a |
2 files changed, 16 insertions(+), 34 deletions(-)
|
|
|
9a499a |
|
|
|
9a499a |
--- autofs-5.1.4.orig/CHANGELOG
|
|
|
9a499a |
+++ autofs-5.1.4/CHANGELOG
|
|
|
9a499a |
@@ -120,6 +120,7 @@ xx/xx/2018 autofs-5.1.5
|
|
|
9a499a |
- add hashtable implementation.
|
|
|
9a499a |
- change mountpoint to mp in struct ext_mount.
|
|
|
9a499a |
- make external mounts independent of amd_entry.
|
|
|
9a499a |
+- make external mounts use simpler hashtable.
|
|
|
9a499a |
|
|
|
9a499a |
19/12/2017 autofs-5.1.4
|
|
|
9a499a |
- fix spec file url.
|
|
|
9a499a |
--- autofs-5.1.4.orig/lib/mounts.c
|
|
|
9a499a |
+++ autofs-5.1.4/lib/mounts.c
|
|
|
9a499a |
@@ -29,6 +29,7 @@
|
|
|
9a499a |
#include <libgen.h>
|
|
|
9a499a |
|
|
|
9a499a |
#include "automount.h"
|
|
|
9a499a |
+#include "hashtable.h"
|
|
|
9a499a |
|
|
|
9a499a |
#define MAX_OPTIONS_LEN 80
|
|
|
9a499a |
#define MAX_MNT_NAME_LEN 30
|
|
|
9a499a |
@@ -51,16 +52,15 @@ static const char kver_options_template[
|
|
|
9a499a |
extern size_t detached_thread_stack_size;
|
|
|
9a499a |
static size_t maxgrpbuf = 0;
|
|
|
9a499a |
|
|
|
9a499a |
-#define EXT_MOUNTS_HASH_SIZE 50
|
|
|
9a499a |
+#define EXT_MOUNTS_HASH_BITS 6
|
|
|
9a499a |
|
|
|
9a499a |
struct ext_mount {
|
|
|
9a499a |
unsigned int ref;
|
|
|
9a499a |
char *mp;
|
|
|
9a499a |
char *umount;
|
|
|
9a499a |
- struct list_head mount;
|
|
|
9a499a |
+ struct hlist_node mount;
|
|
|
9a499a |
};
|
|
|
9a499a |
-static struct list_head ext_mounts_hash[EXT_MOUNTS_HASH_SIZE];
|
|
|
9a499a |
-static unsigned int ext_mounts_hash_init_done = 0;
|
|
|
9a499a |
+static DEFINE_HASHTABLE(ext_mounts_hash, EXT_MOUNTS_HASH_BITS);
|
|
|
9a499a |
static pthread_mutex_t ext_mount_hash_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
|
9a499a |
|
|
|
9a499a |
unsigned int linux_version_code(void)
|
|
|
9a499a |
@@ -734,38 +734,22 @@ char *make_mnt_name_string(char *path)
|
|
|
9a499a |
return mnt_name;
|
|
|
9a499a |
}
|
|
|
9a499a |
|
|
|
9a499a |
-static void ext_mounts_hash_init(void)
|
|
|
9a499a |
-{
|
|
|
9a499a |
- int i;
|
|
|
9a499a |
- for (i = 0; i < EXT_MOUNTS_HASH_SIZE; i++)
|
|
|
9a499a |
- INIT_LIST_HEAD(&ext_mounts_hash[i]);
|
|
|
9a499a |
- ext_mounts_hash_init_done = 1;
|
|
|
9a499a |
-}
|
|
|
9a499a |
-
|
|
|
9a499a |
static struct ext_mount *ext_mount_lookup(const char *mp)
|
|
|
9a499a |
{
|
|
|
9a499a |
- u_int32_t hval = hash(mp, EXT_MOUNTS_HASH_SIZE);
|
|
|
9a499a |
- struct list_head *p, *head;
|
|
|
9a499a |
-
|
|
|
9a499a |
- if (!ext_mounts_hash_init_done)
|
|
|
9a499a |
- ext_mounts_hash_init();
|
|
|
9a499a |
-
|
|
|
9a499a |
- if (list_empty(&ext_mounts_hash[hval]))
|
|
|
9a499a |
- return NULL;
|
|
|
9a499a |
+ uint32_t hval = hash(mp, HASH_SIZE(ext_mounts_hash));
|
|
|
9a499a |
+ struct ext_mount *this;
|
|
|
9a499a |
|
|
|
9a499a |
- head = &ext_mounts_hash[hval];
|
|
|
9a499a |
- list_for_each(p, head) {
|
|
|
9a499a |
- struct ext_mount *this = list_entry(p, struct ext_mount, mount);
|
|
|
9a499a |
+ hlist_for_each_entry(this, &ext_mounts_hash[hval], mount) {
|
|
|
9a499a |
if (!strcmp(this->mp, mp))
|
|
|
9a499a |
return this;
|
|
|
9a499a |
}
|
|
|
9a499a |
+
|
|
|
9a499a |
return NULL;
|
|
|
9a499a |
}
|
|
|
9a499a |
|
|
|
9a499a |
int ext_mount_add(const char *path, const char *umount)
|
|
|
9a499a |
{
|
|
|
9a499a |
struct ext_mount *em;
|
|
|
9a499a |
- u_int32_t hval;
|
|
|
9a499a |
int ret = 0;
|
|
|
9a499a |
|
|
|
9a499a |
pthread_mutex_lock(&ext_mount_hash_mutex);
|
|
|
9a499a |
@@ -796,10 +780,9 @@ int ext_mount_add(const char *path, cons
|
|
|
9a499a |
}
|
|
|
9a499a |
}
|
|
|
9a499a |
em->ref = 1;
|
|
|
9a499a |
- INIT_LIST_HEAD(&em->mount);
|
|
|
9a499a |
+ INIT_HLIST_NODE(&em->mount);
|
|
|
9a499a |
|
|
|
9a499a |
- hval = hash(path, EXT_MOUNTS_HASH_SIZE);
|
|
|
9a499a |
- list_add_tail(&em->mount, &ext_mounts_hash[hval]);
|
|
|
9a499a |
+ hash_add_str(ext_mounts_hash, &em->mount, em->mp);
|
|
|
9a499a |
|
|
|
9a499a |
ret = 1;
|
|
|
9a499a |
done:
|
|
|
9a499a |
@@ -822,13 +805,11 @@ int ext_mount_remove(const char *path)
|
|
|
9a499a |
if (em->ref)
|
|
|
9a499a |
goto done;
|
|
|
9a499a |
else {
|
|
|
9a499a |
- list_del_init(&em->mount);
|
|
|
9a499a |
- if (list_empty(&em->mount)) {
|
|
|
9a499a |
- free(em->mp);
|
|
|
9a499a |
- if (em->umount)
|
|
|
9a499a |
- free(em->umount);
|
|
|
9a499a |
- free(em);
|
|
|
9a499a |
- }
|
|
|
9a499a |
+ hlist_del_init(&em->mount);
|
|
|
9a499a |
+ free(em->mp);
|
|
|
9a499a |
+ if (em->umount)
|
|
|
9a499a |
+ free(em->umount);
|
|
|
9a499a |
+ free(em);
|
|
|
9a499a |
ret = 1;
|
|
|
9a499a |
}
|
|
|
9a499a |
done:
|