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.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);
/*