rangelock: add rangelock_cookie_assert
A future change to posixshm to add file sealing (in DIFF_21391[0] and child) will move locking out of shm_dotruncate as kern_shm_open() will require the lock to be held across the dotruncate until the seal is actually applied. For this, the cookie is passed into shm_dotruncate_locked which asserts RCA_WLOCKED. [0] Name changed to protect the innocent, hopefully, from getting autoclosed due to this reference... Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D21628
This commit is contained in:
parent
3dffab60f3
commit
3155f2f0e2
@ -299,3 +299,35 @@ rangelock_trywlock(struct rangelock *lock, off_t start, off_t end,
|
||||
|
||||
return (rangelock_enqueue(lock, start, end, RL_LOCK_WRITE, ilk, true));
|
||||
}
|
||||
|
||||
#ifdef INVARIANT_SUPPORT
|
||||
void
|
||||
_rangelock_cookie_assert(void *cookie, int what, const char *file, int line)
|
||||
{
|
||||
struct rl_q_entry *entry;
|
||||
int flags;
|
||||
|
||||
MPASS(cookie != NULL);
|
||||
entry = cookie;
|
||||
flags = entry->rl_q_flags;
|
||||
switch (what) {
|
||||
case RCA_LOCKED:
|
||||
if ((flags & RL_LOCK_GRANTED) == 0)
|
||||
panic("rangelock not held @ %s:%d\n", file, line);
|
||||
break;
|
||||
case RCA_RLOCKED:
|
||||
if ((flags & (RL_LOCK_GRANTED | RL_LOCK_READ)) !=
|
||||
(RL_LOCK_GRANTED | RL_LOCK_READ))
|
||||
panic("rangelock not rlocked @ %s:%d\n", file, line);
|
||||
break;
|
||||
case RCA_WLOCKED:
|
||||
if ((flags & (RL_LOCK_GRANTED | RL_LOCK_WRITE)) !=
|
||||
(RL_LOCK_GRANTED | RL_LOCK_WRITE))
|
||||
panic("rangelock not wlocked @ %s:%d\n", file, line);
|
||||
break;
|
||||
default:
|
||||
panic("Unknown rangelock assertion: %d @ %s:%d", what, file,
|
||||
line);
|
||||
}
|
||||
}
|
||||
#endif /* INVARIANT_SUPPORT */
|
||||
|
@ -82,6 +82,29 @@ void *rangelock_wlock(struct rangelock *lock, off_t start, off_t end,
|
||||
void *rangelock_trywlock(struct rangelock *lock, off_t start, off_t end,
|
||||
struct mtx *ilk);
|
||||
void rlqentry_free(struct rl_q_entry *rlqe);
|
||||
#if defined(INVARIANTS) || defined(INVARIANT_SUPPORT)
|
||||
void _rangelock_cookie_assert(void *cookie, int what, const char *file,
|
||||
int line);
|
||||
#endif
|
||||
|
||||
#ifdef INVARIANTS
|
||||
#define rangelock_cookie_assert_(cookie, what, file, line) \
|
||||
_rangelock_cookie_assert((cookie), (what), (file), (line))
|
||||
#else
|
||||
#define rangelock_cookie_assert_(cookie, what, file, line) (void)0
|
||||
#endif
|
||||
|
||||
#define rangelock_cookie_assert(cookie, what) \
|
||||
rangelock_cookie_assert_((cookie), (what), __FILE__, __LINE__)
|
||||
|
||||
/*
|
||||
* Assertion flags.
|
||||
*/
|
||||
#if defined(INVARIANTS) || defined(INVARIANT_SUPPORT)
|
||||
#define RCA_LOCKED 0x0001
|
||||
#define RCA_RLOCKED 0x0002
|
||||
#define RCA_WLOCKED 0x0004
|
||||
#endif
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user