Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d34a48c5 authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

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

This reverts commit f3ac182210162c7e76997a8566a7f9869349f3d8.
parent cd1d2b21
Loading
Loading
Loading
Loading
+12 −31
Original line number Diff line number Diff line
@@ -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);
		}

		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)) {
	__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 @@ static int __f2fs_commit_inmem_pages(struct inode *inode)
		 * 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;