Revert "f2fs: fix to avoid deadlock of atomic file operations"

This reverts commit f3ac182210162c7e76997a8566a7f9869349f3d8.
This commit is contained in:
Jaegeuk Kim 2019-02-26 09:47:34 -08:00
parent d5aa6ed6b6
commit 2599cc3d72

View file

@ -215,8 +215,7 @@ void f2fs_register_inmem_page(struct inode *inode, struct page *page)
} }
static int __revoke_inmem_pages(struct inode *inode, static int __revoke_inmem_pages(struct inode *inode,
struct list_head *head, bool drop, bool recover, struct list_head *head, bool drop, bool recover)
bool trylock)
{ {
struct f2fs_sb_info *sbi = F2FS_I_SB(inode); struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
struct inmem_pages *cur, *tmp; struct inmem_pages *cur, *tmp;
@ -228,16 +227,7 @@ static int __revoke_inmem_pages(struct inode *inode,
if (drop) if (drop)
trace_f2fs_commit_inmem_page(page, INMEM_DROP); trace_f2fs_commit_inmem_page(page, INMEM_DROP);
if (trylock) { lock_page(page);
/*
* to avoid deadlock in between page lock and
* inmem_lock.
*/
if (!trylock_page(page))
continue;
} else {
lock_page(page);
}
f2fs_wait_on_page_writeback(page, DATA, true, true); f2fs_wait_on_page_writeback(page, DATA, true, true);
@ -328,19 +318,13 @@ void f2fs_drop_inmem_pages(struct inode *inode)
struct f2fs_sb_info *sbi = F2FS_I_SB(inode); struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
struct f2fs_inode_info *fi = F2FS_I(inode); struct f2fs_inode_info *fi = F2FS_I(inode);
while (!list_empty(&fi->inmem_pages)) { mutex_lock(&fi->inmem_lock);
mutex_lock(&fi->inmem_lock); __revoke_inmem_pages(inode, &fi->inmem_pages, true, false);
__revoke_inmem_pages(inode, &fi->inmem_pages, spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
true, false, true); if (!list_empty(&fi->inmem_ilist))
list_del_init(&fi->inmem_ilist);
if (list_empty(&fi->inmem_pages)) { spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
spin_lock(&sbi->inode_lock[ATOMIC_FILE]); mutex_unlock(&fi->inmem_lock);
if (!list_empty(&fi->inmem_ilist))
list_del_init(&fi->inmem_ilist);
spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
mutex_unlock(&fi->inmem_lock);
}
}
clear_inode_flag(inode, FI_ATOMIC_FILE); clear_inode_flag(inode, FI_ATOMIC_FILE);
fi->i_gc_failures[GC_FAILURE_ATOMIC] = 0; fi->i_gc_failures[GC_FAILURE_ATOMIC] = 0;
@ -445,15 +429,12 @@ retry:
* recovery or rewrite & commit last transaction. For other * recovery or rewrite & commit last transaction. For other
* error number, revoking was done by filesystem itself. * error number, revoking was done by filesystem itself.
*/ */
err = __revoke_inmem_pages(inode, &revoke_list, err = __revoke_inmem_pages(inode, &revoke_list, false, true);
false, true, false);
/* drop all uncommitted pages */ /* drop all uncommitted pages */
__revoke_inmem_pages(inode, &fi->inmem_pages, __revoke_inmem_pages(inode, &fi->inmem_pages, true, false);
true, false, false);
} else { } else {
__revoke_inmem_pages(inode, &revoke_list, __revoke_inmem_pages(inode, &revoke_list, false, false);
false, false, false);
} }
return err; return err;