Whamcloud - gitweb
LU-6222 statahead: add to list before make ready 08/13708/2
authorLai Siyao <lai.siyao@intel.com>
Tue, 10 Feb 2015 13:44:44 +0000 (21:44 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Fri, 13 Feb 2015 00:54:37 +0000 (00:54 +0000)
__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 <lai.siyao@intel.com>
Change-Id: I0b5f7200fb74c88450133d66bf7bf38d9355036f
Reviewed-on: http://review.whamcloud.com/13708
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/llite/statahead.c

index 756ae36..c911bdb 100644 (file)
@@ -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;
 {
        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));
 
 
        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;
        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);
                }
        }
        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);
                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
                if (rc < 0) {
                        /*
                         * entry may not be ready, so it may be used by inflight