summaryrefslogtreecommitdiffstats
path: root/fs/f2fs/dir.c
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk.kim@samsung.com>2013-07-30 04:36:53 +0200
committerJaegeuk Kim <jaegeuk.kim@samsung.com>2013-07-30 08:17:03 +0200
commitcbd56e7d20d7188d62a85aa6986a7b2c8e755ab5 (patch)
tree44962739f9ce15214fc5f0587b2174aae1f032f5 /fs/f2fs/dir.c
parentf2fs: move bio_private allocation out of f2fs_bio_alloc() (diff)
downloadlinux-cbd56e7d20d7188d62a85aa6986a7b2c8e755ab5.tar.xz
linux-cbd56e7d20d7188d62a85aa6986a7b2c8e755ab5.zip
f2fs: fix handling orphan inodes
This patch fixes mishandling of the sbi->n_orphans variable. If users request lots of f2fs_unlink(), check_orphan_space() could be contended. In such the case, sbi->n_orphans can be read incorrectly so that f2fs_unlink() would fall into the wrong state which results in the failure of add_orphan_inode(). So, let's increment sbi->n_orphans virtually prior to the actual orphan inode stuffs. After that, let's release sbi->n_orphans by calling release_orphan_inode or remove_orphan_inode. Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs/f2fs/dir.c')
-rw-r--r--fs/f2fs/dir.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
index d1bb2606b313..384c6daf9a89 100644
--- a/fs/f2fs/dir.c
+++ b/fs/f2fs/dir.c
@@ -572,6 +572,8 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,
if (inode->i_nlink == 0)
add_orphan_inode(sbi, inode->i_ino);
+ else
+ release_orphan_inode(sbi);
}
if (bit_pos == NR_DENTRY_IN_BLOCK) {