summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/subr_witness.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/sys/kern/subr_witness.c b/sys/kern/subr_witness.c
index d6b0747..f032a04 100644
--- a/sys/kern/subr_witness.c
+++ b/sys/kern/subr_witness.c
@@ -162,6 +162,7 @@ static int blessed(struct witness *, struct witness *);
#endif
static void witness_displaydescendants(void(*)(const char *fmt, ...),
struct witness *);
+static const char *fixup_filename(const char *file);
static void witness_leveldescendents(struct witness *parent, int level);
static void witness_levelall(void);
static struct witness *witness_get(void);
@@ -522,6 +523,18 @@ witness_display(void(*prnt)(const char *fmt, ...))
}
#endif /* DDB */
+/* Trim useless garbage from filenames. */
+static const char *
+fixup_filename(const char *file)
+{
+
+ if (file == NULL)
+ return (NULL);
+ while (strncmp(file, "../", 3) == 0)
+ file += 3;
+ return (file);
+}
+
void
witness_lock(struct lock_object *lock, int flags, const char *file, int line)
{
@@ -541,6 +554,7 @@ witness_lock(struct lock_object *lock, int flags, const char *file, int line)
w = lock->lo_witness;
class = lock->lo_class;
td = curthread;
+ file = fixup_filename(file);
if (class->lc_flags & LC_SLEEPLOCK) {
/*
@@ -815,6 +829,7 @@ witness_upgrade(struct lock_object *lock, int flags, const char *file, int line)
if (lock->lo_witness == NULL || witness_dead || panicstr != NULL)
return;
class = lock->lo_class;
+ file = fixup_filename(file);
if ((lock->lo_flags & LO_UPGRADABLE) == 0)
panic("upgrade of non-upgradable lock (%s) %s @ %s:%d",
class->lc_name, lock->lo_name, file, line);
@@ -849,6 +864,7 @@ witness_downgrade(struct lock_object *lock, int flags, const char *file,
if (lock->lo_witness == NULL || witness_dead || panicstr != NULL)
return;
class = lock->lo_class;
+ file = fixup_filename(file);
if ((lock->lo_flags & LO_UPGRADABLE) == 0)
panic("downgrade of non-upgradable lock (%s) %s @ %s:%d",
class->lc_name, lock->lo_name, file, line);
@@ -884,6 +900,7 @@ witness_unlock(struct lock_object *lock, int flags, const char *file, int line)
return;
td = curthread;
class = lock->lo_class;
+ file = fixup_filename(file);
if (class->lc_flags & LC_SLEEPLOCK)
lock_list = &td->td_sleeplocks;
else
@@ -1492,6 +1509,7 @@ witness_assert(struct lock_object *lock, int flags, const char *file, int line)
lock->lo_class->lc_name, lock->lo_name);
return;
}
+ file = fixup_filename(file);
switch (flags) {
case LA_UNLOCKED:
if (instance != NULL)
OpenPOWER on IntegriCloud