Re: [PATCH v2 2/2] string: use offset_in_page() in sized_strscpy()

From: Lorenzo Stoakes

Date: Thu May 21 2026 - 07:34:53 EST


On Thu, May 21, 2026 at 11:06:58AM +0200, Thorsten Blum wrote:
> Replace the open-coded implementation with offset_in_page() to simplify
> sized_strscpy().
>
> Signed-off-by: Thorsten Blum <thorsten.blum@xxxxxxxxx>

I feel this patch actually makes sized_strscpy() more difficult to understand
unfortunately, so not really in favour of us taking it.

> ---
> lib/string.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/lib/string.c b/lib/string.c
> index 1f9297e9776a..7c72adc7377c 100644
> --- a/lib/string.c
> +++ b/lib/string.c
> @@ -25,6 +25,7 @@
> #include <linux/stddef.h>
> #include <linux/string.h>
> #include <linux/types.h>
> +#include <vdso/page.h>
>
> #include <asm/page.h>
> #include <asm/rwonce.h>
> @@ -127,7 +128,7 @@ ssize_t sized_strscpy(char *dest, const char *src, size_t count)
> * since we don't know if the next page is mapped.
> */
> if ((long)src & (sizeof(long) - 1))
> - max = min(PAGE_SIZE - ((long)src & (PAGE_SIZE - 1)), max);
> + max = min(PAGE_SIZE - offset_in_page(src), max);

This isn't strictly the same code, offset_in_page() is:

#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK)

So this is now, effectively:

- max = min(PAGE_SIZE - ((long)src & (PAGE_SIZE - 1)), max);
+ max = min(PAGE_SIZE - ((unsigned long)src & (PAGE_SIZE -1)), max);

So there could be some issues here with type conversions at least in theory.

But in any case you're now making the logic inconsistent (the next line uses
bitwise operations directly).

So I'd rather we didn't make this change.

> #else
> /* If src or dest is unaligned, don't do word-at-a-time. */
> if (((long) dest | (long) src) & (sizeof(long) - 1))

I'm generally not hugely fond of this 'do a sample case to demonstrate that mm.h
doesn't need to be imported' approach.

Either make the change properly and consistently, or not at all.

Anyway, I'm fine with you just sending a v3 as a single patch moving
offset_in_page() to vdso/page.h then you can defer the use cases if you like?

Cheers, Lorenzo