Messages in this thread Patch in this message | | | From | Jaegeuk Kim <> | Subject | [PATCH] f2fs: avoid race condition for shinker count | Date | Mon, 9 Nov 2020 09:00:12 -0800 |
| |
Light reported sometimes shinker gets nat_cnt < dirty_nat_cnt resulting in wrong do_shinker work. Basically the two counts should not happen like that.
So, I suspect this race condtion where: - f2fs_try_to_free_nats __flush_nat_entry_set nat_cnt=2, dirty_nat_cnt=2 __clear_nat_cache_dirty spin_lock(nat_list_lock) list_move() spin_unlock(nat_list_lock) spin_lock(nat_list_lock) list_del() spin_unlock(nat_list_lock) nat_cnt=1, dirty_nat_cnt=2 nat_cnt=1, dirty_nat_cnt=1
Reported-by: Light Hsieh <Light.Hsieh@mediatek.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> --- fs/f2fs/node.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 42394de6c7eb..e8ec65e40f06 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -269,11 +269,10 @@ static void __clear_nat_cache_dirty(struct f2fs_nm_info *nm_i, { spin_lock(&nm_i->nat_list_lock); list_move_tail(&ne->list, &nm_i->nat_entries); - spin_unlock(&nm_i->nat_list_lock); - set_nat_flag(ne, IS_DIRTY, false); set->entry_cnt--; nm_i->dirty_nat_cnt--; + spin_unlock(&nm_i->nat_list_lock); } static unsigned int __gang_lookup_nat_set(struct f2fs_nm_info *nm_i, -- 2.29.2.222.g5d2a92d10f8-goog
| |