aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk.kim@samsung.com>2013-10-08 10:19:28 +0900
committerAndreas Blaesius <skate4life@gmx.de>2016-06-05 21:20:43 +0200
commitb7ce26dea6096cb0c0a6c26d463023e79ef60d7b (patch)
tree654a8d1ed78af9ef9963e21c8ebf717524e9ab99
parent348ae20af5a1931bccf999a06c858a6d40b0dce2 (diff)
downloadkernel_samsung_espresso10-b7ce26dea6096cb0c0a6c26d463023e79ef60d7b.zip
kernel_samsung_espresso10-b7ce26dea6096cb0c0a6c26d463023e79ef60d7b.tar.gz
kernel_samsung_espresso10-b7ce26dea6096cb0c0a6c26d463023e79ef60d7b.tar.bz2
f2fs: fix writing incorrect orphan blocks
Previously, there was a erroneous scenario like below. thread 1: thread 2: f2fs_unlink - acquire_orphan_inode : sbi->n_orphans++ write_checkpoint - block_operations : f2fs_lock_all - do_checkpoint : write orphan blocks with sbi->n_orphans - unblock_operations - f2fs_lock_op - release_orphan_inode - f2fs_unlock_op During the checkpoint by thread 2, f2fs stores a wrong orphan block according to the wrong sbi->n_orphans. To avoid this, simply we should make cover acquire_orphan_inode too with f2fs_lock_op. Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
-rw-r--r--fs/f2fs/namei.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
index 0480067..7786e6c 100644
--- a/fs/f2fs/namei.c
+++ b/fs/f2fs/namei.c
@@ -228,14 +228,14 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
if (!de)
goto fail;
+ f2fs_lock_op(sbi);
err = acquire_orphan_inode(sbi);
if (err) {
+ f2fs_unlock_op(sbi);
kunmap(page);
f2fs_put_page(page, 0);
goto fail;
}
-
- f2fs_lock_op(sbi);
f2fs_delete_entry(de, page, inode);
f2fs_unlock_op(sbi);