[Bug 267628] growfs deadlocks if output is redirected to the filesystem being grown
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 267628] growfs deadlocks if output is redirected to the filesystem being grown"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 267628] growfs deadlocks if output is redirected to the filesystem being grown"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 07 Nov 2022 22:01:27 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=267628 Bug ID: 267628 Summary: growfs deadlocks if output is redirected to the filesystem being grown Product: Base System Version: CURRENT Hardware: Any OS: Any Status: New Severity: Affects Only Me Priority: --- Component: bin Assignee: bugs@FreeBSD.org Reporter: cgull@glup.org growfs deadlocks in disk wait on 'suspfs' if its stdout/stderr is redirected to a file on the filesystem being grown. This appears to be because it suspends the filesystem with the UFSSUSPEND ioctl, and then writes disk block numbers as a progress indicator as it writes new cylinder groups. The reproduction is easy: mdconfig -s 20m gpart create -s gpt md0 gpart add -t freebsd-ufs -s 10m -i 1 md0 newfs md0p1 mount /dev/md0p1 /mnt gpart resize -i 1 md0 growfs -y md0p1 > /mnt/growfs.log Reproduced in 13.1p2 and a -CURRENT snapshot dated Nov 3 07:57 with identifier 'main-n259005-5cc5c9254da'. Also, if the system is shutdown with a growfs in this state, disk syncing hangs and the system never halts/reboots. I'll open a separate bug for that. Ideas for fixes (some are not complete fixes): * fstat() stdout/stderr and compare their fsids against the filesystem we're growing. If either is found to match, exit with an error message. I think that may be a complete solution for growfs (it can no longer uninterruptibly deadlock). 'growfs | tee /growing-fs/growfs.log' will still hang if growfs produces enough output, but growfs will be interruptible, and tee will make progress after the ufssuspend state is exited. * Write new cylinder groups first, before doing UFSSUSPEND and writing the formerly-last cg and superblock. This is not a complete fix for this particular issue (if growfs reports errors it will still deadlock), but is 90%, and has the added benefits of doing most of the I/O (and encountering most possible errors) before making irreversible changes to the existing filesystem, and also reducing the amount of time the filesystem is suspended. * Don't report progress or errors while in ufssuspend state. * On non-ttys, set stdio buffers so that progress indicators are not written until completion. I'll try and come up with patches for this. -- You are receiving this mail because: You are the assignee for the bug.