Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit abd3e641 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

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: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 22905f77
Loading
Loading
Loading
Loading
+5 −11
Original line number Original line Diff line number Diff line
@@ -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);