Re: [PATCH 0/2] sys_write() should write all valid data

From: Josef Bacik
Date: Thu May 14 2009 - 14:03:55 EST


On Thu, May 14, 2009 at 06:18:59PM +0200, Vitaly Mayatskikh wrote:
> There's user-visible misbehavour in sys_write(): when user tries to put
> down to disk some data, which crosses boundary of existing memory, sys_write()
> either immediately returns with EFAULT or writes first page(s).
>
> Next 2 patches make sys_write()'s behaviour more consistent: it tries now
> to write down all what it can.
>
> Vitaly Mayatskikh (2):
> Introduce check_readable_bytes()
> Perform checks in iov_iter_fault_in_readable() with
> check_readable_bytes()
>
> fs/fuse/file.c | 6 ++++--
> include/linux/pagemap.h | 35 +++++++++++++++++++++++++++++++++++
> mm/filemap.c | 13 +++++++++----
> 3 files changed, 48 insertions(+), 6 deletions(-)
>

Ok all in all I don't think this is a good way to handle this problem.
Hopefully somebody smarter than I will speak up, but what you are trying to do
here is have your cake and eat it too. You want to get the size of what we were
able to fault in and return that, which should be a size_t, but you also want to
throw back an error if something happened, which needs a signed value. I think
the best way to handle this would be to make check_readable_bytes return size_t,
and then if you get an EFAULT back, have it return 0. Then the caller can say
"hey I couldn't fault anything in, let me make what I want to fault in smaller",
and then if that fault returns 0 we can exit. I hope thats helpful/correct :).
Thanks,

Josef
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/