Location of seek pointer after read error?
Dominic Dunlop
domo at tsa.co.uk
Wed Jul 25 19:49:41 AEST 1990
From: Dominic Dunlop <domo at tsa.co.uk>
[Moderator: please cross-post to comp.unix.wizards -- or let me know that
you won't cross-post to unmoderated groups]
[I prefer not to cross post, but I sometimes do so if the number of
newsgroups is small, the subject matter is appropriate, and especially
if there's a Followup-To. -mod]
In article <1990Jul23.171022.17798 at phri.nyu.edu> roy at alanine.phri.nyu.edu
(Roy Smith) writes:
>The SunOS-3.5.2 man page for read(2) says:
>
> On objects capable of seeking, the read starts at a position
> given by the pointer associated with d (see lseek(2)). Upon
> return from read, the pointer is incremented by the number
> of bytes actually read.
>
Ah. Isn't this interesting? Here's what POSIX.1 (ANSI/IEEE Std.
1003.1:1988) has to say:
On a regular file or other file capable of seeking, read() shall
start at a position in the file given by the file offset associated
with fildes. Before successful return from read(), the file
offset shall be incremented by the number of bytes actually read.
>Now, if you are reading from a raw disk partition (say /dev/rxy0a) and get
>a read error (because, for example, there is a bad block on the disk),
>where should the pointer be after the read(2) call returns? It turns out
>that, at least for SunOS-3.5.2, the pointer is incremented, as if the bytes
>in the bad block had actually been read. I would consider this incorrect
>behavior. Do you agree?
>
Looking at the tighter and arguably sneakier wording of the standard,
it appears that all bets are off as to the value of the file offset
after an error. Sure enough, the rationale says:
The standard does not specify the value of the file offset after an
error is returned; there are too many cases. For programming
errors, such as [EBADF], the concept is meaningless since no file
is involved. For errors that are detected immediately, such as
[EAGAIN], clearly the pointer should not change. After an
interrupt or hardware error, however, an updated value would be
very useful, and this is the behavior of many implementations.
References to actions taken on an ``unrecoverable error'' have been
removed [from the standard]. It is considered beyond the scope of
this standard to describe what happens in the case of hardware
errors.
So, you'll be nonplussed to learn that SunOS' behaviour, which I agree is
less useful than it could be, is POSIX-conformant.
>[Description of writing program which repeatedly seeked back to start of
>failing blocks, and so eventually recovered slightly soft errors deleted.]
Should Sun wish to modify their drivers so that the file pointer points to
the start of a failing block after an error, that behaviour too would be
POSIX conformant. You can't legislate for everything...
>"Arcane? Did you say arcane? It wouldn't be Unix if it wasn't arcane!"
Wouldn't be POSIX either...
--
Dominic Dunlop
Volume-Number: Volume 20, Number 144
More information about the Comp.std.unix
mailing list