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
 {