
From: NeilBrown <neilb@cse.unsw.edu.au>

If we would block, we return "err-jukebox" for nfsv3, or just drop the request
for v2.

Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/fs/nfsd/nfsproc.c |    1 +
 25-akpm/fs/nfsd/nfssvc.c  |    2 ++
 25-akpm/fs/nfsd/vfs.c     |    8 ++++----
 3 files changed, 7 insertions(+), 4 deletions(-)

diff -puN fs/nfsd/nfsproc.c~knfsd-calls-to-break_lease-in-nfsd-should-be-o_nonblocking fs/nfsd/nfsproc.c
--- 25/fs/nfsd/nfsproc.c~knfsd-calls-to-break_lease-in-nfsd-should-be-o_nonblocking	2004-09-02 20:28:36.233183936 -0700
+++ 25-akpm/fs/nfsd/nfsproc.c	2004-09-02 20:28:36.239183024 -0700
@@ -586,6 +586,7 @@ nfserrno (int errno)
 		{ nfserr_dquot, -EDQUOT },
 #endif
 		{ nfserr_stale, -ESTALE },
+		{ nfserr_jukebox, -EWOULDBLOCK },
 		{ nfserr_jukebox, -ETIMEDOUT },
 		{ nfserr_dropit, -EAGAIN },
 		{ nfserr_dropit, -ENOMEM },
diff -puN fs/nfsd/nfssvc.c~knfsd-calls-to-break_lease-in-nfsd-should-be-o_nonblocking fs/nfsd/nfssvc.c
--- 25/fs/nfsd/nfssvc.c~knfsd-calls-to-break_lease-in-nfsd-should-be-o_nonblocking	2004-09-02 20:28:36.234183784 -0700
+++ 25-akpm/fs/nfsd/nfssvc.c	2004-09-02 20:28:36.240182872 -0700
@@ -328,6 +328,8 @@ nfsd_dispatch(struct svc_rqst *rqstp, u3
 
 	/* Now call the procedure handler, and encode NFS status. */
 	nfserr = proc->pc_func(rqstp, rqstp->rq_argp, rqstp->rq_resp);
+	if (nfserr == nfserr_jukebox && rqstp->rq_vers == 2)
+		nfserr = nfserr_dropit;
 	if (nfserr == nfserr_dropit) {
 		dprintk("nfsd: Dropping request due to malloc failure!\n");
 		nfsd_cache_update(rqstp, RC_NOCACHE, NULL);
diff -puN fs/nfsd/vfs.c~knfsd-calls-to-break_lease-in-nfsd-should-be-o_nonblocking fs/nfsd/vfs.c
--- 25/fs/nfsd/vfs.c~knfsd-calls-to-break_lease-in-nfsd-should-be-o_nonblocking	2004-09-02 20:28:36.236183480 -0700
+++ 25-akpm/fs/nfsd/vfs.c	2004-09-02 20:28:36.242182568 -0700
@@ -303,8 +303,8 @@ nfsd_setattr(struct svc_rqst *rqstp, str
 		 * If we are changing the size of the file, then
 		 * we need to break all leases.
 		 */
-		err = break_lease(inode, FMODE_WRITE);
-		if (err)
+		err = break_lease(inode, FMODE_WRITE | O_NONBLOCK);
+		if (err) /* ENOMEM or EWOULDBLOCK */
 			goto out_nfserr;
 
 		err = get_write_access(inode);
@@ -669,8 +669,8 @@ nfsd_open(struct svc_rqst *rqstp, struct
 	 * Check to see if there are any leases on this file.
 	 * This may block while leases are broken.
 	 */
-	err = break_lease(inode, (access & MAY_WRITE) ? FMODE_WRITE : 0);
-	if (err)
+	err = break_lease(inode, O_NONBLOCK | ((access & MAY_WRITE) ? FMODE_WRITE : 0));
+	if (err) /* NOMEM or WOULDBLOCK */
 		goto out_nfserr;
 
 	if (access & MAY_WRITE) {
_
