summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>1999-11-20 10:00:46 +0000
committerphk <phk@FreeBSD.org>1999-11-20 10:00:46 +0000
commit1adcecffd93c2f4536a5031426a753b1218ed88a (patch)
treec111db9be70768372eebad9bfc9cbe47bb8a0a9d /sys/kern
parent5354776cb2ed414ffde1c1fe64dec67336140a07 (diff)
downloadFreeBSD-src-1adcecffd93c2f4536a5031426a753b1218ed88a.zip
FreeBSD-src-1adcecffd93c2f4536a5031426a753b1218ed88a.tar.gz
struct mountlist and struct mount.mnt_list have no business being
a CIRCLEQ. Change them to TAILQ_HEAD and TAILQ_ENTRY respectively. This removes ugly mp != (void*)&mountlist comparisons. Requested by: phk Submitted by: Jake Burkholder jake@checker.org PR: 14967
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/init_main.c2
-rw-r--r--sys/kern/kern_shutdown.c2
-rw-r--r--sys/kern/vfs_conf.c2
-rw-r--r--sys/kern/vfs_export.c28
-rw-r--r--sys/kern/vfs_extattr.c20
-rw-r--r--sys/kern/vfs_mount.c2
-rw-r--r--sys/kern/vfs_subr.c28
-rw-r--r--sys/kern/vfs_syscalls.c20
8 files changed, 50 insertions, 54 deletions
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index ec9cf85..484cfa4 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -447,7 +447,7 @@ xxx_vfs_root_fdtab(dummy)
register struct filedesc0 *fdp = &filedesc0;
/* Get the vnode for '/'. Set fdp->fd_fd.fd_cdir to reference it. */
- if (VFS_ROOT(CIRCLEQ_FIRST(&mountlist), &rootvnode))
+ if (VFS_ROOT(TAILQ_FIRST(&mountlist), &rootvnode))
panic("cannot find root vnode");
fdp->fd_fd.fd_cdir = rootvnode;
VREF(fdp->fd_fd.fd_cdir);
diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c
index 7ee7cc6..cc7e9ff 100644
--- a/sys/kern/kern_shutdown.c
+++ b/sys/kern/kern_shutdown.c
@@ -229,7 +229,7 @@ boot(howto)
if (((bp->b_flags&B_INVAL) == 0 && BUF_REFCNT(bp)) ||
((bp->b_flags & (B_DELWRI|B_INVAL)) == B_DELWRI)) {
if (bp->b_dev == NODEV) {
- CIRCLEQ_REMOVE(&mountlist,
+ TAILQ_REMOVE(&mountlist,
bp->b_vp->v_mount, mnt_list);
continue;
}
diff --git a/sys/kern/vfs_conf.c b/sys/kern/vfs_conf.c
index 8932e41..c2fa605 100644
--- a/sys/kern/vfs_conf.c
+++ b/sys/kern/vfs_conf.c
@@ -213,7 +213,7 @@ done:
/* register with list of mounted filesystems */
simple_lock(&mountlist_slock);
- CIRCLEQ_INSERT_HEAD(&mountlist, mp, mnt_list);
+ TAILQ_INSERT_HEAD(&mountlist, mp, mnt_list);
simple_unlock(&mountlist_slock);
/* sanity check system clock against root filesystem timestamp */
diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c
index 6d339cf..fc850ff 100644
--- a/sys/kern/vfs_export.c
+++ b/sys/kern/vfs_export.c
@@ -116,7 +116,7 @@ int vfs_ioopt = 0;
SYSCTL_INT(_vfs, OID_AUTO, ioopt, CTLFLAG_RW, &vfs_ioopt, 0, "");
#endif
-struct mntlist mountlist; /* mounted filesystem list */
+struct mntlist mountlist = TAILQ_HEAD_INITIALIZER(mountlist); /* mounted fs */
struct simplelock mountlist_slock;
struct simplelock mntvnode_slock;
int nfs_mount_type = -1;
@@ -172,7 +172,6 @@ vntblinit()
TAILQ_INIT(&vnode_free_list);
TAILQ_INIT(&vnode_tobefree_list);
simple_lock_init(&vnode_free_list_slock);
- CIRCLEQ_INIT(&mountlist);
vnode_zone = zinit("VNODE", sizeof (struct vnode), 0, 0, 5);
/*
* Initialize the filesystem syncer.
@@ -315,7 +314,7 @@ vfs_getvfs(fsid)
register struct mount *mp;
simple_lock(&mountlist_slock);
- CIRCLEQ_FOREACH(mp, &mountlist, mnt_list) {
+ 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]) {
simple_unlock(&mountlist_slock);
@@ -1973,9 +1972,9 @@ DB_SHOW_COMMAND(lockedvnodes, lockedvnodes)
printf("Locked vnodes\n");
simple_lock(&mountlist_slock);
- for (mp = CIRCLEQ_FIRST(&mountlist); mp != (void *)&mountlist; mp = nmp) {
+ for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) {
if (vfs_busy(mp, LK_NOWAIT, &mountlist_slock, p)) {
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
continue;
}
LIST_FOREACH(vp, &mp->mnt_vnodelist, v_mntvnodes) {
@@ -1983,7 +1982,7 @@ DB_SHOW_COMMAND(lockedvnodes, lockedvnodes)
vprint((char *)0, vp);
}
simple_lock(&mountlist_slock);
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
vfs_unbusy(mp, p);
}
simple_unlock(&mountlist_slock);
@@ -2091,10 +2090,9 @@ sysctl_vnode SYSCTL_HANDLER_ARGS
(numvnodes + KINFO_VNODESLOP) * (VPTRSZ + VNODESZ)));
simple_lock(&mountlist_slock);
- mp = CIRCLEQ_FIRST(&mountlist);
- for (; mp != (void *)&mountlist; mp = nmp) {
+ for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) {
if (vfs_busy(mp, LK_NOWAIT, &mountlist_slock, p)) {
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
continue;
}
again:
@@ -2120,7 +2118,7 @@ again:
}
simple_unlock(&mntvnode_slock);
simple_lock(&mountlist_slock);
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
vfs_unbusy(mp, p);
}
simple_unlock(&mountlist_slock);
@@ -2159,7 +2157,7 @@ vfs_mountedon(vp)
void
vfs_unmountall()
{
- struct mount *mp, *nmp;
+ struct mount *mp;
struct proc *p;
int error;
@@ -2170,17 +2168,19 @@ vfs_unmountall()
/*
* Since this only runs when rebooting, it is not interlocked.
*/
- mp = CIRCLEQ_LAST(&mountlist);
- for (; mp != (void *)&mountlist; mp = nmp) {
- nmp = CIRCLEQ_PREV(mp, mnt_list);
+ while(!TAILQ_EMPTY(&mountlist)) {
+ mp = TAILQ_LAST(&mountlist, mntlist);
error = dounmount(mp, MNT_FORCE, p);
if (error) {
+ TAILQ_REMOVE(&mountlist, mp, mnt_list);
printf("unmount of %s failed (",
mp->mnt_stat.f_mntonname);
if (error == EBUSY)
printf("BUSY)\n");
else
printf("%d)\n", error);
+ } else {
+ /* The unmount has removed mp from the mountlist */
}
}
}
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index e0045c1..4d5d394 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -331,7 +331,7 @@ update:
vp->v_mountedhere = mp;
simple_unlock(&vp->v_interlock);
simple_lock(&mountlist_slock);
- CIRCLEQ_INSERT_TAIL(&mountlist, mp, mnt_list);
+ TAILQ_INSERT_TAIL(&mountlist, mp, mnt_list);
simple_unlock(&mountlist_slock);
checkdirs(vp);
VOP_UNLOCK(vp, 0, p);
@@ -494,7 +494,7 @@ dounmount(mp, flags, p)
wakeup((caddr_t)mp);
return (error);
}
- CIRCLEQ_REMOVE(&mountlist, mp, mnt_list);
+ TAILQ_REMOVE(&mountlist, mp, mnt_list);
if ((coveredvp = mp->mnt_vnodecovered) != NULLVP) {
coveredvp->v_mountedhere = (struct mount *)0;
vrele(coveredvp);
@@ -533,10 +533,9 @@ sync(p, uap)
int asyncflag;
simple_lock(&mountlist_slock);
- mp = CIRCLEQ_FIRST(&mountlist);
- for (; mp != (void *)&mountlist; mp = nmp) {
+ for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) {
if (vfs_busy(mp, LK_NOWAIT, &mountlist_slock, p)) {
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
continue;
}
if ((mp->mnt_flag & MNT_RDONLY) == 0) {
@@ -548,7 +547,7 @@ sync(p, uap)
mp->mnt_flag |= asyncflag;
}
simple_lock(&mountlist_slock);
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
vfs_unbusy(mp, p);
}
simple_unlock(&mountlist_slock);
@@ -718,10 +717,9 @@ getfsstat(p, uap)
sfsp = (caddr_t)SCARG(uap, buf);
count = 0;
simple_lock(&mountlist_slock);
- mp = CIRCLEQ_FIRST(&mountlist);
- for (; mp != (void *)&mountlist; mp = nmp) {
+ for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) {
if (vfs_busy(mp, LK_NOWAIT, &mountlist_slock, p)) {
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
continue;
}
if (sfsp && count < maxcount) {
@@ -735,7 +733,7 @@ getfsstat(p, uap)
(SCARG(uap, flags) & MNT_WAIT)) &&
(error = VFS_STATFS(mp, sp, p))) {
simple_lock(&mountlist_slock);
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
vfs_unbusy(mp, p);
continue;
}
@@ -749,7 +747,7 @@ getfsstat(p, uap)
}
count++;
simple_lock(&mountlist_slock);
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
vfs_unbusy(mp, p);
}
simple_unlock(&mountlist_slock);
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c
index 8932e41..c2fa605 100644
--- a/sys/kern/vfs_mount.c
+++ b/sys/kern/vfs_mount.c
@@ -213,7 +213,7 @@ done:
/* register with list of mounted filesystems */
simple_lock(&mountlist_slock);
- CIRCLEQ_INSERT_HEAD(&mountlist, mp, mnt_list);
+ TAILQ_INSERT_HEAD(&mountlist, mp, mnt_list);
simple_unlock(&mountlist_slock);
/* sanity check system clock against root filesystem timestamp */
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 6d339cf..fc850ff 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -116,7 +116,7 @@ int vfs_ioopt = 0;
SYSCTL_INT(_vfs, OID_AUTO, ioopt, CTLFLAG_RW, &vfs_ioopt, 0, "");
#endif
-struct mntlist mountlist; /* mounted filesystem list */
+struct mntlist mountlist = TAILQ_HEAD_INITIALIZER(mountlist); /* mounted fs */
struct simplelock mountlist_slock;
struct simplelock mntvnode_slock;
int nfs_mount_type = -1;
@@ -172,7 +172,6 @@ vntblinit()
TAILQ_INIT(&vnode_free_list);
TAILQ_INIT(&vnode_tobefree_list);
simple_lock_init(&vnode_free_list_slock);
- CIRCLEQ_INIT(&mountlist);
vnode_zone = zinit("VNODE", sizeof (struct vnode), 0, 0, 5);
/*
* Initialize the filesystem syncer.
@@ -315,7 +314,7 @@ vfs_getvfs(fsid)
register struct mount *mp;
simple_lock(&mountlist_slock);
- CIRCLEQ_FOREACH(mp, &mountlist, mnt_list) {
+ 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]) {
simple_unlock(&mountlist_slock);
@@ -1973,9 +1972,9 @@ DB_SHOW_COMMAND(lockedvnodes, lockedvnodes)
printf("Locked vnodes\n");
simple_lock(&mountlist_slock);
- for (mp = CIRCLEQ_FIRST(&mountlist); mp != (void *)&mountlist; mp = nmp) {
+ for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) {
if (vfs_busy(mp, LK_NOWAIT, &mountlist_slock, p)) {
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
continue;
}
LIST_FOREACH(vp, &mp->mnt_vnodelist, v_mntvnodes) {
@@ -1983,7 +1982,7 @@ DB_SHOW_COMMAND(lockedvnodes, lockedvnodes)
vprint((char *)0, vp);
}
simple_lock(&mountlist_slock);
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
vfs_unbusy(mp, p);
}
simple_unlock(&mountlist_slock);
@@ -2091,10 +2090,9 @@ sysctl_vnode SYSCTL_HANDLER_ARGS
(numvnodes + KINFO_VNODESLOP) * (VPTRSZ + VNODESZ)));
simple_lock(&mountlist_slock);
- mp = CIRCLEQ_FIRST(&mountlist);
- for (; mp != (void *)&mountlist; mp = nmp) {
+ for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) {
if (vfs_busy(mp, LK_NOWAIT, &mountlist_slock, p)) {
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
continue;
}
again:
@@ -2120,7 +2118,7 @@ again:
}
simple_unlock(&mntvnode_slock);
simple_lock(&mountlist_slock);
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
vfs_unbusy(mp, p);
}
simple_unlock(&mountlist_slock);
@@ -2159,7 +2157,7 @@ vfs_mountedon(vp)
void
vfs_unmountall()
{
- struct mount *mp, *nmp;
+ struct mount *mp;
struct proc *p;
int error;
@@ -2170,17 +2168,19 @@ vfs_unmountall()
/*
* Since this only runs when rebooting, it is not interlocked.
*/
- mp = CIRCLEQ_LAST(&mountlist);
- for (; mp != (void *)&mountlist; mp = nmp) {
- nmp = CIRCLEQ_PREV(mp, mnt_list);
+ while(!TAILQ_EMPTY(&mountlist)) {
+ mp = TAILQ_LAST(&mountlist, mntlist);
error = dounmount(mp, MNT_FORCE, p);
if (error) {
+ TAILQ_REMOVE(&mountlist, mp, mnt_list);
printf("unmount of %s failed (",
mp->mnt_stat.f_mntonname);
if (error == EBUSY)
printf("BUSY)\n");
else
printf("%d)\n", error);
+ } else {
+ /* The unmount has removed mp from the mountlist */
}
}
}
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index e0045c1..4d5d394 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -331,7 +331,7 @@ update:
vp->v_mountedhere = mp;
simple_unlock(&vp->v_interlock);
simple_lock(&mountlist_slock);
- CIRCLEQ_INSERT_TAIL(&mountlist, mp, mnt_list);
+ TAILQ_INSERT_TAIL(&mountlist, mp, mnt_list);
simple_unlock(&mountlist_slock);
checkdirs(vp);
VOP_UNLOCK(vp, 0, p);
@@ -494,7 +494,7 @@ dounmount(mp, flags, p)
wakeup((caddr_t)mp);
return (error);
}
- CIRCLEQ_REMOVE(&mountlist, mp, mnt_list);
+ TAILQ_REMOVE(&mountlist, mp, mnt_list);
if ((coveredvp = mp->mnt_vnodecovered) != NULLVP) {
coveredvp->v_mountedhere = (struct mount *)0;
vrele(coveredvp);
@@ -533,10 +533,9 @@ sync(p, uap)
int asyncflag;
simple_lock(&mountlist_slock);
- mp = CIRCLEQ_FIRST(&mountlist);
- for (; mp != (void *)&mountlist; mp = nmp) {
+ for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) {
if (vfs_busy(mp, LK_NOWAIT, &mountlist_slock, p)) {
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
continue;
}
if ((mp->mnt_flag & MNT_RDONLY) == 0) {
@@ -548,7 +547,7 @@ sync(p, uap)
mp->mnt_flag |= asyncflag;
}
simple_lock(&mountlist_slock);
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
vfs_unbusy(mp, p);
}
simple_unlock(&mountlist_slock);
@@ -718,10 +717,9 @@ getfsstat(p, uap)
sfsp = (caddr_t)SCARG(uap, buf);
count = 0;
simple_lock(&mountlist_slock);
- mp = CIRCLEQ_FIRST(&mountlist);
- for (; mp != (void *)&mountlist; mp = nmp) {
+ for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) {
if (vfs_busy(mp, LK_NOWAIT, &mountlist_slock, p)) {
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
continue;
}
if (sfsp && count < maxcount) {
@@ -735,7 +733,7 @@ getfsstat(p, uap)
(SCARG(uap, flags) & MNT_WAIT)) &&
(error = VFS_STATFS(mp, sp, p))) {
simple_lock(&mountlist_slock);
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
vfs_unbusy(mp, p);
continue;
}
@@ -749,7 +747,7 @@ getfsstat(p, uap)
}
count++;
simple_lock(&mountlist_slock);
- nmp = CIRCLEQ_NEXT(mp, mnt_list);
+ nmp = TAILQ_NEXT(mp, mnt_list);
vfs_unbusy(mp, p);
}
simple_unlock(&mountlist_slock);
OpenPOWER on IntegriCloud