Revert "f2fs: fix to avoid deadlock of atomic file operations"
This reverts commit f3ac182210162c7e76997a8566a7f9869349f3d8.
This commit is contained in:
parent
d5aa6ed6b6
commit
2599cc3d72
1 changed files with 12 additions and 31 deletions
|
@ -215,8 +215,7 @@ void f2fs_register_inmem_page(struct inode *inode, struct page *page)
|
|||
}
|
||||
|
||||
static int __revoke_inmem_pages(struct inode *inode,
|
||||
struct list_head *head, bool drop, bool recover,
|
||||
bool trylock)
|
||||
struct list_head *head, bool drop, bool recover)
|
||||
{
|
||||
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
|
||||
struct inmem_pages *cur, *tmp;
|
||||
|
@ -228,16 +227,7 @@ static int __revoke_inmem_pages(struct inode *inode,
|
|||
if (drop)
|
||||
trace_f2fs_commit_inmem_page(page, INMEM_DROP);
|
||||
|
||||
if (trylock) {
|
||||
/*
|
||||
* to avoid deadlock in between page lock and
|
||||
* inmem_lock.
|
||||
*/
|
||||
if (!trylock_page(page))
|
||||
continue;
|
||||
} else {
|
||||
lock_page(page);
|
||||
}
|
||||
lock_page(page);
|
||||
|
||||
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_inode_info *fi = F2FS_I(inode);
|
||||
|
||||
while (!list_empty(&fi->inmem_pages)) {
|
||||
mutex_lock(&fi->inmem_lock);
|
||||
__revoke_inmem_pages(inode, &fi->inmem_pages,
|
||||
true, false, true);
|
||||
|
||||
if (list_empty(&fi->inmem_pages)) {
|
||||
spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
|
||||
if (!list_empty(&fi->inmem_ilist))
|
||||
list_del_init(&fi->inmem_ilist);
|
||||
spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
|
||||
mutex_unlock(&fi->inmem_lock);
|
||||
}
|
||||
}
|
||||
mutex_lock(&fi->inmem_lock);
|
||||
__revoke_inmem_pages(inode, &fi->inmem_pages, true, false);
|
||||
spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
|
||||
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);
|
||||
fi->i_gc_failures[GC_FAILURE_ATOMIC] = 0;
|
||||
|
@ -445,15 +429,12 @@ retry:
|
|||
* recovery or rewrite & commit last transaction. For other
|
||||
* error number, revoking was done by filesystem itself.
|
||||
*/
|
||||
err = __revoke_inmem_pages(inode, &revoke_list,
|
||||
false, true, false);
|
||||
err = __revoke_inmem_pages(inode, &revoke_list, false, true);
|
||||
|
||||
/* drop all uncommitted pages */
|
||||
__revoke_inmem_pages(inode, &fi->inmem_pages,
|
||||
true, false, false);
|
||||
__revoke_inmem_pages(inode, &fi->inmem_pages, true, false);
|
||||
} else {
|
||||
__revoke_inmem_pages(inode, &revoke_list,
|
||||
false, false, false);
|
||||
__revoke_inmem_pages(inode, &revoke_list, false, false);
|
||||
}
|
||||
|
||||
return err;
|
||||
|
|
Loading…
Add table
Reference in a new issue