Commit 047d4abc authored by Gao Xiang's avatar Gao Xiang Committed by Greg Kroah-Hartman
Browse files

staging: erofs: remove rcu_read_lock() in erofs_try_to_free_cached_page



page_private(page) cannot be changed if page lock is taken.

Besides, the corresponding workgroup won't be freed
if the page is already protected by page lock, therefore
no need to take rcu read lock.

Signed-off-by: default avatarGao Xiang <gaoxiang25@huawei.com>
Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 62dc4597
Loading
Loading
Loading
Loading
+5 −11
Original line number Diff line number Diff line
@@ -238,14 +238,9 @@ int erofs_try_to_free_cached_page(struct address_space *mapping,
{
	struct erofs_sb_info *const sbi = EROFS_SB(mapping->host->i_sb);
	const unsigned int clusterpages = erofs_clusterpages(sbi);

	struct z_erofs_vle_workgroup *grp;
	struct z_erofs_vle_workgroup *const grp = (void *)page_private(page);
	int ret = 0;	/* 0 - busy */

	/* prevent the workgroup from being freed */
	rcu_read_lock();
	grp = (void *)page_private(page);

	if (erofs_workgroup_try_to_freeze(&grp->obj, 1)) {
		unsigned int i;

@@ -257,13 +252,12 @@ int erofs_try_to_free_cached_page(struct address_space *mapping,
			}
		}
		erofs_workgroup_unfreeze(&grp->obj, 1);
	}
	rcu_read_unlock();

		if (ret) {
			ClearPagePrivate(page);
			put_page(page);
		}
	}
	return ret;
}
#else