From 51d47afd851057c0e847d4c9ceadf0b00685bc20 Mon Sep 17 00:00:00 2001 From: delphij Date: Thu, 15 Dec 2011 02:26:53 +0000 Subject: Honor NFSv3 commit call (RFC 1813, Section 3.3.21) where when count is 0, the full length from offset is being flushed. Note that for now VOP_FSYNC does not support offset and length parameters so we still do the same full VOP_FSYNC. This issue was reported at FreeNAS support site as FreeNAS ticket #1096. Submitted by: "ceckerle" Prodded by: gcooper Reviewed by: rmacklem MFC after: 2 weeks --- sys/nfsserver/nfs_serv.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'sys/nfsserver') diff --git a/sys/nfsserver/nfs_serv.c b/sys/nfsserver/nfs_serv.c index 3ee804d..e51c761 100644 --- a/sys/nfsserver/nfs_serv.c +++ b/sys/nfsserver/nfs_serv.c @@ -3454,7 +3454,12 @@ nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, } for_ret = VOP_GETATTR(vp, &bfor, cred); - if (cnt > MAX_COMMIT_COUNT) { + /* + * RFC 1813 3.3.21: if count is 0, a flush from offset to the end of file + * is done. At this time VOP_FSYNC does not accept offset and byte count + * parameters so call VOP_FSYNC the whole file for now. + */ + if (cnt == 0 || cnt > MAX_COMMIT_COUNT) { /* * Give up and do the whole thing */ -- cgit v1.1