Date: Wed, 2 May 2001 01:20:03 -0700 (PDT) From: Bruce Evans <bde@zeta.org.au> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/25992: System hangs when read-only floppy has been mounted Message-ID: <200105020820.f428K3H97290@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/25992; it has been noted by GNATS. From: Bruce Evans <bde@zeta.org.au> To: Dima Dorfman <dima@unixfreak.org> Cc: freebsd-gnats-submit@FreeBSD.ORG Subject: Re: kern/25992: System hangs when read-only floppy has been mounted Date: Wed, 2 May 2001 18:15:17 +1000 (EST) On Tue, 1 May 2001, Dima Dorfman wrote: > Szilveszter Adam <sziszi@petra.hos.u-szeged.hu> writes: > The difference is that a panic is a whole lot easier to diagnose than > a hang. > > > Just as an aside. This problem has been with us forever. I can appreciate More precisely, this bug (at least the panics and hangs for it) have been with us since: RCS file: /home/ncvs/src/sys/kern/vfs_bio.c,v Working file: vfs_bio.c head: 1.279 ... ---------------------------- revision 1.196 date: 1999/01/22 08:59:05; author: dg; state: Exp; lines: +5 -2 Don't throw away the buffer contents on a fatal write error; just mark the buffer as still being dirty. This isn't a perfect solution, but throwing away the buffer contents will often result in filesystem corruption and this solution will at least correctly deal with transient errors. Submitted by: Kirk McKusick <mckusick@mckusick.com> ---------------------------- Prior to this commit, write errors were handled by giving up on unwritable buffers. In particular, write errors for attempts to write to write protected media were fairly harmless. Immediately after this commit, write errors caused various panics and hangs, especially for block devices. Some of these problems have been fixed, mainly by unsupporting block devices, but I vinvalbuf() and thus unmount(2) still seems to be very broken. vinvalbuf() calls VOP_FSYNC() and then panics if VOP_FSYNC() didn't manage to sync everything, but VOP_FSYNC() can never sync unwritable buffers. It either loops forever trying to do so or returns with some buffers unsynced. > I'm not sure which problem you're referring to. I just tried > inserting a read-only floppy and mounting it read-write. I got a > bunch of write failure errors when I tried to unmount it. No panic, > no reboot. Lots of junk in the logs. Seems like correct behavior to > me. I said panic above because I thought it'd be more logical > behavior than a hang; spitting out write errors is even better. This may depend on the filesystem. For an empty ffs filesystem on a write-protected floppy under -current, I get endless retries and the problem can be recovered from by removing the write protection. This is because control doesn't get as far as the panicing vinvalbuf() in -current. dounmount() calls VOP_SYNC() and ffs's VOP_SYNC() (ffs_fsync()) has been fixed in -current to retry forever after VOP_FSYNC() fails (in the MNT_WAIT case). In RELENG_4, ffs_fsync() still gives up after an error fsyncing the vnode for the mounted-on device, so I think vinvalbuf() can be reached. Similarly for most non-ffs filesystems in -current. ffs_fsync() was fixed very recently in: RCS file: /home/ncvs/src/sys/ufs/ffs/ffs_vfsops.c,v Working file: ffs_vfsops.c head: 1.152 ... ---------------------------- revision 1.150 date: 2001/04/25 08:11:18; author: mckusick; state: Exp; lines: +16 -7 ... Close a loophole that allowed unwritten blocks to be skipped when doing ffs_sync with a request to wait for all I/O activity to be completed. ---------------------------- > > that the real UNIX gurus do not hurry to fix this one since they always > > know what to type and don't use floppies much anyway. (Neither do I.) But > > this does not mean that in this situation we should panic (or hang for that > > matter) Panics are for the situations where something is seriously wrong so > > much so, that we decide to give up instead of marching on and possibly > > producing non-sense results. But trying writing to a ro floppy should > > simply fail. Why is there an assumption that a floopy is always writeable > > unless indicated by -r otherwise? Would we try to write to (and The kernel doesn't know whether the floppy is writable until it attempts to write to it. The ancient history of the bug includes a very broken attempt to fix this in the floppy driver by attempting to determine writability at open time. I consider this part of the bug unimportant. It might not be possible to determine writablity without trying the write. Especially for devices whose writability can change while they are open. When you do something stupid like mounting a write-protected floppies read-write, you should just get i/o errors, and these errors should be handled properly just like any other i/o errors on the device. Proper i/o error handling doesn't include panicing or spewing error messages for each retry like the floppy driver does :-). Bruce To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200105020820.f428K3H97290>