summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-12-20 15:49:12 +0000
committerkib <kib@FreeBSD.org>2014-12-20 15:49:12 +0000
commit32facbd8ab4ecab8dc68171d55d1fa0efc5184a7 (patch)
tree88913310e61a4ee0f3873d87f4b30c26a519ffa2
parentfebae1567de111cf7b53f8fce80317a1c9d17b86 (diff)
downloadFreeBSD-src-32facbd8ab4ecab8dc68171d55d1fa0efc5184a7.zip
FreeBSD-src-32facbd8ab4ecab8dc68171d55d1fa0efc5184a7.tar.gz
MFC r275744:
Only sleep interruptible while waiting for suspension end when filesystem specified VFCF_SBDRY flag, i.e. for NFS.
-rw-r--r--sys/kern/vfs_vnops.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index c1b6558..5ebe466 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -1579,7 +1579,7 @@ vn_closefile(fp, td)
static int
vn_start_write_locked(struct mount *mp, int flags)
{
- int error;
+ int error, mflags;
mtx_assert(MNT_MTX(mp), MA_OWNED);
error = 0;
@@ -1589,13 +1589,15 @@ vn_start_write_locked(struct mount *mp, int flags)
*/
if ((curthread->td_pflags & TDP_IGNSUSP) == 0 ||
mp->mnt_susp_owner != curthread) {
+ mflags = ((mp->mnt_vfc->vfc_flags & VFCF_SBDRY) != 0 ?
+ (flags & PCATCH) : 0) | (PUSER - 1);
while ((mp->mnt_kern_flag & MNTK_SUSPEND) != 0) {
if (flags & V_NOWAIT) {
error = EWOULDBLOCK;
goto unlock;
}
- error = msleep(&mp->mnt_flag, MNT_MTX(mp),
- (PUSER - 1) | (flags & PCATCH), "suspfs", 0);
+ error = msleep(&mp->mnt_flag, MNT_MTX(mp), mflags,
+ "suspfs", 0);
if (error)
goto unlock;
}
@@ -1705,8 +1707,9 @@ vn_start_secondary_write(vp, mpp, flags)
/*
* Wait for the suspension to finish.
*/
- error = msleep(&mp->mnt_flag, MNT_MTX(mp),
- (PUSER - 1) | (flags & PCATCH) | PDROP, "suspfs", 0);
+ error = msleep(&mp->mnt_flag, MNT_MTX(mp), (PUSER - 1) | PDROP |
+ ((mp->mnt_vfc->vfc_flags & VFCF_SBDRY) != 0 ? (flags & PCATCH) : 0),
+ "suspfs", 0);
vfs_rel(mp);
if (error == 0)
goto retry;
OpenPOWER on IntegriCloud