diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/fs/nfs/nfs3_vnops.c | 21 | ||||
-rw-r--r-- | usr/src/uts/common/fs/nfs/nfs4_vnops.c | 21 | ||||
-rw-r--r-- | usr/src/uts/common/fs/nfs/nfs_vnops.c | 23 |
3 files changed, 61 insertions, 4 deletions
diff --git a/usr/src/uts/common/fs/nfs/nfs3_vnops.c b/usr/src/uts/common/fs/nfs/nfs3_vnops.c index 811b55ec09..0adab5c841 100644 --- a/usr/src/uts/common/fs/nfs/nfs3_vnops.c +++ b/usr/src/uts/common/fs/nfs/nfs3_vnops.c @@ -747,6 +747,12 @@ nfs3_fwrite: resid = uiop->uio_resid; offset = uiop->uio_loffset; error = rp->r_error; + /* + * A close may have cleared r_error, if so, + * propagate ESTALE error return properly + */ + if (error == 0) + error = ESTALE; goto bottom; } bufsize = MIN(uiop->uio_resid, mi->mi_stsize); @@ -783,6 +789,12 @@ nfs3_fwrite: if (rp->r_flags & RSTALE) { error = rp->r_error; + /* + * A close may have cleared r_error, if so, + * propagate ESTALE error return properly + */ + if (error == 0) + error = ESTALE; break; } @@ -4393,8 +4405,15 @@ nfs3_bio(struct buf *bp, stable_how *stab_comm, cred_t *cr) mutex_exit(&rp->r_statelock); } crfree(cred); - } else + } else { error = rp->r_error; + /* + * A close may have cleared r_error, if so, + * propagate ESTALE error return properly + */ + if (error == 0) + error = ESTALE; + } } if (error != 0 && error != NFS_EOF) diff --git a/usr/src/uts/common/fs/nfs/nfs4_vnops.c b/usr/src/uts/common/fs/nfs/nfs4_vnops.c index c294608e7d..1578e0a740 100644 --- a/usr/src/uts/common/fs/nfs/nfs4_vnops.c +++ b/usr/src/uts/common/fs/nfs/nfs4_vnops.c @@ -2824,6 +2824,12 @@ nfs4_fwrite: resid = uiop->uio_resid; offset = uiop->uio_loffset; error = rp->r_error; + /* + * A close may have cleared r_error, if so, + * propagate ESTALE error return properly + */ + if (error == 0) + error = ESTALE; goto bottom; } @@ -2866,6 +2872,12 @@ nfs4_fwrite: if (rp->r_flags & R4STALE) { error = rp->r_error; + /* + * A close may have cleared r_error, if so, + * propagate ESTALE error return properly + */ + if (error == 0) + error = ESTALE; break; } @@ -9573,8 +9585,15 @@ write_again: mutex_exit(&rp->r_statelock); } crfree(cred_otw); - } else + } else { error = rp->r_error; + /* + * A close may have cleared r_error, if so, + * propagate ESTALE error return properly + */ + if (error == 0) + error = ESTALE; + } } if (error != 0 && error != NFS_EOF) diff --git a/usr/src/uts/common/fs/nfs/nfs_vnops.c b/usr/src/uts/common/fs/nfs/nfs_vnops.c index 7fbf2edefa..4ddd5ca36d 100644 --- a/usr/src/uts/common/fs/nfs/nfs_vnops.c +++ b/usr/src/uts/common/fs/nfs/nfs_vnops.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * * Copyright (c) 1983,1984,1985,1986,1987,1988,1989 AT&T. @@ -646,6 +646,12 @@ nfs_fwrite: resid = uiop->uio_resid; offset = uiop->uio_loffset; error = rp->r_error; + /* + * A close may have cleared r_error, if so, + * propagate ESTALE error return properly + */ + if (error == 0) + error = ESTALE; goto bottom; } bufsize = MIN(uiop->uio_resid, mi->mi_curwrite); @@ -675,6 +681,12 @@ nfs_fwrite: if (rp->r_flags & RSTALE) { error = rp->r_error; + /* + * A close may have cleared r_error, if so, + * propagate ESTALE error return properly + */ + if (error == 0) + error = ESTALE; break; } @@ -3484,8 +3496,15 @@ nfs_bio(struct buf *bp, cred_t *cr) mutex_exit(&rp->r_statelock); } crfree(cred); - } else + } else { error = rp->r_error; + /* + * A close may have cleared r_error, if so, + * propagate ESTALE error return properly + */ + if (error == 0) + error = ESTALE; + } } if (error != 0 && error != NFS_EOF) |