mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 04:31:50 +00:00
gfs2: Unstuff before locking page in gfs2_page_mkwrite
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>
This commit is contained in:
parent
0fc3bcd6b6
commit
64090cbe4b
@ -510,30 +510,32 @@ static vm_fault_t gfs2_page_mkwrite(struct vm_fault *vmf)
|
|||||||
goto out_trans_fail;
|
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);
|
lock_page(page);
|
||||||
/* If truncated, we must retry the operation, we may have raced
|
/* If truncated, we must retry the operation, we may have raced
|
||||||
* with the glock demotion code.
|
* with the glock demotion code.
|
||||||
*/
|
*/
|
||||||
if (!PageUptodate(page) || page->mapping != inode->i_mapping) {
|
if (!PageUptodate(page) || page->mapping != inode->i_mapping) {
|
||||||
ret = VM_FAULT_NOPAGE;
|
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);
|
err = gfs2_allocate_page_backing(page, length);
|
||||||
if (err)
|
if (err)
|
||||||
ret = block_page_mkwrite_return(err);
|
ret = block_page_mkwrite_return(err);
|
||||||
|
|
||||||
out_trans_end:
|
out_page_locked:
|
||||||
if (ret != VM_FAULT_LOCKED)
|
if (ret != VM_FAULT_LOCKED)
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
|
out_trans_end:
|
||||||
gfs2_trans_end(sdp);
|
gfs2_trans_end(sdp);
|
||||||
out_trans_fail:
|
out_trans_fail:
|
||||||
gfs2_inplace_release(ip);
|
gfs2_inplace_release(ip);
|
||||||
|
Loading…
Reference in New Issue
Block a user