Re: RFC: Dealing with large POSIX draft ACLs for NFSv4.2

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

 



On Tue, Oct 22, 2024 at 8:03 AM Rick Macklem <rick.macklem@xxxxxxxxx> wrote:
>
> On Tue, Oct 22, 2024 at 5:28 AM Chuck Lever III <chuck.lever@xxxxxxxxxx> wrote:
> >
> >
> >
> > > On Oct 21, 2024, at 6:33 PM, Rick Macklem <rick.macklem@xxxxxxxxx> wrote:
> > >
> > > On Mon, Oct 21, 2024 at 7:45 AM Chuck Lever III <chuck.lever@xxxxxxxxxx> wrote:
> > >>
> > >>
> > >>
> > >>> On Oct 20, 2024, at 7:09 PM, Rick Macklem <rick.macklem@xxxxxxxxx> wrote:
> > >>>
> > >>> Hi,
> > >>>
> > >>> As some of you will already know, I have been working on patches
> > >>> that add support for POSIX draft ACLs to NFSv4.2.
> > >>> The internet draft can be found here, if you are interested.
> > >>> https://datatracker.ietf.org/doc/draft-rmacklem-nfsv4-posix-acls/
> > >>>
> > >>> The patches now basically work, but handling of large POSIX
> > >>> draft ACLs for the server side is not done yet.
> > >>>
> > >>> A POSIX draft ACL can have 1024 aces and since a "who" field
> > >>> can be 128 bytes, a POSIX draft ACL can end up being about 140Kbytes
> > >>> of XDR. Do both the default and access ACLs for a directory and it
> > >>> could be 280Kbytes. (Of course, they usually end up much smaller.)
> > >>>
> > >>> For the client side, to handle large ACLs for SETATTR (which never
> > >>> sets other attributes in the same SETATTR), I came up with some
> > >>> simple functions (called nfs_xdr_putpage_bytes(), nfs_xdr_putpage_word()
> > >>> and nfs_xdr_putpage_cleanup() in the current client.patch) which
> > >>> fill the large ACL into pages. Then xdr_write_pages() is called to
> > >>> put them in the xdr stream.
> > >>> --> Whether this is the right approach is a good question, but at
> > >>>     least it seems to work.
> > >>>
> > >>> For the server, the problem is more difficult, since a GETATTR reply
> > >>> might include encodings of other attributes. (At this time, the proposed
> > >>> POSIX draft ACL attributes are at the end, since they have the highest
> > >>> attribute #s, but that will not last long.)
> > >>>
> > >>> The same technique as for the client could be used, but only if there
> > >>> are no attributes that come after the POSIX draft ACL ones in the XDR
> > >>> for GETATTR's reply.
> > >>>
> > >>> This brings me to one question...
> > >>> - What do others think w.r.t. restricting the POSIX draft ACLs to only
> > >>> GETATTR (and not a READDIR reply) and only with a limited set
> > >>> of other attributes, which will all be lower #s, so they come before
> > >>> POSIX draft ACL ones?
> > >>> --> Since it is only a personal draft at this time, this requirement
> > >>>       could easily be added and may make sense to limit the size
> > >>>        of most GETATTRs.
> > >>> This restriction should be ok for both the LInux and FreeBSD clients,
> > >>> since they only ask for acl attributes when a getfacl(1) command is
> > >>> done and do not need a lot of other attributes for the GETATTR.
> > >>
> > >> Generally, I don't immediately see why POSIX ACLs need a restriction
> > >> that the protocol doesn't already have for NFSv4 ACLs.
> > >>
> > >>
> > >>> Alternately, there needs to be a way to build 280Kbytes or more
> > >>> of XDR for an arbitrary GETATTR/READDIR reply.
> > >>
> > >> IIUC, NFSD already handles this for both READDIR and NFSv4 ACLs
> > >> (and perhaps also GETXATTR / LISTXATTR).
> > >>
> > >> So I'll have to have a look at your specific implementation,
> > >> maybe sometime this week. I can't think of a reason that our
> > >> current XDR and NFSD implementation wouldn't handle this, but
> > >> haven't thought deeply about it.
> > >>
> > >> It might not be efficient for large ACLs, but does it need
> > >> to be?
> > > Nope, it doesn't need to be...
> > > Well, this in embarrassing (blush!).
> > > It turns out it works fine for GETATTR of a large ACL (either the
> > > acl attribute or the new ones added by the patch).
> > >
> > > For the client side, I could have sworn I needed to do the
> > > "fill in the page stuff" to get the large one to work for SETATTR,
> > > but for the knfsd, it figures it out.
I tested this further and it does seem to be this way.
For SETATTR done by the client, the xdr_stream_encode_XXX()
functions fail for large ACLs. As such, something needs to be done.
Right now, the client code fills the ACL into pages and then does a
xdr_write_pages() for the large ones.
--> Does anyone know of a better way than filling in pages and then
      doing xdr_write_pages()?

For GETATTR done by the server, it handles large ACLs fine.
(It also allocates a scratch buffer, so the patch I wrote didn't need
to do so.)

rick

> > >
> > > Btw, I was only able to get to about 60K, because the ext4 fs
> > > I have on the server wouldn't allow an ACL with 1000 entries to
> > > be set (replied with out of space on device).
> > > --> I did get one with 455 entries to work and most of those entries
> > >      were for 110 byte group names.
> >
> > IIRC the Linux file systems have a 64KB length limit on extended
> > attributes, where ACLs are stored.
> >
> > ENOSPC is a little strange.
> Well, when I did this, it had nothing to do with NFS. (I did the setfacl
> locally on the server.)
> I will try a test doing the same setfacl over NFSv4 sometime to-day
> to see what happens.
>
> The good news is that the "hard problem" I thought existed doesn't
> exist. I will try the client without the "use pages code" and see if
> the client really needs the change or not.
>
> If you are interested in trying it, I left two files "groups" and "bigacl"
> on the nfsv4-newlap server. All you do is put "groups" in your group
> database and then "setfacl -M bigacl <file>".
> (Oh, and I usually "echo N > /sys/module/nfsd/parameters/nfs4_disable_idmapping"
> so it uses names instead of #s for the groups, but you can try both ways.)
> --> I think the ENOSPC failure occurs either way.
>
> Anyhow, thanks for pointing out that big acls already worked
> and sorry for the noise, rick
>
> >
> >
> > > So, what can I say, except I should have tried it before I posted.
> > > (One gotcha is that FreeBSD only handles 32 ACE ACLs, but
> > > when you look at the packet trace, you can see they are all in
> > > the GETATTR reply. Not an excuse, but...)
> > >
> > > Thanks for the reply Chuck, rick
> > >
> > >>
> > >>
> > >>> Btw, I have not tested to see what happens if a large POSIX draft
> > >>> ACL is set for a file (locally on the server, for example) and then
> > >>> a client does a GETATTR of the acl attribute (which replies with
> > >>> a NFSv4 ACL created by mapping from the POSIX draft ACL).
> > >>> --> I have a hunch it will fail, but I need to test to be sure?
> > >>>
> > >>> Thanks in advance for any comments w.r.t. this issue, rick
> > >>> ps; In particular, I'd like to know what others think about adding
> > >>>     the restriction on acquisition of the POSIX draft ACLs by GETATTR.
> > >>
> > >>
> > >>
> > >>
> > >> --
> > >> Chuck Lever
> >
> >
> > --
> > Chuck Lever
> >
> >





[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