Re: [PATCH 1/1] NFSD fix handling of NFSv4.2 SEEK for data within the last hole

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Apr 13, 2021 at 11:31:51AM -0400, Olga Kornievskaia wrote:
> On Tue, Apr 13, 2021 at 11:01 AM J. Bruce Fields <bfields@xxxxxxxxxx> wrote:
> >
> > On Sun, Apr 11, 2021 at 04:43:22PM +0000, Chuck Lever III wrote:
> > >
> > >
> > > > On Apr 9, 2021, at 2:39 PM, Olga Kornievskaia <olga.kornievskaia@xxxxxxxxx> wrote:
> > > >
> > > > On Fri, Apr 2, 2021 at 10:32 AM J. Bruce Fields <bfields@xxxxxxxxxx> wrote:
> > > >>
> > > >> On Thu, Apr 01, 2021 at 09:27:56AM -0400, Olga Kornievskaia wrote:
> > > >>> On Wed, Mar 31, 2021 at 9:50 PM J. Bruce Fields <bfields@xxxxxxxxxx> wrote:
> > > >>>>
> > > >>>> On Wed, Mar 31, 2021 at 03:28:19PM -0400, Olga Kornievskaia wrote:
> > > >>>>> From: Olga Kornievskaia <kolga@xxxxxxxxxx>
> > > >>>>>
> > > >>>>> According to the RFC 7862, "if the server cannot find a
> > > >>>>> corresponding sa_what, then the status will still be NFS4_OK,
> > > >>>>> but sr_eof would be TRUE". If there is a file that ends with
> > > >>>>> a hole and a SEEK request made for sa_what=SEEK_DATA with
> > > >>>>> an offset in the middle of the last hole, then the server
> > > >>>>> has to return OK and set the eof. Currently the linux server
> > > >>>>> returns ERR_NXIO.
> > > >>>>
> > > >>>> Makes sense, but I think you can use the return value from vfs_llseek
> > > >>>> instead of checking the file size again.  E.g.:
> > > >>>>
> > > >>>>        seek->seek_pos = vfs_llseek(nfs->nf_file, seek->seek_offset, whence);
> > > >>>>        if (seek->seek_pos == -ENXIO)
> > > >>>>                seek->seek_eof = true;
> > > >>>
> > > >>> I don't believe this is correct. (1) ENXIO doesn't imply eof. If the
> > > >>> specified seek_offset was beyond the end of the file the server must
> > > >>> return ERR_NXIO and not OK.
> > > >>
> > > >> OK, never mind.
> > > >>
> > > >>> and (2) for the same reason I need to
> > > >>> check if the requested type was looking for data but didn't find it
> > > >>> because the offset is in the middle of the hole but still within the
> > > >>> file size (thus the need to check if the seek_offset is within the
> > > >>> file size). But I'm happy to check specifically if the seek_pos was
> > > >>> ENXIO (and not the generic negative error) and then also check if
> > > >>> request was for data and request was within file size.
> > > >>>
> > > >>> Also while I'm fixing this and have your attention, Can you tell if
> > > >>> the "else if" condition in the original code makes sense to you. I
> > > >>> didn't touch it but I don't think it's correct. "else if
> > > >>> (seek->seek_pos >= i_size_read(file_inode(nf->nf_file)))" I don't
> > > >>> believe this can ever happen. How can vfs_llseek() ever return a
> > > >>> position that is greater than the size of the file (or actually even
> > > >>> equal to it)?
> > > >>
> > > >> I agree, I don't get it either.
> > > >
> > > > Any more thoughts about the forward progress of this patch? Are you
> > > > interested in taking it?
> > >
> > > Bruce and I discussed this privately a few days back. He asked
> > > that I not merge it until the client compatibility issue is
> > > resolved. Bruce, please chime in if I misunderstood you.
> >
> > Honestly, I haven't even looked at what the issue is.  I think Olga
> > agreed with Rick that there was one, though?
> 
> I agree that the client is broken. I have a client side patch that was
> posted alongside the server side patch. I think Trond should be taking
> it for whatever the next push will be. But yes the server side needs
> to worry about the existing broken clients that are out there
> currently. I'm not sure what the implications are. So what happens
> with the fixed server is that for the request for DATA in the last
> hole, the server would return OK, eof and offset that max_int (-1)
> (previously it would be an error). Broken client would return that
> address back in the system call. If the application tries to read from
> it, it would not get anything (0, oef).
> 
> I think I'll repost the v2 and then I'll let you decide when and how
> you want to take it. The client will soon be able to handle both but
> it doesn't require the server to be fixed.

OK.  I don't particularly want to create a situation where a server
upgrade requires a client upgrade, so I don't think we'd want to take it
now, but post it anyway, for posterity's sake--maybe the tradeoffs would
be different in a few years.

--b.



[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux