The open2() API returns the updated attributes of the file. So, if
they changed
(for example because of a truncate) then we need a getattrs() to return the new
attributes. The actual truncation is taken care of by the actual open call
(GPFSFSAL_open() -> fsal_internal_handle2fd() ->
OPENHANDLE_OPEN_BY_HANDLE)
If a FSAL had an extended open call that returned attributes directly, then it
wouldn't need a separate getattrs().
It looks like MDCACHE invalidates the attributes on open2 by handle with truncate
though...
Frank
Daniel
On 08/07/2018 01:36 PM, Tuan Viet Nguyen wrote:
> Thanks Daniel,
>
> I've just tested it again and confirm that it works, sorry for the
> noise. But why in GPFS for example we getattrs in case of truncated
> instead of setting attrs with size and new ctime? (open_by_handle)
>
> Thank you
>
> On Tue, Aug 7, 2018 at 7:22 PM, Daniel Gryniewicz <dang(a)redhat.com
> <mailto:dang@redhat.com>> wrote:
>
> On 08/07/2018 01:03 PM, ntvietvn(a)gmail.com
> <mailto:ntvietvn@gmail.com> wrote:
>
> Hello,
>
> Can anyone explain how O_TRUNC is handled (open2)? When I try to
> open an existing file with this flag, the FSAL_O_TRUNC in
> openflags is not enabled in my FSAL open2 fct.
> While capturing with tcpdump, the NFS client actually sends a
> OPEN then SETATTR with size = 0 but not ctime.
>
> By looking at an example in open_by_handle, if IIUC if the flag
> O_TRUNC is there, we refresh the attrs by calling getattrs to
> attrs_out, I do not understand that, why it does that instead of
> calling setattrs ?
>
>
> It should work (and, in fact, passes tests, so it does...) Here's
> what happens:
>
> In nfs4_op_open() It checks the attributes to set for ATTR_SIZE, and
> if that's zero, it sets FSAL_O_TRUNC in openflags. This is passed to:
>
> fsal_open2(), which does the same check, and again sets FSAL_O_TRUNC
> in openflags. If there's no name (this is an open-by-handle),
> openflags is passed to obj_ops->open2(); if there's a name, it's
> passed to open2_by_name(), which passes it to obj_ops->open().
> Either way, it gets to:
>
> mdcache_open2() which calls mdc_open2_by_name() (if there's a name)
> which calls obj_ops->open2(), or directly calls obj_ops->open2(); in
> either case, that's calling into the FSAL with FSAL_O_TRUNC set.
> Once that returns, if that flag is set, MDCACHE invalidates the
> cached attributes for that handle.
>
> So, it looks like it should be working properly.
>
> Daniel
>
> _______________________________________________
> Devel mailing list -- devel(a)lists.nfs-ganesha.org
> <mailto:devel@lists.nfs-ganesha.org>
> To unsubscribe send an email to devel-leave(a)lists.nfs-ganesha.org
> <mailto:devel-leave@lists.nfs-ganesha.org>
>
>
_______________________________________________
Devel mailing list -- devel(a)lists.nfs-ganesha.org To unsubscribe send an email to
devel-leave(a)lists.nfs-ganesha.org