summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2005-05-27 19:21:08 +0000
committerpjd <pjd@FreeBSD.org>2005-05-27 19:21:08 +0000
commit788f75ddb2af03ab6d72cd8c4c1318452b406c06 (patch)
tree113dbff26b89f21d56f9eaed5a957e4facd69811 /sys
parent2fc56b12a9d9c4fe83bd0fd50dce1163147fb4b5 (diff)
downloadFreeBSD-src-788f75ddb2af03ab6d72cd8c4c1318452b406c06.zip
FreeBSD-src-788f75ddb2af03ab6d72cd8c4c1318452b406c06.tar.gz
Sync locking in freebsd4_getfsstat() with getfsstat().
Giant is probably also needed in kern_fhstatfs().
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/vfs_extattr.c3
-rw-r--r--sys/kern/vfs_syscalls.c3
2 files changed, 6 insertions, 0 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index dc28388..e59bc09 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -526,6 +526,7 @@ freebsd4_getfsstat(td, uap)
maxcount = uap->bufsize / sizeof(struct ostatfs);
sfsp = (caddr_t)uap->buf;
count = 0;
+ mtx_lock(&Giant);
mtx_lock(&mountlist_mtx);
for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) {
if (!prison_check_mount(td->td_ucred, mp)) {
@@ -567,6 +568,7 @@ freebsd4_getfsstat(td, uap)
error = copyout(&osb, sfsp, sizeof(osb));
if (error) {
vfs_unbusy(mp, td);
+ mtx_unlock(&Giant);
return (error);
}
sfsp += sizeof(osb);
@@ -577,6 +579,7 @@ freebsd4_getfsstat(td, uap)
vfs_unbusy(mp, td);
}
mtx_unlock(&mountlist_mtx);
+ mtx_unlock(&Giant);
if (sfsp && count > maxcount)
td->td_retval[0] = maxcount;
else
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index dc28388..e59bc09 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -526,6 +526,7 @@ freebsd4_getfsstat(td, uap)
maxcount = uap->bufsize / sizeof(struct ostatfs);
sfsp = (caddr_t)uap->buf;
count = 0;
+ mtx_lock(&Giant);
mtx_lock(&mountlist_mtx);
for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) {
if (!prison_check_mount(td->td_ucred, mp)) {
@@ -567,6 +568,7 @@ freebsd4_getfsstat(td, uap)
error = copyout(&osb, sfsp, sizeof(osb));
if (error) {
vfs_unbusy(mp, td);
+ mtx_unlock(&Giant);
return (error);
}
sfsp += sizeof(osb);
@@ -577,6 +579,7 @@ freebsd4_getfsstat(td, uap)
vfs_unbusy(mp, td);
}
mtx_unlock(&mountlist_mtx);
+ mtx_unlock(&Giant);
if (sfsp && count > maxcount)
td->td_retval[0] = maxcount;
else
OpenPOWER on IntegriCloud