__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>
{
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;
}
}
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);
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