From caa8ed077e8b9b67d18f18b3ec46891bd8d310a7 Mon Sep 17 00:00:00 2001 From: Gabriel Schneider Date: Thu, 1 Oct 2026 09:54:20 -0300 Subject: A command line runs when its newline comes, or at its open's close, never because a write was short: a long line cut by a mount is one line A write shorter than its message, and not a multiple of 4096, was taken as whole, its tail a line. 9ns cuts a FUSE write of up to 512 KiB into 65512-byte Twrites, the last one short, so a 600 KiB `Edit ,c/.../` arrived cut and its tail ran as an unknown control message; the 1 MiB refusal failed the same way. Each open now holds a partial line until its newline, or its release, which ends the last line; an Edit block is whole when it closes, as before. A name write with a NUL still fails its write at once. selfmount writes a 600 KiB Edit line and a 1.1 MiB line through a real 9ns mount; building.typ says how lines are cut. Co-Authored-By: Claude Opus 5.5 --- test/fs.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) (limited to 'test/fs.py') diff --git a/test/fs.py b/test/fs.py index 52ac61c8..0e1e44df 100644 --- a/test/fs.py +++ b/test/fs.py @@ -1034,20 +1034,17 @@ def test(binary, quic=False): with Client(address, msize=256) as small: assert set(small.list('/os' + str(listing))) == { f'entry-{number:02}' for number in range(24)} - # 64 KiB frames: a ctl line with no newline, whole in its one - # Twrite, runs with it however long -- the cutoff for a write - # that may go on is the frame the client asked for, less 24. + # 64 KiB frames: a ctl line with no newline is held whatever the + # size of its write -- a mount cuts lines anywhere -- and runs at + # the close, its failure then in the log. with Client(address, msize=65536) as big: assert big.msize == 65536 ctl = big.open('/pane/1/ctl', 1) line = b'bogus' + b'x' * 20000 - try: - big.rpc(118, struct.pack('