1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-17 10:26:15 +00:00

Move root_mount_hold() functionality to separate mutex.

It has nothing to share with mutex protecting list of mounted file systems.
This commit is contained in:
Alexander Motin 2014-06-11 08:14:08 +00:00
parent 2efb5fb1ec
commit eb6d6216c4
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=267351

View File

@ -97,6 +97,9 @@ struct vnode *rootvnode;
char *rootdevnames[2] = {NULL, NULL};
struct mtx root_holds_mtx;
MTX_SYSINIT(root_holds, &root_holds_mtx, "root_holds", MTX_DEF);
struct root_hold_token {
const char *who;
LIST_ENTRY(root_hold_token) list;
@ -131,9 +134,9 @@ root_mount_hold(const char *identifier)
h = malloc(sizeof *h, M_DEVBUF, M_ZERO | M_WAITOK);
h->who = identifier;
mtx_lock(&mountlist_mtx);
mtx_lock(&root_holds_mtx);
LIST_INSERT_HEAD(&root_holds, h, list);
mtx_unlock(&mountlist_mtx);
mtx_unlock(&root_holds_mtx);
return (h);
}
@ -143,10 +146,10 @@ root_mount_rel(struct root_hold_token *h)
if (h == NULL)
return;
mtx_lock(&mountlist_mtx);
mtx_lock(&root_holds_mtx);
LIST_REMOVE(h, list);
wakeup(&root_holds);
mtx_unlock(&mountlist_mtx);
mtx_unlock(&root_holds_mtx);
free(h, M_DEVBUF);
}
@ -168,12 +171,12 @@ root_mount_wait(void)
*/
KASSERT(curthread->td_proc->p_pid != 0,
("root_mount_wait: cannot be called from the swapper thread"));
mtx_lock(&mountlist_mtx);
mtx_lock(&root_holds_mtx);
while (!root_mount_complete) {
msleep(&root_mount_complete, &mountlist_mtx, PZERO, "rootwait",
msleep(&root_mount_complete, &root_holds_mtx, PZERO, "rootwait",
hz);
}
mtx_unlock(&mountlist_mtx);
mtx_unlock(&root_holds_mtx);
}
static void
@ -908,9 +911,9 @@ vfs_mountroot_wait(void)
DROP_GIANT();
g_waitidle();
PICKUP_GIANT();
mtx_lock(&mountlist_mtx);
mtx_lock(&root_holds_mtx);
if (LIST_EMPTY(&root_holds)) {
mtx_unlock(&mountlist_mtx);
mtx_unlock(&root_holds_mtx);
break;
}
if (ppsratecheck(&lastfail, &curfail, 1)) {
@ -919,7 +922,7 @@ vfs_mountroot_wait(void)
printf(" %s", h->who);
printf("\n");
}
msleep(&root_holds, &mountlist_mtx, PZERO | PDROP, "roothold",
msleep(&root_holds, &root_holds_mtx, PZERO | PDROP, "roothold",
hz);
}
}
@ -979,10 +982,10 @@ vfs_mountroot(void)
vref(prison0.pr_root);
mtx_unlock(&prison0.pr_mtx);
mtx_lock(&mountlist_mtx);
mtx_lock(&root_holds_mtx);
atomic_store_rel_int(&root_mount_complete, 1);
wakeup(&root_mount_complete);
mtx_unlock(&mountlist_mtx);
mtx_unlock(&root_holds_mtx);
EVENTHANDLER_INVOKE(mountroot);
}