OSDN Git Service

fs/mbcache: fix mb_cache_lru_list corruption
authorSahitya Tummala <stummala@codeaurora.org>
Mon, 5 Jun 2017 10:40:31 +0000 (16:10 +0530)
committerSahitya Tummala <stummala@codeaurora.org>
Mon, 12 Jun 2017 07:41:12 +0000 (13:11 +0530)
commit33b30b124fde308d6192a55df6f176f1c36a79ce
treebdd4e8bdfda235d6e4c9ce20f14eadf2fe215083
parentc1a2472056c800ff46e0ac21a4b67c179a570ad0
fs/mbcache: fix mb_cache_lru_list corruption

With the recent 'commit d07d314e7d1d ("fs/mbcache: fix use after
free issue in mb_cache_shrink_scan()")', the ce entry is deleted
from mbcache list after ce->e_refcnt incremented under global
spinlock mb_cache_spinlock. If __mb_cache_entry_release(), is waiting
for mb_cache_spinlock at the same time, to add the same ce to
mb_cache_lru_list and if it gets the lock after mb_cache_entry_get()
deleted it, then it corrupts the list, as that element will be freed
immediately after mb_cache_entry_get(). When this list is accessed next
time for deleting/adding another ce, we see list corruption issue.

Fix this by synchronizing these two contexts with mb_cache_spinlock and
evaluating the conditions(ce->e_refcnt) in __mb_cache_entry_release()
under the global lock before adding ce to mb_cache_lru_list.

Change-Id: I3e20fb4fa163755126e30be7aeca747d74215ed2
Signed-off-by: Sahitya Tummala <stummala@codeaurora.org>
fs/mbcache.c