diff options
author | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-10-08 10:19:28 +0900 |
---|---|---|
committer | Andreas Blaesius <skate4life@gmx.de> | 2016-06-05 21:20:43 +0200 |
commit | b7ce26dea6096cb0c0a6c26d463023e79ef60d7b (patch) | |
tree | 654a8d1ed78af9ef9963e21c8ebf717524e9ab99 | |
parent | 348ae20af5a1931bccf999a06c858a6d40b0dce2 (diff) | |
download | kernel_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.c | 4 |
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); |