f2fs: add global mutex_lock to protect f2fs_stat_list
authormajianpeng <majianpeng@gmail.com>
Mon, 14 Jan 2013 12:08:16 +0000 (20:08 +0800)
committerJaegeuk Kim <jaegeuk.kim@samsung.com>
Tue, 15 Jan 2013 11:18:29 +0000 (20:18 +0900)
commit66af62ce7588736ae65edfdb1c0df597775c4d21
tree40c696804e7d628161889a7505ff164debf83674
parentfa9150a84ca333f68127097c4fa1eda4b3913a22
f2fs: add global mutex_lock to protect f2fs_stat_list

There is an race condition between umounting f2fs and reading f2fs/status, which
results in oops.

Fox example:
Thread A Thread B
umount f2fs  cat f2fs/status

f2fs_destroy_stats() { stat_show() {
 list_for_each_entry_safe(&f2fs_stat_list)
 list_del(&si->stat_list);
 mutex_lock(&si->stat_lock);
 si->sbi = NULL;
 mutex_unlock(&si->stat_lock);
 kfree(sbi->stat_info);
}   mutex_lock(&si->stat_lock) <- si is gone.
 ...
}

Solution with a global lock: f2fs_stat_mutex:
Thread A Thread B
umount f2fs  cat f2fs/status

f2fs_destroy_stats() { stat_show() {
 mutex_lock(&f2fs_stat_mutex);
 list_del(&si->stat_list);
 mutex_unlock(&f2fs_stat_mutex);
 kfree(sbi->stat_info);  mutex_lock(&f2fs_stat_mutex);
}  list_for_each_entry_safe(&f2fs_stat_list)
 ...
 mutex_unlock(&f2fs_stat_mutex);
}

Signed-off-by: Jianpeng Ma <majianpeng@gmail.com>
[jaegeuk.kim@samsung.com: fix typos, description, and remove the existing lock]
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
fs/f2fs/debug.c