|
Ian Kent |
cc58c1 |
autofs-5.0.6 - add function to delete offset cache entry
|
|
Ian Kent |
cc58c1 |
|
|
Ian Kent |
cc58c1 |
From: Ian Kent <ikent@redhat.com>
|
|
Ian Kent |
cc58c1 |
|
|
Ian Kent |
cc58c1 |
Currently only the entire expanded list of offset cache entries may be
|
|
Ian Kent |
cc58c1 |
removed from the cache. In order to be able to update already expanded
|
|
Ian Kent |
cc58c1 |
multi map offset entries we need to be able to delete them.
|
|
Ian Kent |
cc58c1 |
---
|
|
Ian Kent |
cc58c1 |
|
|
Ian Kent |
cc58c1 |
include/automount.h | 1 +
|
|
Ian Kent |
cc58c1 |
lib/cache.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
|
|
Ian Kent |
cc58c1 |
2 files changed, 48 insertions(+), 0 deletions(-)
|
|
Ian Kent |
cc58c1 |
|
|
Ian Kent |
cc58c1 |
|
|
Ian Kent |
cc58c1 |
diff --git a/include/automount.h b/include/automount.h
|
|
Ian Kent |
cc58c1 |
index e1246e3..40c1975 100644
|
|
Ian Kent |
cc58c1 |
--- a/include/automount.h
|
|
Ian Kent |
cc58c1 |
+++ b/include/automount.h
|
|
Ian Kent |
cc58c1 |
@@ -192,6 +192,7 @@ int cache_add_offset(struct mapent_cache *mc, const char *mkey, const char *key,
|
|
Ian Kent |
cc58c1 |
int cache_set_parents(struct mapent *mm);
|
|
Ian Kent |
cc58c1 |
int cache_update(struct mapent_cache *mc, struct map_source *ms, const char *key, const char *mapent, time_t age);
|
|
Ian Kent |
cc58c1 |
int cache_delete(struct mapent_cache *mc, const char *key);
|
|
Ian Kent |
cc58c1 |
+int cache_delete_offset(struct mapent_cache *mc, const char *key);
|
|
Ian Kent |
cc58c1 |
void cache_multi_readlock(struct mapent *me);
|
|
Ian Kent |
cc58c1 |
void cache_multi_writelock(struct mapent *me);
|
|
Ian Kent |
cc58c1 |
void cache_multi_unlock(struct mapent *me);
|
|
Ian Kent |
cc58c1 |
diff --git a/lib/cache.c b/lib/cache.c
|
|
Ian Kent |
cc58c1 |
index 3464e7d..1489273 100644
|
|
Ian Kent |
cc58c1 |
--- a/lib/cache.c
|
|
Ian Kent |
cc58c1 |
+++ b/lib/cache.c
|
|
Ian Kent |
cc58c1 |
@@ -771,6 +771,53 @@ int cache_update(struct mapent_cache *mc, struct map_source *ms, const char *key
|
|
Ian Kent |
cc58c1 |
return ret;
|
|
Ian Kent |
cc58c1 |
}
|
|
Ian Kent |
cc58c1 |
|
|
Ian Kent |
cc58c1 |
+/* cache_multi_lock of the multi mount owner must be held by caller */
|
|
Ian Kent |
cc58c1 |
+int cache_delete_offset(struct mapent_cache *mc, const char *key)
|
|
Ian Kent |
cc58c1 |
+{
|
|
Ian Kent |
cc58c1 |
+ u_int32_t hashval = hash(key, mc->size);
|
|
Ian Kent |
cc58c1 |
+ struct mapent *me = NULL, *pred;
|
|
Ian Kent |
cc58c1 |
+ int status;
|
|
Ian Kent |
cc58c1 |
+
|
|
Ian Kent |
cc58c1 |
+ me = mc->hash[hashval];
|
|
Ian Kent |
cc58c1 |
+ if (!me)
|
|
Ian Kent |
cc58c1 |
+ return CHE_FAIL;
|
|
Ian Kent |
cc58c1 |
+
|
|
Ian Kent |
cc58c1 |
+ if (strcmp(key, me->key) == 0) {
|
|
Ian Kent |
cc58c1 |
+ if (me->multi && me->multi == me)
|
|
Ian Kent |
cc58c1 |
+ return CHE_FAIL;
|
|
Ian Kent |
cc58c1 |
+ mc->hash[hashval] = me->next;
|
|
Ian Kent |
cc58c1 |
+ goto delete;
|
|
Ian Kent |
cc58c1 |
+ }
|
|
Ian Kent |
cc58c1 |
+
|
|
Ian Kent |
cc58c1 |
+ while (me->next != NULL) {
|
|
Ian Kent |
cc58c1 |
+ pred = me;
|
|
Ian Kent |
cc58c1 |
+ me = me->next;
|
|
Ian Kent |
cc58c1 |
+ if (strcmp(key, me->key) == 0) {
|
|
Ian Kent |
cc58c1 |
+ if (me->multi && me->multi == me)
|
|
Ian Kent |
cc58c1 |
+ return CHE_FAIL;
|
|
Ian Kent |
cc58c1 |
+ pred->next = me->next;
|
|
Ian Kent |
cc58c1 |
+ goto delete;
|
|
Ian Kent |
cc58c1 |
+ }
|
|
Ian Kent |
cc58c1 |
+ }
|
|
Ian Kent |
cc58c1 |
+
|
|
Ian Kent |
cc58c1 |
+ return CHE_FAIL;
|
|
Ian Kent |
cc58c1 |
+
|
|
Ian Kent |
cc58c1 |
+delete:
|
|
Ian Kent |
cc58c1 |
+ status = pthread_rwlock_destroy(&me->multi_rwlock);
|
|
Ian Kent |
cc58c1 |
+ if (status)
|
|
Ian Kent |
cc58c1 |
+ fatal(status);
|
|
Ian Kent |
cc58c1 |
+ list_del(&me->multi_list);
|
|
Ian Kent |
cc58c1 |
+ ino_index_lock(mc);
|
|
Ian Kent |
cc58c1 |
+ list_del(&me->ino_index);
|
|
Ian Kent |
cc58c1 |
+ ino_index_unlock(mc);
|
|
Ian Kent |
cc58c1 |
+ free(me->key);
|
|
Ian Kent |
cc58c1 |
+ if (me->mapent)
|
|
Ian Kent |
cc58c1 |
+ free(me->mapent);
|
|
Ian Kent |
cc58c1 |
+ free(me);
|
|
Ian Kent |
cc58c1 |
+
|
|
Ian Kent |
cc58c1 |
+ return CHE_OK;
|
|
Ian Kent |
cc58c1 |
+}
|
|
Ian Kent |
cc58c1 |
+
|
|
Ian Kent |
cc58c1 |
/* cache must be write locked by caller */
|
|
Ian Kent |
cc58c1 |
int cache_delete(struct mapent_cache *mc, const char *key)
|
|
Ian Kent |
cc58c1 |
{
|