Messages in this thread | | | From | Linus Torvalds <> | Date | Sat, 24 Jul 2021 12:52:34 -0700 | Subject | Re: [PATCH v4 1/8] iov_iter: Introduce iov_iter_fault_in_writeable helper |
| |
On Sat, Jul 24, 2021 at 12:35 PM Andreas Gruenbacher <agruenba@redhat.com> wrote: > > +int iov_iter_fault_in_writeable(const struct iov_iter *i, size_t bytes) > +{ ... > + if (fault_in_user_pages(start, len, true) != len) > + return -EFAULT;
Looking at this once more, I think this is likely wrong.
Why?
Because any user can/should only care about at least *part* of the area being writable.
Imagine that you're doing a large read. If the *first* page is writable, you should still return the partial read, not -EFAULT.
So I think the code needs to return 0 if _any_ fault was successful. Or perhaps return how much it was able to fault in. Because returning -EFAULT if any of it failed seems wrong, and doesn't allow for partial success being reported.
The other reaction I have is that you now only do the iov_iter_fault_in_writeable, but then you make fault_in_user_pages() still have that "bool write" argument.
We already have 'fault_in_pages_readable()', and that one is more efficient (well, at least if the fault isn't needed it is). So it would make more sense to just implement fault_in_pages_writable() instead of that "fault_in_user_pages(, bool write)".
Linus
| |