From 193730f803f7be50992c5e4e89ef28962472aa86 Mon Sep 17 00:00:00 2001 From: ericm Date: Thu, 5 May 2005 05:51:17 +0000 Subject: [PATCH] fix upcall cache: don't make acquiring entry expired too soon. b=6244 --- lustre/sec/upcall_cache.c | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/lustre/sec/upcall_cache.c b/lustre/sec/upcall_cache.c index 059fc61..c3b0dbb 100644 --- a/lustre/sec/upcall_cache.c +++ b/lustre/sec/upcall_cache.c @@ -68,7 +68,7 @@ static void free_entry(struct upcall_cache_entry *entry) LASSERT(cache->free_entry); LASSERT(atomic_read(&entry->ue_refcount) == 0); - CDEBUG(D_OTHER, "destroy %s entry %p for key "LPU64"\n", + CDEBUG(D_SEC, "destroy %s entry %p for key "LPU64"\n", cache->uc_name, entry, entry->ue_key); list_del(&entry->ue_hash); @@ -100,14 +100,22 @@ static inline int refresh_entry(struct upcall_cache_entry *entry) static int check_unlink_entry(struct upcall_cache_entry *entry) { + /* upcall will be issued upon new entries immediately + * after they are created + */ + LASSERT(!UC_CACHE_IS_NEW(entry)); + if (UC_CACHE_IS_VALID(entry) && time_before(get_seconds(), entry->ue_expire)) return 0; - if (UC_CACHE_IS_ACQUIRING(entry) && - time_after(get_seconds(), entry->ue_acquire_expire)) { - UC_CACHE_SET_EXPIRED(entry); - wake_up_all(&entry->ue_waitq); + if (UC_CACHE_IS_ACQUIRING(entry)) { + if (time_before(get_seconds(), entry->ue_acquire_expire)) + return 0; + else { + UC_CACHE_SET_EXPIRED(entry); + wake_up_all(&entry->ue_waitq); + } } else if (!UC_CACHE_IS_INVALID(entry)) { UC_CACHE_SET_EXPIRED(entry); } @@ -313,6 +321,25 @@ int upcall_cache_downcall(struct upcall_cache *cache, __u64 key, void *args) RETURN(-EINVAL); } + if (!UC_CACHE_IS_ACQUIRING(entry)) { + if (UC_CACHE_IS_VALID(entry)) { + /* This should not happen, just give a warning + * at this moment. + */ + CWARN("entry %p(key "LPU64", ac %ld, ex %ld): " + "already valid???\n", entry, entry->ue_key, + entry->ue_acquire_expire, entry->ue_expire); + GOTO(out, rc = 0); + } + + CWARN("stale entry %p: cur %lu, key "LPU64", ref %d, " + "fl %u, ac %ld, ex %ld\n", + entry, get_seconds(), entry->ue_key, + atomic_read(&entry->ue_refcount), entry->ue_flags, + entry->ue_acquire_expire, entry->ue_expire); + GOTO(out, rc = -EINVAL); + } + if (!UC_CACHE_IS_ACQUIRING(entry) || UC_CACHE_IS_INVALID(entry) || UC_CACHE_IS_EXPIRED(entry)) { @@ -341,7 +368,7 @@ int upcall_cache_downcall(struct upcall_cache *cache, __u64 key, void *args) } UC_CACHE_SET_VALID(entry); - CDEBUG(D_OTHER, "create ucache entry %p(key "LPU64")\n", + CDEBUG(D_SEC, "create ucache entry %p(key "LPU64")\n", entry, entry->ue_key); out: wake_up_all(&entry->ue_waitq); -- 1.8.3.1