When offset larger than LLONG_MAX, it's better to sync all the data of file than return nfserr_inval. Signed-off-by: Bian Naimeng <biannm@xxxxxxxxxxxxxx> --- fs/nfsd/vfs.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 96360a8..f67fe31 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -1174,20 +1174,23 @@ nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp, { struct file *file; loff_t end = LLONG_MAX; - __be32 err = nfserr_inval; + __be32 err; + + if ((u64)count > ~(u64)offset) + return nfserr_inval; if (offset < 0) - goto out; - if (count != 0) { + offset = 0; + else if (count != 0) { end = offset + (loff_t)count - 1; if (end < offset) - goto out; + end = LLONG_MAX; } err = nfsd_open(rqstp, fhp, S_IFREG, NFSD_MAY_WRITE|NFSD_MAY_NOT_BREAK_LEASE, &file); if (err) - goto out; + return err; if (EX_ISSYNC(fhp->fh_export)) { int err2 = vfs_fsync_range(file, offset, end, 0); @@ -1198,7 +1201,6 @@ nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp, } nfsd_close(file); -out: return err; } #endif /* CONFIG_NFSD_V3 */ -- 1.6.5.2 -- Regards Bian Naimeng -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html