summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2005-05-28 13:11:35 +0000
committerrwatson <rwatson@FreeBSD.org>2005-05-28 13:11:35 +0000
commit527c640ad3d8edb87affe67b7ab6b2e6ded7f760 (patch)
tree15bb7965f78b1eb06801c34203d3fff942b5a017
parentff36d1a4939ff83639b86692662f26236f2d0efe (diff)
downloadFreeBSD-src-527c640ad3d8edb87affe67b7ab6b2e6ded7f760.zip
FreeBSD-src-527c640ad3d8edb87affe67b7ab6b2e6ded7f760.tar.gz
Acquire Giant explicitly in quotactl() so that the syscalls.master
entry can become MSTD.
-rw-r--r--sys/kern/vfs_extattr.c12
-rw-r--r--sys/kern/vfs_syscalls.c12
2 files changed, 20 insertions, 4 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index fb99bf6..e0ceeb4 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -164,6 +164,8 @@ SYSCTL_INT(_kern_prison, OID_AUTO, quotas, CTLFLAG_RW, &prison_quotas, 0, "");
/*
* Change filesystem quotas.
+ *
+ * MP SAFE
*/
#ifndef _SYS_SYSPROTO_H_
struct quotactl_args {
@@ -189,17 +191,23 @@ quotactl(td, uap)
if (jailed(td->td_ucred) && !prison_quotas)
return (EPERM);
+ mtx_lock(&Giant);
NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, uap->path, td);
- if ((error = namei(&nd)) != 0)
+ if ((error = namei(&nd)) != 0) {
+ mtx_unlock(&Giant);
return (error);
+ }
NDFREE(&nd, NDF_ONLY_PNBUF);
error = vn_start_write(nd.ni_vp, &vmp, V_WAIT | PCATCH);
mp = nd.ni_vp->v_mount;
vrele(nd.ni_vp);
- if (error)
+ if (error) {
+ mtx_unlock(&Giant);
return (error);
+ }
error = VFS_QUOTACTL(mp, uap->cmd, uap->uid, uap->arg, td);
vn_finished_write(vmp);
+ mtx_unlock(&Giant);
return (error);
}
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index fb99bf6..e0ceeb4 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -164,6 +164,8 @@ SYSCTL_INT(_kern_prison, OID_AUTO, quotas, CTLFLAG_RW, &prison_quotas, 0, "");
/*
* Change filesystem quotas.
+ *
+ * MP SAFE
*/
#ifndef _SYS_SYSPROTO_H_
struct quotactl_args {
@@ -189,17 +191,23 @@ quotactl(td, uap)
if (jailed(td->td_ucred) && !prison_quotas)
return (EPERM);
+ mtx_lock(&Giant);
NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, uap->path, td);
- if ((error = namei(&nd)) != 0)
+ if ((error = namei(&nd)) != 0) {
+ mtx_unlock(&Giant);
return (error);
+ }
NDFREE(&nd, NDF_ONLY_PNBUF);
error = vn_start_write(nd.ni_vp, &vmp, V_WAIT | PCATCH);
mp = nd.ni_vp->v_mount;
vrele(nd.ni_vp);
- if (error)
+ if (error) {
+ mtx_unlock(&Giant);
return (error);
+ }
error = VFS_QUOTACTL(mp, uap->cmd, uap->uid, uap->arg, td);
vn_finished_write(vmp);
+ mtx_unlock(&Giant);
return (error);
}
OpenPOWER on IntegriCloud