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,
|
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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue