Periph driver fixes, second try.
Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation
This commit is contained in:
parent
a4e2e711a5
commit
24ebf56636
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=186319
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user