f2fs: iput only if whole data blocks are flushed
authorJaegeuk Kim <jaegeuk.kim@samsung.com>
Mon, 27 May 2013 01:32:01 +0000 (10:32 +0900)
committerJaegeuk Kim <jaegeuk.kim@samsung.com>
Tue, 28 May 2013 06:03:05 +0000 (15:03 +0900)
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>
fs/f2fs/checkpoint.c

index 01ddc91..0d3701d 100644 (file)
@@ -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 */