Re: [RFC PATCH 3/3] add listmnt(2) syscall

From: Miklos Szeredi
Date: Thu Sep 14 2023 - 04:50:22 EST


On Thu, 14 Sept 2023 at 08:00, Amir Goldstein <amir73il@xxxxxxxxx> wrote:

> > + if (ctr >= bufsize)
> > + return -EOVERFLOW;
> > + if (put_user(r->mnt_id_unique, buf + ctr))
> > + return -EFAULT;
> > + ctr++;
> > + if (ctr < 0)
> > + return -ERANGE;
>
> I think it'd be good for userspace to be able to query required
> bufsize with NULL buf, listattr style, rather than having to
> guess and re-guess on EOVERFLOW.

The getxattr/listxattr style encourages the following code:

size = get(NULL, 0);
buf = alloc(size);
err = get(buf, size);
if (err)
/* failure */

Which is wrong, since the needed buffer size could change between the two calls.

Doing it iteratively is the only correct way, and then adding
complexity to both userspace and the kernel for *optimizing* the
iteration is not really worth it, IMO.

Thanks,
Miklos