summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/fs/nfs/nfs3_vnops.c21
-rw-r--r--usr/src/uts/common/fs/nfs/nfs4_vnops.c21
-rw-r--r--usr/src/uts/common/fs/nfs/nfs_vnops.c23
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)