mirror of
https://github.com/opnsense/src.git
synced 2026-06-14 19:20:18 -04:00
- Hold a reference from the time vfs_busy starts until vfs_unbusy is
called. - vfs_getvfs has to return a reference to prevent the returned mountpoint from changing identities. - Release references acquired via vfs_getvfs. Discussed with: tegge Tested by: kris Sponsored by: Isilon Systems, Inc.
This commit is contained in:
parent
c5fcce21c5
commit
94bc95db3c
1 changed files with 9 additions and 3 deletions
|
|
@ -362,7 +362,6 @@ vfs_busy(struct mount *mp, int flags, struct mtx *interlkp,
|
|||
lkflags = LK_SHARED | LK_INTERLOCK;
|
||||
if (lockmgr(&mp->mnt_lock, lkflags, MNT_MTX(mp), td))
|
||||
panic("vfs_busy: unexpected lock failure");
|
||||
vfs_rel(mp);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -374,6 +373,7 @@ vfs_unbusy(struct mount *mp, struct thread *td)
|
|||
{
|
||||
|
||||
lockmgr(&mp->mnt_lock, LK_RELEASE, NULL, td);
|
||||
vfs_rel(mp);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -388,6 +388,7 @@ vfs_getvfs(fsid_t *fsid)
|
|||
TAILQ_FOREACH(mp, &mountlist, mnt_list) {
|
||||
if (mp->mnt_stat.f_fsid.val[0] == fsid->val[0] &&
|
||||
mp->mnt_stat.f_fsid.val[1] == fsid->val[1]) {
|
||||
vfs_ref(mp);
|
||||
mtx_unlock(&mountlist_mtx);
|
||||
return (mp);
|
||||
}
|
||||
|
|
@ -428,6 +429,7 @@ void
|
|||
vfs_getnewfsid(struct mount *mp)
|
||||
{
|
||||
static u_int16_t mntid_base;
|
||||
struct mount *nmp;
|
||||
fsid_t tfsid;
|
||||
int mtype;
|
||||
|
||||
|
|
@ -439,8 +441,9 @@ vfs_getnewfsid(struct mount *mp)
|
|||
tfsid.val[0] = makedev(255,
|
||||
mtype | ((mntid_base & 0xFF00) << 8) | (mntid_base & 0xFF));
|
||||
mntid_base++;
|
||||
if (vfs_getvfs(&tfsid) == NULL)
|
||||
if ((nmp = vfs_getvfs(&tfsid)) == NULL)
|
||||
break;
|
||||
vfs_rel(nmp);
|
||||
}
|
||||
mp->mnt_stat.f_fsid.val[0] = tfsid.val[0];
|
||||
mp->mnt_stat.f_fsid.val[1] = tfsid.val[1];
|
||||
|
|
@ -3686,10 +3689,13 @@ sysctl_vfs_ctl(SYSCTL_HANDLER_ARGS)
|
|||
/* ensure that a specific sysctl goes to the right filesystem. */
|
||||
if (strcmp(vc.vc_fstypename, "*") != 0 &&
|
||||
strcmp(vc.vc_fstypename, mp->mnt_vfc->vfc_name) != 0) {
|
||||
vfs_rel(mp);
|
||||
return (EINVAL);
|
||||
}
|
||||
VCTLTOREQ(&vc, req);
|
||||
return (VFS_SYSCTL(mp, vc.vc_op, req));
|
||||
error = VFS_SYSCTL(mp, vc.vc_op, req);
|
||||
vfs_rel(mp);
|
||||
return (error);
|
||||
}
|
||||
|
||||
SYSCTL_PROC(_vfs, OID_AUTO, ctl, CTLFLAG_WR,
|
||||
|
|
|
|||
Loading…
Reference in a new issue