autofs_softc
struct autofs_softc *autofs_softc = NULL;
if (autofs_softc->sc_dev_opened == false)
if (autofs_softc->sc_dev_sid == proc_pgid(curp)) {
mtx_lock_ex_quick(&autofs_softc->sc_lock);
cv_broadcast(&autofs_softc->sc_cv);
mtx_unlock_ex(&autofs_softc->sc_lock);
KKASSERT(mtx_islocked_ex(&autofs_softc->sc_lock));
TAILQ_FOREACH(ar, &autofs_softc->sc_requests, ar_next) {
ar->ar_id = autofs_softc->sc_last_request_id++;
TAILQ_INSERT_TAIL(&autofs_softc->sc_requests, ar, ar_next);
cv_broadcast(&autofs_softc->sc_cv);
error = cv_mtx_wait_sig(&autofs_softc->sc_cv,
&autofs_softc->sc_lock);
cv_mtx_wait(&autofs_softc->sc_cv,
&autofs_softc->sc_lock);
TAILQ_REMOVE(&autofs_softc->sc_requests, ar, ar_next);
mtx_unlock_ex(&autofs_softc->sc_lock);
mtx_lock_ex_quick(&autofs_softc->sc_lock);
mtx_unlock_ex(&autofs_softc->sc_lock);
mtx_lock_ex_quick(&autofs_softc->sc_lock);
mtx_lock_ex_quick(&autofs_softc->sc_lock);
TAILQ_FOREACH(ar, &autofs_softc->sc_requests, ar_next) {
error = cv_mtx_wait_sig(&autofs_softc->sc_cv,
&autofs_softc->sc_lock);
mtx_unlock_ex(&autofs_softc->sc_lock);
mtx_unlock_ex(&autofs_softc->sc_lock);
autofs_softc->sc_dev_sid = proc_pgid(curp);
mtx_lock_ex_quick(&autofs_softc->sc_lock);
TAILQ_FOREACH(ar, &autofs_softc->sc_requests, ar_next)
mtx_unlock_ex(&autofs_softc->sc_lock);
cv_broadcast(&autofs_softc->sc_cv);
mtx_unlock_ex(&autofs_softc->sc_lock);
mtx_lock_ex_quick(&autofs_softc->sc_lock);
if (autofs_softc->sc_dev_opened) {
mtx_unlock_ex(&autofs_softc->sc_lock);
autofs_softc->sc_dev_opened = true;
mtx_unlock_ex(&autofs_softc->sc_lock);
mtx_lock_ex_quick(&autofs_softc->sc_lock);
KASSERT(autofs_softc->sc_dev_opened, ("not opened?"));
autofs_softc->sc_dev_opened = false;
mtx_unlock_ex(&autofs_softc->sc_lock);
KASSERT(autofs_softc->sc_dev_opened, ("not opened?"));
extern struct autofs_softc *autofs_softc;
destroy_dev(autofs_softc->sc_cdev);
mtx_unlock_ex(&autofs_softc->sc_lock);
kfree(autofs_softc, M_AUTOFS); /* race with open */
autofs_softc = NULL;
mtx_lock_ex_quick(&autofs_softc->sc_lock);
TAILQ_FOREACH(ar, &autofs_softc->sc_requests, ar_next) {
mtx_unlock_ex(&autofs_softc->sc_lock);
cv_broadcast(&autofs_softc->sc_cv);
mtx_unlock_ex(&autofs_softc->sc_lock);
KASSERT(autofs_softc == NULL,
("softc %p, should be NULL", autofs_softc));
autofs_softc = kmalloc(sizeof(*autofs_softc), M_AUTOFS,
TAILQ_INIT(&autofs_softc->sc_requests);
cv_init(&autofs_softc->sc_cv, "autofscv");
mtx_init(&autofs_softc->sc_lock, "autofssclk");
autofs_softc->sc_dev_opened = false;
autofs_softc->sc_cdev = make_dev(&autofs_ops, 0, UID_ROOT, GID_OPERATOR,
if (autofs_softc->sc_cdev == NULL) {
kfree(autofs_softc, M_AUTOFS);
autofs_softc->sc_cdev->si_drv1 = autofs_softc;
mtx_lock_ex_quick(&autofs_softc->sc_lock);
if (autofs_softc->sc_dev_opened) {
mtx_unlock_ex(&autofs_softc->sc_lock);
if (autofs_softc->sc_cdev != NULL)
mtx_lock_ex_quick(&autofs_softc->sc_lock);
mtx_unlock_ex(&autofs_softc->sc_lock);