diff options
author | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-07-30 04:36:53 +0200 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-07-30 08:17:03 +0200 |
commit | cbd56e7d20d7188d62a85aa6986a7b2c8e755ab5 (patch) | |
tree | 44962739f9ce15214fc5f0587b2174aae1f032f5 /fs/f2fs/dir.c | |
parent | f2fs: move bio_private allocation out of f2fs_bio_alloc() (diff) | |
download | linux-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.c | 2 |
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) { |