Kernel nofault copy and string paths open-code page-fault disable and enable around label-based loops, duplicating cleanup on success and failure. Use a page-fault scope guard instead. Leaving the scope now re-enables page faults on both paths without separate cleanup at the fault label. No functional change. Signed-off-by: Muhammad Usama Anjum --- mm/maccess.c | 53 +++++++++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/mm/maccess.c b/mm/maccess.c index c59a0e092d24a..f695ceefe6fcc 100644 --- a/mm/maccess.c +++ b/mm/maccess.c @@ -38,18 +38,17 @@ long copy_from_kernel_nofault(void *dst, const void *src, size_t size) if (!size) return 0; - pagefault_disable(); - if (!(align & 7)) - copy_from_kernel_nofault_loop(dst, src, size, u64, Efault); - if (!(align & 3)) - copy_from_kernel_nofault_loop(dst, src, size, u32, Efault); - if (!(align & 1)) - copy_from_kernel_nofault_loop(dst, src, size, u16, Efault); - copy_from_kernel_nofault_loop(dst, src, size, u8, Efault); - pagefault_enable(); + scoped_guard(pagefault) { + if (!(align & 7)) + copy_from_kernel_nofault_loop(dst, src, size, u64, Efault); + if (!(align & 3)) + copy_from_kernel_nofault_loop(dst, src, size, u32, Efault); + if (!(align & 1)) + copy_from_kernel_nofault_loop(dst, src, size, u16, Efault); + copy_from_kernel_nofault_loop(dst, src, size, u8, Efault); + } return 0; Efault: - pagefault_enable(); return -EFAULT; } EXPORT_SYMBOL_GPL(copy_from_kernel_nofault); @@ -73,18 +72,17 @@ long copy_to_kernel_nofault(void *dst, const void *src, size_t size) if (!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)) align = (unsigned long)dst | (unsigned long)src; - pagefault_disable(); - if (!(align & 7)) - copy_to_kernel_nofault_loop(dst, src, size, u64, Efault); - if (!(align & 3)) - copy_to_kernel_nofault_loop(dst, src, size, u32, Efault); - if (!(align & 1)) - copy_to_kernel_nofault_loop(dst, src, size, u16, Efault); - copy_to_kernel_nofault_loop(dst, src, size, u8, Efault); - pagefault_enable(); + scoped_guard(pagefault) { + if (!(align & 7)) + copy_to_kernel_nofault_loop(dst, src, size, u64, Efault); + if (!(align & 3)) + copy_to_kernel_nofault_loop(dst, src, size, u32, Efault); + if (!(align & 1)) + copy_to_kernel_nofault_loop(dst, src, size, u16, Efault); + copy_to_kernel_nofault_loop(dst, src, size, u8, Efault); + } return 0; Efault: - pagefault_enable(); return -EFAULT; } @@ -97,18 +95,17 @@ long strncpy_from_kernel_nofault(char *dst, const void *unsafe_addr, long count) if (!copy_from_kernel_nofault_allowed(unsafe_addr, count)) return -ERANGE; - pagefault_disable(); - do { - __get_kernel_nofault(dst, src, u8, Efault); - dst++; - src++; - } while (dst[-1] && src - unsafe_addr < count); - pagefault_enable(); + scoped_guard(pagefault) { + do { + __get_kernel_nofault(dst, src, u8, Efault); + dst++; + src++; + } while (dst[-1] && src - unsafe_addr < count); + } dst[-1] = '\0'; return src - unsafe_addr; Efault: - pagefault_enable(); dst[0] = '\0'; return -EFAULT; } -- 2.47.3