Re: [PATCH 3/6] ubifs: Use 64bit readdir cookies

From: J. Bruce Fields
Date: Thu Dec 29 2016 - 11:59:25 EST


On Thu, Dec 29, 2016 at 05:36:35PM +0100, Richard Weinberger wrote:
> Bruce,
>
> On 29.12.2016 17:15, J. Bruce Fields wrote:
> > On Thu, Dec 29, 2016 at 04:49:54PM +0100, Richard Weinberger wrote:
> >> Bruce,
> >>
> >> On 29.12.2016 16:34, J. Bruce Fields wrote:
> >>>> That way UBIFS can provide a 64bit readdir() cookie which is required for NFS3.
> >>>
> >>> Sounds good. And if a matching entry isn't found (as in the case of a
> >>> concurrent unlink), what happens? The answer must be the same as for
> >>> ext4, but I've forgotten the details.... I guess it must find the next
> >>> highest cookie (thinking of the cookie as a 64-bit integer of some kind)
> >>> that exists in the directory. And that must be the same order that
> >>> readdir normally returns entries in.
> >>
> >> If a 64bit cookie is not found, the lookup function returns -ENOENT.
> >> In UBIFS we cannot just select a higher or lower key (cookie in this case),
> >> since it is the B-tree key and would point to a completely different
> >> entry.
> >>
> >> So, in case of a concurrent unlink() one would succeed and one fail with
> >> -ENOENT. Unless I miss something that seems okay to me.
> >
> > Unlink takes (parent directory, name), not a directory cookie.
> >
> > The problem is concurrent unlink and nfs readdir. So:
> >
> > NFS server returns readdir result with cookie X
> >
> > Somebody unlinks the entry at X.
> >
> > NFS server gets readdir request with cookie X.
> >
> > Then the NFS client will get a spurious -ENOENT.
>
> Ah yes. Sorry I misunderstood your question.
> UBIFS readdir() address this already, if you ask it to readdir()
> from pos X and X is not present it will jump to the next best entry X'.
> UBIFS does so since ever.

OK, good. So the random nonce is stored with the entry, and the hash
you can always recalculate from the filename, so if you return entries
in nonce+hash order, then you can keep that order stable even across
deletes and renames.

--b.