diff options
author | kib <kib@FreeBSD.org> | 2014-12-20 15:49:12 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2014-12-20 15:49:12 +0000 |
commit | 32facbd8ab4ecab8dc68171d55d1fa0efc5184a7 (patch) | |
tree | 88913310e61a4ee0f3873d87f4b30c26a519ffa2 | |
parent | febae1567de111cf7b53f8fce80317a1c9d17b86 (diff) | |
download | FreeBSD-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.c | 13 |
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; |