Index: sys/kern/subr_witness.c =================================================================== --- sys/kern/subr_witness.c +++ sys/kern/subr_witness.c @@ -132,9 +132,6 @@ #define LI_EXCLUSIVE 0x00010000 /* Exclusive lock instance. */ #define LI_NORELEASE 0x00020000 /* Lock not allowed to be released. */ -/* Define this to check for blessed mutexes */ -#undef BLESSING - #ifndef WITNESS_COUNT #define WITNESS_COUNT 1536 #endif @@ -278,12 +275,10 @@ u_int wloh_count; }; -#ifdef BLESSING struct witness_blessed { const char *b_lock1; const char *b_lock2; }; -#endif struct witness_pendhelp { const char *wh_type; @@ -318,9 +313,7 @@ static int _isitmyx(struct witness *w1, struct witness *w2, int rmask, const char *fname); static void adopt(struct witness *parent, struct witness *child); -#ifdef BLESSING static int blessed(struct witness *, struct witness *); -#endif static void depart(struct witness *w); static struct witness *enroll(const char *description, struct lock_class *lock_class); @@ -726,14 +719,25 @@ { NULL, NULL } }; -#ifdef BLESSING /* - * Pairs of locks which have been blessed - * Don't complain about order problems with blessed locks + * Pairs of locks which have been blessed. Witness does not complain about + * order problems with blessed lock pairs. Please do not add an entry to the + * table without an explanatory comment. */ static struct witness_blessed blessed_list[] = { + /* + * See the comment in ufs_dirhash.c. Basically, a vnode lock serializes + * both lock orders, so a deadlock cannot happen as a result of this + * LOR. + */ + { "dirhash", "bufwait" }, + + /* + * A UFS vnode may be locked in vget() while a buffer belonging to the + * parent directory vnode is locked. + */ + { "ufs", "bufwait" }, }; -#endif /* * This global is set to 0 once it becomes safe to use the witness code. @@ -1339,7 +1343,6 @@ * We have a lock order violation, check to see if it * is allowed or has already been yelled about. */ -#ifdef BLESSING /* * If the lock order is blessed, just bail. We don't @@ -1348,7 +1351,6 @@ */ if (blessed(w, w1)) goto out; -#endif /* Bail if this violation is known */ if (w_rmatrix[w1->w_index][w->w_index] & WITNESS_REVERSAL) @@ -2084,7 +2086,6 @@ __func__)); } -#ifdef BLESSING static int blessed(struct witness *w1, struct witness *w2) { @@ -2104,7 +2105,6 @@ } return (0); } -#endif static struct witness * witness_get(void)