From c59baf3ff10beca9841bc8aae211af120ab913dc Mon Sep 17 00:00:00 2001 From: Lai Siyao Date: Tue, 10 Feb 2015 21:44:44 +0800 Subject: [PATCH] LU-6222 statahead: add to list before make ready __sa_make_ready() set entry ready before adding to list, so that revalidate_statahead_dentry()->sa_kill() may free an entry which is not in any list yet. Signed-off-by: Lai Siyao Change-Id: I0b5f7200fb74c88450133d66bf7bf38d9355036f Reviewed-on: http://review.whamcloud.com/13708 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Fan Yong Reviewed-by: Bobi Jam Reviewed-by: Oleg Drokin --- lustre/llite/statahead.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/lustre/llite/statahead.c b/lustre/llite/statahead.c index 756ae36..c911bdb 100644 --- a/lustre/llite/statahead.c +++ b/lustre/llite/statahead.c @@ -312,12 +312,11 @@ __sa_make_ready(struct ll_statahead_info *sai, struct sa_entry *entry, int ret) { struct sa_entry *se; struct list_head *pos = &sai->sai_entries; + __u64 index = entry->se_index; LASSERT(!sa_ready(entry)); LASSERT(list_empty(&entry->se_list)); - entry->se_state = ret < 0 ? SA_ENTRY_INVA : SA_ENTRY_SUCC; - list_for_each_entry_reverse(se, &sai->sai_entries, se_list) { if (se->se_index < entry->se_index) { pos = &se->se_list; @@ -325,8 +324,9 @@ __sa_make_ready(struct ll_statahead_info *sai, struct sa_entry *entry, int ret) } } list_add(&entry->se_list, pos); + entry->se_state = ret < 0 ? SA_ENTRY_INVA : SA_ENTRY_SUCC; - return (entry->se_index == sai->sai_index_wait); + return (index == sai->sai_index_wait); } /* @@ -1481,10 +1481,7 @@ static int revalidate_statahead_dentry(struct inode *dir, sai->sai_index_wait = entry->se_index; lwi = LWI_TIMEOUT_INTR(cfs_time_seconds(30), NULL, LWI_ON_SIGNAL_NOOP, NULL); - rc = l_wait_event(sai->sai_waitq, - sa_ready(entry) || - thread_is_stopped(&sai->sai_thread), - &lwi); + rc = l_wait_event(sai->sai_waitq, sa_ready(entry), &lwi); if (rc < 0) { /* * entry may not be ready, so it may be used by inflight -- 1.8.3.1