diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/fs/nfs/nfs3_vnops.c | 20 | ||||
-rw-r--r-- | usr/src/uts/common/fs/nfs/nfs4_vnops.c | 20 | ||||
-rw-r--r-- | usr/src/uts/common/fs/nfs/nfs_vnops.c | 20 |
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); /* |