summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorMarcel Telka <Marcel.Telka@Sun.COM>2009-10-23 09:14:54 +0200
committerMarcel Telka <Marcel.Telka@Sun.COM>2009-10-23 09:14:54 +0200
commit6edb4230a40618bae549a7adf7bffcbd0fdba3d2 (patch)
treeb9e84527dce87b8d8b2b410d3e956fd1ed3990eb /usr/src
parentc3a641501f830e76826a0f416dd952d282d30ae7 (diff)
downloadillumos-joyent-6edb4230a40618bae549a7adf7bffcbd0fdba3d2.tar.gz
6577647 NFS writes aren't interruptible if there are too many outstanding writes
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/fs/nfs/nfs3_vnops.c20
-rw-r--r--usr/src/uts/common/fs/nfs/nfs4_vnops.c20
-rw-r--r--usr/src/uts/common/fs/nfs/nfs_vnops.c20
3 files changed, 54 insertions, 6 deletions
diff --git a/usr/src/uts/common/fs/nfs/nfs3_vnops.c b/usr/src/uts/common/fs/nfs/nfs3_vnops.c
index 0adab5c841..56e88b84fa 100644
--- a/usr/src/uts/common/fs/nfs/nfs3_vnops.c
+++ b/usr/src/uts/common/fs/nfs/nfs3_vnops.c
@@ -811,8 +811,24 @@ nfs3_fwrite:
mutex_enter(&rp->r_statelock);
while ((mi->mi_max_threads != 0 &&
rp->r_awcount > 2 * mi->mi_max_threads) ||
- rp->r_gcount > 0)
- cv_wait(&rp->r_cv, &rp->r_statelock);
+ rp->r_gcount > 0) {
+ if (INTR(vp)) {
+ klwp_t *lwp = ttolwp(curthread);
+
+ if (lwp != NULL)
+ lwp->lwp_nostop++;
+ if (!cv_wait_sig(&rp->r_cv, &rp->r_statelock)) {
+ mutex_exit(&rp->r_statelock);
+ if (lwp != NULL)
+ lwp->lwp_nostop--;
+ error = EINTR;
+ goto bottom;
+ }
+ if (lwp != NULL)
+ lwp->lwp_nostop--;
+ } else
+ cv_wait(&rp->r_cv, &rp->r_statelock);
+ }
mutex_exit(&rp->r_statelock);
/*
diff --git a/usr/src/uts/common/fs/nfs/nfs4_vnops.c b/usr/src/uts/common/fs/nfs/nfs4_vnops.c
index 0ba6c73a78..271133645b 100644
--- a/usr/src/uts/common/fs/nfs/nfs4_vnops.c
+++ b/usr/src/uts/common/fs/nfs/nfs4_vnops.c
@@ -2894,8 +2894,24 @@ nfs4_fwrite:
mutex_enter(&rp->r_statelock);
while ((mi->mi_max_threads != 0 &&
rp->r_awcount > 2 * mi->mi_max_threads) ||
- rp->r_gcount > 0)
- cv_wait(&rp->r_cv, &rp->r_statelock);
+ rp->r_gcount > 0) {
+ if (INTR4(vp)) {
+ klwp_t *lwp = ttolwp(curthread);
+
+ if (lwp != NULL)
+ lwp->lwp_nostop++;
+ if (!cv_wait_sig(&rp->r_cv, &rp->r_statelock)) {
+ mutex_exit(&rp->r_statelock);
+ if (lwp != NULL)
+ lwp->lwp_nostop--;
+ error = EINTR;
+ goto bottom;
+ }
+ if (lwp != NULL)
+ lwp->lwp_nostop--;
+ } else
+ cv_wait(&rp->r_cv, &rp->r_statelock);
+ }
mutex_exit(&rp->r_statelock);
/*
diff --git a/usr/src/uts/common/fs/nfs/nfs_vnops.c b/usr/src/uts/common/fs/nfs/nfs_vnops.c
index 4ddd5ca36d..fa7ba8b791 100644
--- a/usr/src/uts/common/fs/nfs/nfs_vnops.c
+++ b/usr/src/uts/common/fs/nfs/nfs_vnops.c
@@ -703,8 +703,24 @@ nfs_fwrite:
mutex_enter(&rp->r_statelock);
while ((mi->mi_max_threads != 0 &&
rp->r_awcount > 2 * mi->mi_max_threads) ||
- rp->r_gcount > 0)
- cv_wait(&rp->r_cv, &rp->r_statelock);
+ rp->r_gcount > 0) {
+ if (INTR(vp)) {
+ klwp_t *lwp = ttolwp(curthread);
+
+ if (lwp != NULL)
+ lwp->lwp_nostop++;
+ if (!cv_wait_sig(&rp->r_cv, &rp->r_statelock)) {
+ mutex_exit(&rp->r_statelock);
+ if (lwp != NULL)
+ lwp->lwp_nostop--;
+ error = EINTR;
+ goto bottom;
+ }
+ if (lwp != NULL)
+ lwp->lwp_nostop--;
+ } else
+ cv_wait(&rp->r_cv, &rp->r_statelock);
+ }
mutex_exit(&rp->r_statelock);
/*