gfs2: Unstuff before locking page in gfs2_page_mkwrite
authorAndreas Gruenbacher <agruenba@redhat.com>
Thu, 17 Jun 2021 21:04:14 +0000 (23:04 +0200)
committerAndreas Gruenbacher <agruenba@redhat.com>
Tue, 29 Jun 2021 08:56:51 +0000 (10:56 +0200)
In gfs2_page_mkwrite, unstuff inodes before locking the page.  That
way, we won't have to pass in the locked page to gfs2_unstuff_inode,
and gfs2_unstuff_inode can look up and lock the page itself.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/file.c

index cf16d61f46ec359f26966914dfbe8b083c890975..4a14616b2c0ace84b9846699295e205e64dac9bd 100644 (file)
@@ -510,30 +510,32 @@ static vm_fault_t gfs2_page_mkwrite(struct vm_fault *vmf)
                goto out_trans_fail;
        }
 
+       /* Unstuff, if required, and allocate backing blocks for page */
+       if (gfs2_is_stuffed(ip)) {
+               err = gfs2_unstuff_dinode(ip, NULL);
+               if (err) {
+                       ret = block_page_mkwrite_return(err);
+                       goto out_trans_end;
+               }
+       }
+
        lock_page(page);
        /* If truncated, we must retry the operation, we may have raced
         * with the glock demotion code.
         */
        if (!PageUptodate(page) || page->mapping != inode->i_mapping) {
                ret = VM_FAULT_NOPAGE;
-               goto out_trans_end;
+               goto out_page_locked;
        }
 
-       /* Unstuff, if required, and allocate backing blocks for page */
-       if (gfs2_is_stuffed(ip)) {
-               err = gfs2_unstuff_dinode(ip, page);
-               if (err) {
-                       ret = block_page_mkwrite_return(err);
-                       goto out_trans_end;
-               }
-       }
        err = gfs2_allocate_page_backing(page, length);
        if (err)
                ret = block_page_mkwrite_return(err);
 
-out_trans_end:
+out_page_locked:
        if (ret != VM_FAULT_LOCKED)
                unlock_page(page);
+out_trans_end:
        gfs2_trans_end(sdp);
 out_trans_fail:
        gfs2_inplace_release(ip);