summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk.kim@samsung.com>2013-05-27 01:32:01 (GMT)
committerJaegeuk Kim <jaegeuk.kim@samsung.com>2013-05-28 06:03:05 (GMT)
commit3b10b1fd2b6bc82eeb346ff6a6621d065908ea6d (patch)
treed29a8041d0f71158e7a0a453e710216d73a8feaa
parent7a267f8d7463346a139e49c8beac1b8bfe32ef97 (diff)
downloadlinux-fsl-qoriq-3b10b1fd2b6bc82eeb346ff6a6621d065908ea6d.tar.xz
f2fs: iput only if whole data blocks are flushed
If there remains some unwritten blocks from the recovery, we should not call iput on that directory inode. Otherwise, we can loose some dentry blocks after the recovery. Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
-rw-r--r--fs/f2fs/checkpoint.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
index 01ddc91..0d3701d 100644
--- a/fs/f2fs/checkpoint.c
+++ b/fs/f2fs/checkpoint.c
@@ -501,8 +501,10 @@ void remove_dirty_dir_inode(struct inode *inode)
return;
spin_lock(&sbi->dir_inode_lock);
- if (atomic_read(&F2FS_I(inode)->dirty_dents))
- goto out;
+ if (atomic_read(&F2FS_I(inode)->dirty_dents)) {
+ spin_unlock(&sbi->dir_inode_lock);
+ return;
+ }
list_for_each(this, head) {
struct dir_inode_entry *entry;
@@ -516,7 +518,6 @@ void remove_dirty_dir_inode(struct inode *inode)
break;
}
}
-out:
spin_unlock(&sbi->dir_inode_lock);
/* Only from the recovery routine */