mirror of https://gitee.com/openkylin/linux.git
NFS: Work correctly with single-page ->writepage() calls
Ensure that we always initiate flushing of data before we exit a single-page ->writepage() call. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
22905f775d
commit
abd3e641d5
|
@ -232,19 +232,16 @@ static int nfs_writepage_async(struct nfs_open_context *ctx,
|
||||||
unsigned int offset, unsigned int count)
|
unsigned int offset, unsigned int count)
|
||||||
{
|
{
|
||||||
struct nfs_page *req;
|
struct nfs_page *req;
|
||||||
int status;
|
|
||||||
|
|
||||||
req = nfs_update_request(ctx, inode, page, offset, count);
|
req = nfs_update_request(ctx, inode, page, offset, count);
|
||||||
status = (IS_ERR(req)) ? PTR_ERR(req) : 0;
|
if (IS_ERR(req))
|
||||||
if (status < 0)
|
return PTR_ERR(req);
|
||||||
goto out;
|
|
||||||
/* Update file length */
|
/* Update file length */
|
||||||
nfs_grow_file(page, offset, count);
|
nfs_grow_file(page, offset, count);
|
||||||
/* Set the PG_uptodate flag? */
|
/* Set the PG_uptodate flag? */
|
||||||
nfs_mark_uptodate(page, offset, count);
|
nfs_mark_uptodate(page, offset, count);
|
||||||
nfs_unlock_request(req);
|
nfs_unlock_request(req);
|
||||||
out:
|
return 0;
|
||||||
return status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wb_priority(struct writeback_control *wbc)
|
static int wb_priority(struct writeback_control *wbc)
|
||||||
|
@ -304,11 +301,8 @@ int nfs_writepage(struct page *page, struct writeback_control *wbc)
|
||||||
lock_kernel();
|
lock_kernel();
|
||||||
if (!IS_SYNC(inode) && inode_referenced) {
|
if (!IS_SYNC(inode) && inode_referenced) {
|
||||||
err = nfs_writepage_async(ctx, inode, page, 0, offset);
|
err = nfs_writepage_async(ctx, inode, page, 0, offset);
|
||||||
if (err >= 0) {
|
if (!wbc->for_writepages)
|
||||||
err = 0;
|
nfs_flush_inode(inode, 0, 0, wb_priority(wbc));
|
||||||
if (wbc->for_reclaim)
|
|
||||||
nfs_flush_inode(inode, 0, 0, FLUSH_STABLE);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
err = nfs_writepage_sync(ctx, inode, page, 0,
|
err = nfs_writepage_sync(ctx, inode, page, 0,
|
||||||
offset, priority);
|
offset, priority);
|
||||||
|
|
Loading…
Reference in New Issue