Periph driver fixes, second try.

Reviewed by:	scottl
Approved by:	rwatson (mentor)
Sponsored by:	FreeBSD Foundation
This commit is contained in:
Edward Tomasz Napierala 2008-12-19 14:31:40 +00:00
parent a4e2e711a5
commit 24ebf56636
4 changed files with 20 additions and 5 deletions

View File

@ -290,7 +290,7 @@ cam_periph_acquire(struct cam_periph *periph)
}
void
cam_periph_release(struct cam_periph *periph)
cam_periph_release_locked(struct cam_periph *periph)
{
if (periph == NULL)
@ -302,7 +302,21 @@ cam_periph_release(struct cam_periph *periph)
camperiphfree(periph);
}
xpt_unlock_buses();
}
void
cam_periph_release(struct cam_periph *periph)
{
struct cam_sim *sim;
if (periph == NULL)
return;
sim = periph->sim;
mtx_assert(sim->mtx, MA_NOTOWNED);
mtx_lock(sim->mtx);
cam_periph_release_locked(periph);
mtx_unlock(sim->mtx);
}
int
@ -329,7 +343,7 @@ cam_periph_hold(struct cam_periph *periph, int priority)
while ((periph->flags & CAM_PERIPH_LOCKED) != 0) {
periph->flags |= CAM_PERIPH_LOCK_WANTED;
if ((error = msleep(periph, mtx, priority, "caplck", 0)) != 0) {
cam_periph_release(periph);
cam_periph_release_locked(periph);
return (error);
}
}
@ -350,7 +364,7 @@ cam_periph_unhold(struct cam_periph *periph)
wakeup(periph);
}
cam_periph_release(periph);
cam_periph_release_locked(periph);
}
/*

View File

@ -141,6 +141,7 @@ cam_status cam_periph_alloc(periph_ctor_t *periph_ctor,
struct cam_periph *cam_periph_find(struct cam_path *path, char *name);
cam_status cam_periph_acquire(struct cam_periph *periph);
void cam_periph_release(struct cam_periph *periph);
void cam_periph_release_locked(struct cam_periph *periph);
int cam_periph_hold(struct cam_periph *periph, int priority);
void cam_periph_unhold(struct cam_periph *periph);
void cam_periph_invalidate(struct cam_periph *periph);

View File

@ -6314,7 +6314,7 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
xpt_done(done_ccb);
if (TAILQ_FIRST(&softc->request_ccbs) == NULL) {
cam_periph_invalidate(periph);
cam_periph_release(periph);
cam_periph_release_locked(periph);
} else {
probeschedule(periph);
}

View File

@ -772,8 +772,8 @@ daclose(struct disk *dp)
softc->flags &= ~DA_FLAG_OPEN;
cam_periph_unhold(periph);
cam_periph_release(periph);
cam_periph_unlock(periph);
cam_periph_release(periph);
return (0);
}