Re: [git pull] vfs.git pile 2

From: Al Viro
Date: Sat Dec 17 2016 - 22:26:32 EST


[Darrick Cc'd]
On Sat, Dec 17, 2016 at 06:49:55PM -0800, Linus Torvalds wrote:
> On Fri, Dec 16, 2016 at 2:12 PM, Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote:
> > In this pile:
> > * autofs-namespace series
> > * dedupe stuff
> > * more struct path constification
>
> When looking at the conflict, I looked at that part of
> vfs_clone_file_prep_inodes(), and reacted to the insanity.
>
> WTF?
>
> /* Zero length dedupe exits immediately; reflink goes to EOF. */
> if (*len == 0) {
> if (is_dedupe) {
> *len = 0;
> return 0;
> }
> *len = isize - pos_in;
> }
>
> I'll just leave you to read through that part a bit more. Because
> there are two completely insane things going on in that code sequence.

One, AFAICS - pointless *len = 0 in case of is_dedupe. That's a counterpart of
/* Zero length dedupe exits immediately; reflink goes to EOF. */
if (len == 0) {
if (is_dedupe) {
ret = 0;
goto out_unlock;
}
len = isize - pos_in;
}
in mainline xfs_reflink_remap_range(). What else am I missing there?
I'm not thrilled with the calling conventions they'd used, and that
*len = 0; shouldn't have been slapped there (at a guess, by inertia from
the conversion of the chunk right before that one -
/* Are we going all the way to the end? */
isize = i_size_read(inode_in);
if (isize == 0) {
ret = 0;
goto out_unlock;
}
in mainline, needing *len = 0; after conversion), but I don't see what else
are you refering to in that snippet...