diff options
author | kib <kib@FreeBSD.org> | 2007-03-14 08:45:55 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2007-03-14 08:45:55 +0000 |
commit | 1a473e3ed5338a60c3abc40bfd4c2a2657d257e0 (patch) | |
tree | 92ac483a6bc1b0ad8d7f0ed864062d8f6d4b253f /sys/kern | |
parent | 9f07de3caa3a1f26ce6215b011a38fd192e16b43 (diff) | |
download | FreeBSD-src-1a473e3ed5338a60c3abc40bfd4c2a2657d257e0.zip FreeBSD-src-1a473e3ed5338a60c3abc40bfd4c2a2657d257e0.tar.gz |
Busy filesystem around call of VFS_QUOTACTL() vfs op.
Tested by: Peter Holm
Reviewed by: tegge
Approved by: re (kensmith)
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/vfs_syscalls.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index ed0c432..2cca22e 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -176,7 +176,7 @@ quotactl(td, uap) caddr_t arg; } */ *uap; { - struct mount *mp, *vmp; + struct mount *mp; int vfslocked; int error; struct nameidata nd; @@ -191,14 +191,15 @@ quotactl(td, uap) return (error); vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); - error = vn_start_write(nd.ni_vp, &vmp, V_WAIT | PCATCH); mp = nd.ni_vp->v_mount; + if ((error = vfs_busy(mp, 0, NULL, td))) { + vrele(nd.ni_vp); + VFS_UNLOCK_GIANT(vfslocked); + return (error); + } vrele(nd.ni_vp); - if (error) - goto out; error = VFS_QUOTACTL(mp, uap->cmd, uap->uid, uap->arg, td); - vn_finished_write(vmp); -out: + vfs_unbusy(mp, td); VFS_UNLOCK_GIANT(vfslocked); return (error); } |