Am 19.02.2010, 06:03 Uhr, schrieb Tim Kientzle <kient...@freebsd.org>:

Joerg Sonnenberger wrote:
On Thu, Feb 18, 2010 at 07:34:59PM +0100, Juergen Lock wrote:
 Ok here is a new version of the patch with these things fixed and the
Linux case added:  (Linux case not tested yet, and yes I did this on
stable/8.)
Why the check at all? Shouldn't devices that don't allow seek fail that?
E.g. for devices, just try to seek ahead and fallback to normal reading?

That was the initial implementation in libarchive, but
I had a number of reports of that not working for
tape drives.  I recently dug out and connected an
old DDS drive I had in the closet, so I should
probably try again and see if I misunderstood
something along the way.

I'd already written this in a private email to Tim before I came across this continued discussion on -hackers@, I'll paste a modified version of my own part:

I strongly believe that someone should really fix lseek() in FreeBSD outside GEOM. There is precedence, namely <http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/60313> and it was never properly fixed. The PR was closed because the actual reported problem on da(4) no longer occurred since FreeBSD 5 after the GEOM migration, and my issue was with da(4) on FreeBSD 4.

Now I'm learning that the very same bug persists through -CURRENT nearly a decade later: after lseek devices such as sa(4) will return "garbage" (i. e. from the unchanged offset) rather than failing.

It should be sorted out before 8.1.

Am I naive if I expect lseek to return (off_t)-1 with errno == ESPIPE on non-seekable devices? I'll concede that sa(4) is neither socket nor pipe nor fifo in the strict sense, but all share the non-seekability.

If lseek() can't know the device isn't seekable, subsequent I/O operations should return EIO along with a proper kernel log message for the first occasion per process, but that would not help applications or libarchive for that matter - they will need a canonical way to find out if a device is seekable. Unfortunately FreeBSD maps many physical block devices that are unbuffered to character special device nodes, so the obvious way of calling [f]stat() and then checking S_ISBLK(st.st_mode) will return FALSE even for devices that can seek.

--
Matthias Andree
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"

Reply via email to