This fixes concurrent access issues in the function recover_dentry
by locking and locking another the block labeled retry with the
functions f2fs_lock_op/f2fs_unlock_op on a pointer of the
superblock used by the passed inode structure pointer by this

Signed-off-by: Nicholas Krause <xerofo...@gmail.com>
---
 fs/f2fs/recovery.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c
index 24a8c1d..b86ea29 100644
--- a/fs/f2fs/recovery.c
+++ b/fs/f2fs/recovery.c
@@ -70,6 +70,7 @@ static struct fsync_inode_entry *get_fsync_inode(struct 
list_head *head,
 static int recover_dentry(struct inode *inode, struct page *ipage)
 {
        struct f2fs_inode *raw_inode = F2FS_INODE(ipage);
+       struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
        nid_t pino = le32_to_cpu(raw_inode->i_pino);
        struct f2fs_dir_entry *de;
        struct qstr name;
@@ -97,6 +98,7 @@ static int recover_dentry(struct inode *inode, struct page 
*ipage)
                goto out_err;
        }
 retry:
+       f2fs_lock_op(sbi);
        de = f2fs_find_entry(dir, &name, &page);
        if (de && inode->i_ino == le32_to_cpu(de->ino))
                goto out_unmap_put;
@@ -117,6 +119,7 @@ retry:
                }
                f2fs_delete_entry(de, page, dir, einode);
                iput(einode);
+               f2fs_unlock_op(sbi);
                goto retry;
        }
        err = __f2fs_add_link(dir, &name, inode, inode->i_ino, inode->i_mode);
@@ -129,7 +132,8 @@ retry:
                add_dirty_dir_inode(dir);
                set_inode_flag(F2FS_I(dir), FI_DELAY_IPUT);
        }
-
+
+       f2fs_unlock_op(sbi);
        goto out;
 
 out_unmap_put:
-- 
2.1.4


------------------------------------------------------------------------------
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to