2010-11-18 10:36:48

by Arun R Bharadwaj

[permalink] [raw]
Subject: [PATCH][BUG]: Pure nfs client performance using odirect.

Pure nfs client performance using odirect.

When an application opens a file with O_DIRECT flag, if the size of
the data that is written is equal to wsize, the client sends a
WRITE RPC with stable flag set to UNSTABLE followed by a single
COMMIT RPC rather than sending a single WRITE RPC with the stable
flag set to FILE_SYNC. This a bug.

Patch to fix this.

Signed-off-by: Arun R Bharadwaj <[email protected]>

Index: linux-2.6.36-rc7/fs/nfs/direct.c
===================================================================
--- linux-2.6.36-rc7.orig/fs/nfs/direct.c 2010-11-18 15:53:15.904972002 +0530
+++ linux-2.6.36-rc7/fs/nfs/direct.c 2010-11-18 15:54:01.184972001 +0530
@@ -867,7 +867,7 @@
goto out;
nfs_alloc_commit_data(dreq);

- if (dreq->commit_data == NULL || count < wsize)
+ if (dreq->commit_data == NULL || count <= wsize)
sync = NFS_FILE_SYNC;

dreq->inode = inode;


2010-11-18 15:53:16

by Chuck Lever III

[permalink] [raw]
Subject: Re: [PATCH][BUG]: Pure nfs client performance using odirect.


On Nov 18, 2010, at 5:36 AM, Arun R Bharadwaj wrote:

> Pure nfs client performance using odirect.
>
> When an application opens a file with O_DIRECT flag, if the size of
> the data that is written is equal to wsize, the client sends a
> WRITE RPC with stable flag set to UNSTABLE followed by a single
> COMMIT RPC rather than sending a single WRITE RPC with the stable
> flag set to FILE_SYNC. This a bug.
>
> Patch to fix this.
>
> Signed-off-by: Arun R Bharadwaj <[email protected]>
>
> Index: linux-2.6.36-rc7/fs/nfs/direct.c
> ===================================================================
> --- linux-2.6.36-rc7.orig/fs/nfs/direct.c 2010-11-18 15:53:15.904972002 +0530
> +++ linux-2.6.36-rc7/fs/nfs/direct.c 2010-11-18 15:54:01.184972001 +0530
> @@ -867,7 +867,7 @@
> goto out;
> nfs_alloc_commit_data(dreq);
>
> - if (dreq->commit_data == NULL || count < wsize)
> + if (dreq->commit_data == NULL || count <= wsize)
> sync = NFS_FILE_SYNC;
>
> dreq->inode = inode;

This looks reasonable, though I haven't looked closely at the surrounding code. It's probably been in the code for a very long time. I'm surprised no-one caught it sooner.

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com





2010-12-05 12:50:56

by Jeff Layton

[permalink] [raw]
Subject: Re: [PATCH][BUG]: Pure nfs client performance using odirect.

On Thu, 18 Nov 2010 16:06:43 +0530
Arun R Bharadwaj <[email protected]> wrote:

> Pure nfs client performance using odirect.
>
> When an application opens a file with O_DIRECT flag, if the size of
> the data that is written is equal to wsize, the client sends a
> WRITE RPC with stable flag set to UNSTABLE followed by a single
> COMMIT RPC rather than sending a single WRITE RPC with the stable
> flag set to FILE_SYNC. This a bug.
>
> Patch to fix this.
>
> Signed-off-by: Arun R Bharadwaj <[email protected]>
>
> Index: linux-2.6.36-rc7/fs/nfs/direct.c
> ===================================================================
> --- linux-2.6.36-rc7.orig/fs/nfs/direct.c 2010-11-18 15:53:15.904972002 +0530
> +++ linux-2.6.36-rc7/fs/nfs/direct.c 2010-11-18 15:54:01.184972001 +0530
> @@ -867,7 +867,7 @@
> goto out;
> nfs_alloc_commit_data(dreq);
>
> - if (dreq->commit_data == NULL || count < wsize)
> + if (dreq->commit_data == NULL || count <= wsize)
> sync = NFS_FILE_SYNC;
>
> dreq->inode = inode;
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

Looks right to me.

Reviewed-by: Jeff Layton <[email protected]>