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:
Kyle Evans 2019-09-15 02:59:53 +00:00
parent 3dffab60f3
commit 3155f2f0e2
2 changed files with 55 additions and 0 deletions

View File

@ -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 */

View File

@ -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 */