Re: git: 1c2be25f6080 - main - Add extra EINVAL information about wrong block size to read(2)/write(2)

From: Konstantin Belousov <kostikbel_at_gmail.com>
Date: Sat, 08 Oct 2022 06:58:36 UTC
On Sat, Oct 08, 2022 at 08:52:26AM +0200, Hans Petter Selasky wrote:
> On 10/8/22 02:48, Konstantin Belousov wrote:
> > On Fri, Oct 07, 2022 at 11:39:04AM +0000, Benedict Reuschling wrote:
> > > The branch main has been updated by bcr (doc committer):
> > > 
> > > URL: https://cgit.FreeBSD.org/src/commit/?id=1c2be25f6080ee63baeae55e45761e1310d1b756
> > > 
> > > commit 1c2be25f6080ee63baeae55e45761e1310d1b756
> > > Author:     Benedict Reuschling <bcr@FreeBSD.org>
> > > AuthorDate: 2022-10-07 11:32:37 +0000
> > > Commit:     Benedict Reuschling <bcr@FreeBSD.org>
> > > CommitDate: 2022-10-07 11:32:37 +0000
> > > 
> > >      Add extra EINVAL information about wrong block size to read(2)/write(2)
> > >      The read system call will return EINVAL if the current file offset is
> > >      not a multiple of the block size. This also applies to write(2). Add an
> > >      entry for EINVAL about this error to both man pages.
> > >      PR:                     91149
> > >      Event:                  Aberdeen Hackathon 2022
> > >      Differential Revision:  https://reviews.freebsd.org/D24617
> > > ---
> > >   lib/libc/sys/read.2  | 4 +++-
> > >   lib/libc/sys/write.2 | 4 +++-
> > >   2 files changed, 6 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/lib/libc/sys/read.2 b/lib/libc/sys/read.2
> > > index 8b58debd3fbb..28d085562af3 100644
> > > --- a/lib/libc/sys/read.2
> > > +++ b/lib/libc/sys/read.2
> > > @@ -28,7 +28,7 @@
> > >   .\"     @(#)read.2	8.4 (Berkeley) 2/26/94
> > >   .\" $FreeBSD$
> > >   .\"
> > > -.Dd June 4, 2020
> > > +.Dd October 7, 2022
> > >   .Dt READ 2
> > >   .Os
> > >   .Sh NAME
> > > @@ -250,6 +250,8 @@ The sum of the
> > >   values in the
> > >   .Fa iov
> > >   array overflowed a 32-bit integer.
> > > +.It Bq Er EINVAL
> > > +The current file offset is not a multiple of the block size.
> > >   .It Bq Er EFAULT
> > >   Part of the
> > >   .Fa iov
> > > diff --git a/lib/libc/sys/write.2 b/lib/libc/sys/write.2
> > > index 937e95b53a14..048338ed4dee 100644
> > > --- a/lib/libc/sys/write.2
> > > +++ b/lib/libc/sys/write.2
> > > @@ -28,7 +28,7 @@
> > >   .\"     @(#)write.2	8.5 (Berkeley) 4/2/94
> > >   .\" $FreeBSD$
> > >   .\"
> > > -.Dd February 11, 2021
> > > +.Dd October 7, 2022
> > >   .Dt WRITE 2
> > >   .Os
> > >   .Sh NAME
> > > @@ -205,6 +205,8 @@ is greater than
> > >   if the sysctl
> > >   .Va debug.iosize_max_clamp
> > >   is non-zero).
> > > +.It Bq Er EINVAL
> > > +The current file offset is not a multiple of the block size.
> > This is bogus.  It does not.  You can perfectly write at arbitrary regular
> > file offset.
> > 
> 
> If you have a 4K block size character device, geom doesn't support writing /
> reading 515 byte blocks .... The description is maybe not applicable for all
> EINVAL's returned.

This is why I specified the 'regular file' in my response.  Obviously, a
write to the disk driver special file is much more uncommon thing, and
devfs nodes provide a lot of unusual semantics, which is unlikely worth
mentioning in the generic write(2) syscall documentation.

It is bogus to list these cases as generic error conditions.