From: NeilBrown If we would block, we return "err-jukebox" for nfsv3, or just drop the request for v2. Signed-off-by: Neil Brown Signed-off-by: Andrew Morton --- 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) { _