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