]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
staging: erofs: remove rcu_read_lock() in erofs_try_to_free_cached_page
authorGao Xiang <gaoxiang25@huawei.com>
Sat, 16 Feb 2019 08:46:50 +0000 (16:46 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Feb 2019 10:20:55 +0000 (11:20 +0100)
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: Gao Xiang <gaoxiang25@huawei.com>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/erofs/unzip_vle.c

index 2b5951f233db9d849b8890cfff64d11d6b556b30..a127d8db76d87c643bbeba19de64bf9030fe4716 100644 (file)
@@ -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,12 +252,11 @@ 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);
+               if (ret) {
+                       ClearPagePrivate(page);
+                       put_page(page);
+               }
        }
        return ret;
 }