summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_mount.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-08-17 09:07:21 +0000
committerkib <kib@FreeBSD.org>2014-08-17 09:07:21 +0000
commit94d67906ea5fe3906f9ca6700b842d9e4d0ecb60 (patch)
tree4a98692a9f91a0bf1eb66264fa2f665692127fe0 /sys/kern/vfs_mount.c
parent75d88c0d5af7637b80b91ac5ad44544a638d5ea8 (diff)
downloadFreeBSD-src-94d67906ea5fe3906f9ca6700b842d9e4d0ecb60.zip
FreeBSD-src-94d67906ea5fe3906f9ca6700b842d9e4d0ecb60.tar.gz
MFC r269457:
Remove Giant acquisition from the mount and unmount pathes.
Diffstat (limited to 'sys/kern/vfs_mount.c')
-rw-r--r--sys/kern/vfs_mount.c28
1 files changed, 5 insertions, 23 deletions
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c
index 8b764f7..674e526 100644
--- a/sys/kern/vfs_mount.c
+++ b/sys/kern/vfs_mount.c
@@ -463,9 +463,9 @@ vfs_mount_alloc(struct vnode *vp, struct vfsconf *vfsp, const char *fspath,
mp->mnt_activevnodelistsize = 0;
mp->mnt_ref = 0;
(void) vfs_busy(mp, MBF_NOWAIT);
+ atomic_add_acq_int(&vfsp->vfc_refcount, 1);
mp->mnt_op = vfsp->vfc_vfsops;
mp->mnt_vfc = vfsp;
- vfsp->vfc_refcount++; /* XXX Unlocked */
mp->mnt_stat.f_type = vfsp->vfc_typenum;
mp->mnt_gen++;
strlcpy(mp->mnt_stat.f_fstypename, vfsp->vfc_name, MFSNAMELEN);
@@ -505,7 +505,7 @@ vfs_mount_destroy(struct mount *mp)
panic("vfs_mount_destroy: nonzero writeopcount");
if (mp->mnt_secondary_writes != 0)
panic("vfs_mount_destroy: nonzero secondary_writes");
- mp->mnt_vfc->vfc_refcount--;
+ atomic_subtract_rel_int(&mp->mnt_vfc->vfc_refcount, 1);
if (!TAILQ_EMPTY(&mp->mnt_nvnodelist)) {
struct vnode *vp;
@@ -736,17 +736,12 @@ sys_mount(td, uap)
}
AUDIT_ARG_TEXT(fstype);
- mtx_lock(&Giant);
vfsp = vfs_byname_kld(fstype, td, &error);
free(fstype, M_TEMP);
- if (vfsp == NULL) {
- mtx_unlock(&Giant);
+ if (vfsp == NULL)
return (ENOENT);
- }
- if (vfsp->vfc_vfsops->vfs_cmount == NULL) {
- mtx_unlock(&Giant);
+ if (vfsp->vfc_vfsops->vfs_cmount == NULL)
return (EOPNOTSUPP);
- }
ma = mount_argsu(ma, "fstype", uap->type, MFSNAMELEN);
ma = mount_argsu(ma, "fspath", uap->path, MNAMELEN);
@@ -755,7 +750,6 @@ sys_mount(td, uap)
ma = mount_argb(ma, !(flags & MNT_NOEXEC), "noexec");
error = vfsp->vfc_vfsops->vfs_cmount(ma, uap->data, flags);
- mtx_unlock(&Giant);
return (error);
}
@@ -777,7 +771,6 @@ vfs_domount_first(
struct vnode *newdp;
int error;
- mtx_assert(&Giant, MA_OWNED);
ASSERT_VOP_ELOCKED(vp, __func__);
KASSERT((fsflags & MNT_UPDATE) == 0, ("MNT_UPDATE shouldn't be here"));
@@ -889,7 +882,6 @@ vfs_domount_update(
int error, export_error;
uint64_t flag;
- mtx_assert(&Giant, MA_OWNED);
ASSERT_VOP_ELOCKED(vp, __func__);
KASSERT((fsflags & MNT_UPDATE) != 0, ("MNT_UPDATE should be here"));
@@ -1091,7 +1083,6 @@ vfs_domount(
error = namei(&nd);
if (error != 0)
return (error);
- mtx_lock(&Giant);
NDFREE(&nd, NDF_ONLY_PNBUF);
vp = nd.ni_vp;
if ((fsflags & MNT_UPDATE) == 0) {
@@ -1106,7 +1097,6 @@ vfs_domount(
free(pathbuf, M_TEMP);
} else
error = vfs_domount_update(td, vp, fsflags, optlist);
- mtx_unlock(&Giant);
ASSERT_VI_UNLOCKED(vp, __func__);
ASSERT_VOP_UNLOCKED(vp, __func__);
@@ -1153,12 +1143,10 @@ sys_unmount(td, uap)
free(pathbuf, M_TEMP);
return (error);
}
- mtx_lock(&Giant);
if (uap->flags & MNT_BYFSID) {
AUDIT_ARG_TEXT(pathbuf);
/* Decode the filesystem ID. */
if (sscanf(pathbuf, "FSID:%d:%d", &id0, &id1) != 2) {
- mtx_unlock(&Giant);
free(pathbuf, M_TEMP);
return (EINVAL);
}
@@ -1198,19 +1186,15 @@ sys_unmount(td, uap)
* now, so in the !MNT_BYFSID case return the more likely
* EINVAL for compatibility.
*/
- mtx_unlock(&Giant);
return ((uap->flags & MNT_BYFSID) ? ENOENT : EINVAL);
}
/*
* Don't allow unmounting the root filesystem.
*/
- if (mp->mnt_flag & MNT_ROOTFS) {
- mtx_unlock(&Giant);
+ if (mp->mnt_flag & MNT_ROOTFS)
return (EINVAL);
- }
error = dounmount(mp, uap->flags, td);
- mtx_unlock(&Giant);
return (error);
}
@@ -1228,8 +1212,6 @@ dounmount(mp, flags, td)
uint64_t async_flag;
int mnt_gen_r;
- mtx_assert(&Giant, MA_OWNED);
-
if ((coveredvp = mp->mnt_vnodecovered) != NULL) {
mnt_gen_r = mp->mnt_gen;
VI_LOCK(coveredvp);
OpenPOWER on IntegriCloud