SchOS/kernel/core
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Nexoniarz 3eed58fe9b kernel: holdingsleep asks who holds the lock, not whether anyone does
int r = lk->locked;                              // before
    int r = lk->locked && lk->pid == myproc()->pid;  // after

Seven callers, and every one of them is an assertion of the form

    if (!holdingsleep(&b->lock)) panic("brelse");

whose entire purpose is to catch a process releasing a lock it never took.
Answering the weaker question disarms all of them: iunlock() on an inode locked
by another process, and brelse() on somebody else's buffer, both sailed through
and unlocked it underneath the real holder. Two processes then believe they hold
the same inode, and the corruption surfaces somewhere else entirely -- which is
exactly the shape of bug these panics exist to prevent.

Found while hunting the ls -lR hang. It is not proven to be that hang's cause,
and the instrumentation in the next commits says it is probably not. It is a
real defect regardless, and it re-arms the detector that would catch the rest.

myproc() is null on the boot path before the scheduler runs and acquiresleep()
stores 0 for that case, so this compares the same way rather than dereferencing
null. Checked that nothing touches a buffer that early, so the stricter
assertion cannot fire spuriously on boot.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VQ7Qx8E1q1M1bbCq8QLHS2
2026-09-12 17:13:59 +02:00
..
console.c gfx: the console and the crash screen stop drawing on a driver by name 2026-08-15 17:04:10 +02:00
dma.c Initial commit: Schunix as it stands before the SchOS rename 2026-08-09 13:47:01 +02:00
kalloc.c Free every usable memory region, not one contiguous run 2026-08-09 20:03:51 +02:00
main.c gfx: the console and the crash screen stop drawing on a driver by name 2026-08-15 17:04:10 +02:00
panic.c gfx: the console and the crash screen stop drawing on a driver by name 2026-08-15 17:04:10 +02:00
qr.c Initial commit: Schunix as it stands before the SchOS rename 2026-08-09 13:47:01 +02:00
sleeplock.c kernel: holdingsleep asks who holds the lock, not whether anyone does 2026-09-12 17:13:59 +02:00
spinlock.c Fix two bugs the Fedora move exposed 2026-08-09 19:29:21 +02:00
string.c Initial commit: Schunix as it stands before the SchOS rename 2026-08-09 13:47:01 +02:00
time.c Rename Schunix to SchOS; the kernel becomes SchIFT 2026-08-09 14:09:59 +02:00
uaccess.c Initial commit: Schunix as it stands before the SchOS rename 2026-08-09 13:47:01 +02:00