Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.1/patches/2229046/?format=api
{ "id": 2229046, "url": "http://patchwork.ozlabs.org/api/1.1/patches/2229046/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-um/patch/289b424e243ba2c4139ea04009cf8b9c448a87ff.1777306795.git.chleroy@kernel.org/", "project": { "id": 60, "url": "http://patchwork.ozlabs.org/api/1.1/projects/60/?format=api", "name": "User-mode Linux Development", "link_name": "linux-um", "list_id": "linux-um.lists.infradead.org", "list_email": "linux-um@lists.infradead.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<289b424e243ba2c4139ea04009cf8b9c448a87ff.1777306795.git.chleroy@kernel.org>", "date": "2026-04-27T17:13:46", "name": "[RFC,v1,5/9] uaccess: Switch to copy_{to/from}_user_partial() when relevant", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "73ffbaa97b9682158b101dae5b6a0c4f49588370", "submitter": { "id": 92089, "url": "http://patchwork.ozlabs.org/api/1.1/people/92089/?format=api", "name": "Christophe Leroy (CS GROUP)", "email": "chleroy@kernel.org" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-um/patch/289b424e243ba2c4139ea04009cf8b9c448a87ff.1777306795.git.chleroy@kernel.org/mbox/", "series": [ { "id": 501693, "url": "http://patchwork.ozlabs.org/api/1.1/series/501693/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-um/list/?series=501693", "date": "2026-04-27T17:13:41", "name": "uaccess: Convert small fixed size copy_{to/from}_user() to scoped user access", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/501693/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2229046/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2229046/checks/", "tags": {}, "headers": { "Return-Path": "\n <linux-um-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=lists.infradead.org header.i=@lists.infradead.org\n header.a=rsa-sha256 header.s=bombadil.20210309 header.b=D4TFkMOk;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=VVYqWJ9y;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=none (no SPF record) smtp.mailfrom=lists.infradead.org\n (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org;\n envelope-from=linux-um-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from bombadil.infradead.org (bombadil.infradead.org\n [IPv6:2607:7c80:54:3::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g49Jc1vHkz1yJX\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 28 Apr 2026 03:18:40 +1000 (AEST)", "from localhost ([::1] helo=bombadil.infradead.org)\n\tby bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1wHPbS-0000000HRLj-1nkZ;\n\tMon, 27 Apr 2026 17:18:38 +0000", "from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25])\n\tby bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1wHPbN-0000000HRGJ-0x2K;\n\tMon, 27 Apr 2026 17:18:35 +0000", "from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58])\n\tby sea.source.kernel.org (Postfix) with ESMTP id CA32543766;\n\tMon, 27 Apr 2026 17:18:32 +0000 (UTC)", "by smtp.kernel.org (Postfix) with ESMTPSA id 31802C2BCF4;\n\tMon, 27 Apr 2026 17:18:17 +0000 (UTC)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help\n\t:List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding:\n\tMIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:\n\tReply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From:\n\tResent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner;\n\tbh=GGFJibLNHsesPNVvHB+m7h4/MAYdiGmNUXrR13pEouE=; b=D4TFkMOkvM4WKDRBEm3OEXEtF9\n\t8/w2xyT7frBPiXd+GTaR9wJG1/kIpGZRmmWKe3x49+XWd6nnw7EeCY3ka0eWnMBkQL3udQRQvqM7c\n\tGGlLug3kN+MdpxD1fUp5RAkDYOL6WJ3qXOdR2167jxQhHh7KjlF1q4/eGb5qRSkScFazsFBUGuLRd\n\tl+3GrOHqqE4LFxf+gXywio+CERLbzmjo6sjvUoCfi98N9m2lbxH+pNgsiZNgmb8s6sbrpl3AOS8bY\n\ttEyzmviFKWUvdmoII8h/6UNcVJcT2dzRBrdNczCVXXkJDLb44NsXek7ZTIdJdeTP+mNul6JBxtY4j\n\tYO0yhr0w==;", "v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1777310312;\n\tbh=ykb2AFsFlD4OWf31v2pDwxXHhaD6RIAaFdGo66PLJJQ=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=VVYqWJ9y3YbZh7SD1t9FZfVCwwasAh9H5TbUiJGW0WBLo8QeGfk22g4AfRfUPPWqU\n\t Aoc8LlWA/aSMgy9dc9PmA3AGYLZUU5W7rwnOfj07vTIJFBwTSF9yiiM4DvkX1/MBQu\n\t db67uJWBEaWIGjEVq27JeF6TjgL+v+lGhLnh5fqlRmMpg7nUlTADncH5wD5lENeOzx\n\t AnSeuD99A4n/GOBDGHS6YE5DsSz3FUwz6A+06zvkQMMGJou23G/4wgzSuudbgGF0+O\n\t Dmr1a73NapDMfoHC1BZSTwINTaDSDCQgyzzeSi4wB6M2kWQzSVBg/2nN/ihP2WWDMt\n\t aSuTg8ZLqpxJg==" ], "From": "\"Christophe Leroy (CS GROUP)\" <chleroy@kernel.org>", "To": "Yury Norov <ynorov@nvidia.com>,\n\tAndrew Morton <akpm@linux-foundation.org>,\n\tLinus Torvalds <torvalds@linux-foundation.org>,\n\tDavid Laight <david.laight.linux@gmail.com>,\n\tThomas Gleixner <tglx@linutronix.de>", "Cc": "\"Christophe Leroy (CS GROUP)\" <chleroy@kernel.org>,\n\tlinux-alpha@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org,\n\tlinux-snps-arc@lists.infradead.org,\n\tlinux-arm-kernel@lists.infradead.org,\n\tlinux-mips@vger.kernel.org,\n\tlinuxppc-dev@lists.ozlabs.org,\n\tkvm@vger.kernel.org,\n\tlinux-riscv@lists.infradead.org,\n\tlinux-s390@vger.kernel.org,\n\tsparclinux@vger.kernel.org,\n\tlinux-um@lists.infradead.org,\n\tdmaengine@vger.kernel.org,\n\tlinux-efi@vger.kernel.org,\n\tlinux-fsi@lists.ozlabs.org,\n\tamd-gfx@lists.freedesktop.org,\n\tdri-devel@lists.freedesktop.org,\n\tintel-gfx@lists.freedesktop.org,\n\tlinux-wpan@vger.kernel.org,\n\tnetdev@vger.kernel.org,\n\tlinux-wireless@vger.kernel.org,\n\tlinux-spi@vger.kernel.org,\n\tlinux-media@vger.kernel.org,\n\tlinux-staging@lists.linux.dev,\n\tlinux-serial@vger.kernel.org,\n\tlinux-usb@vger.kernel.org,\n\txen-devel@lists.xenproject.org,\n\tlinux-fsdevel@vger.kernel.org,\n\tocfs2-devel@lists.linux.dev,\n\tbpf@vger.kernel.org,\n\tkasan-dev@googlegroups.com,\n\tlinux-mm@kvack.org,\n\tlinux-x25@vger.kernel.org,\n\trust-for-linux@vger.kernel.org,\n\tlinux-sound@vger.kernel.org,\n\tsound-open-firmware@alsa-project.org,\n\tlinux-csky@vger.kernel.org,\n\tlinux-hexagon@vger.kernel.org,\n\tloongarch@lists.linux.dev,\n\tlinux-m68k@lists.linux-m68k.org,\n\tlinux-openrisc@vger.kernel.org,\n\tlinux-parisc@vger.kernel.org,\n\tlinux-sh@vger.kernel.org,\n\tlinux-arch@vger.kernel.org", "Subject": "[RFC PATCH v1 5/9] uaccess: Switch to copy_{to/from}_user_partial()\n when relevant", "Date": "Mon, 27 Apr 2026 19:13:46 +0200", "Message-ID": "\n <289b424e243ba2c4139ea04009cf8b9c448a87ff.1777306795.git.chleroy@kernel.org>", "X-Mailer": "git-send-email 2.49.0", "In-Reply-To": "<cover.1777306795.git.chleroy@kernel.org>", "References": "<cover.1777306795.git.chleroy@kernel.org>", "MIME-Version": "1.0", "X-Developer-Signature": "v=1; a=openpgp-sha256; l=54038; i=chleroy@kernel.org;\n h=from:subject:message-id; bh=ykb2AFsFlD4OWf31v2pDwxXHhaD6RIAaFdGo66PLJJQ=;\n b=owGbwMvMwCV2d0KB2p7V54MZT6slMWS+nxnT8I410Uhy0qp/RVcua12akXn97Jr7B907GK1ex\n fMIJG+93FHKwiDGxSArpshy/D/3rhldX1Lzp+7Sh5nDygQyhIGLUwAmYtrO8D+j/Q7HhgvHVxxp\n 95Tc/nBGsdAKdauVyxVmaezQe2149M4LRoa79udnSurd+iisF/Rta6/v3KKjtnV8bRpT1XZWfDZ\n UYGEHAA==", "X-Developer-Key": "i=chleroy@kernel.org; a=openpgp;\n fpr=10FFE6F8B390DE17ACC2632368A92FEB01B8DD78", "Content-Transfer-Encoding": "8bit", "X-CRM114-Version": "20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 ", "X-CRM114-CacheID": "sfid-20260427_101833_346914_D45996DB ", "X-CRM114-Status": "GOOD ( 21.43 )", "X-Spam-Score": "-2.1 (--)", "X-Spam-Report": "Spam detection software,\n running on the system \"bombadil.infradead.org\",\n has NOT identified this incoming email as spam. The original\n message has been attached to this so you can view it or label\n similar future email. If you have any questions, see\n the administrator of that system for details.\n Content preview: In a subsequent patch,\n copy_{to/from}_user() will be modified\n to return -EFAULT when copy fails. Among the 6000 calls to\n copy_{to/from}_user(),\n around 2% rely on copy_{to/from}_user() doing partial copies and returning\n amount of not copied bytes. Change those users to\n copy_{to/from}_user_partial(\n [...]\n Content analysis details: (-2.1 points, 5.0 required)\n pts rule name description\n ---- ----------------------\n --------------------------------------------------\n -0.0 SPF_PASS SPF: sender matches SPF record\n 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record\n -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from\n envelope-from domain\n -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from\n author's\n domain\n -0.1 DKIM_VALID Message has at least one valid DKIM or DK\n signature\n 0.1 DKIM_SIGNED Message has a DKIM or DK signature,\n not necessarily valid\n -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1%\n [score: 0.0000]\n -0.0 DKIMWL_WL_HIGH DKIMwl.org - High trust sender", "X-BeenThere": "linux-um@lists.infradead.org", "X-Mailman-Version": "2.1.34", "Precedence": "list", "List-Id": "<linux-um.lists.infradead.org>", "List-Unsubscribe": "<http://lists.infradead.org/mailman/options/linux-um>,\n <mailto:linux-um-request@lists.infradead.org?subject=unsubscribe>", "List-Archive": "<http://lists.infradead.org/pipermail/linux-um/>", "List-Post": "<mailto:linux-um@lists.infradead.org>", "List-Help": "<mailto:linux-um-request@lists.infradead.org?subject=help>", "List-Subscribe": "<http://lists.infradead.org/mailman/listinfo/linux-um>,\n <mailto:linux-um-request@lists.infradead.org?subject=subscribe>", "Sender": "\"linux-um\" <linux-um-bounces@lists.infradead.org>", "Errors-To": "linux-um-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org" }, "content": "In a subsequent patch, copy_{to/from}_user() will be modified to\nreturn -EFAULT when copy fails.\n\nAmong the 6000 calls to copy_{to/from}_user(), around 2% rely on\ncopy_{to/from}_user() doing partial copies and returning amount of not\ncopied bytes. Change those users to copy_{to/from}_user_partial().\n\nThis change was done based on whether callers assign the returned value\nto a variable or just check whether the return value is 0 or not.\n\nSeveral of them only use it for debug to print the amount of bytes not\ncopied. Those could maybe be changed to stop reporting that amount and\nnot be converted to partial copy.\n\nSome not trivial handling might have been unecessarily converted. This\nis not a problem and they can be converted back later for better\nperformance.\n\nThe callers where located with following commands then reviewed one by\none:\n\n\tsed -i s/\"return copy_to_user(\"/\"return copy_to_user_partial(\"/g `git grep -l \"return copy_to_user(\"`\n\tsed -i s/\" = copy_to_user(\"/\" = copy_to_user_partial(\"/g `git grep -l \" = copy_to_user(\"`\n\tsed -i s/\" += copy_to_user(\"/\" += copy_to_user_partial(\"/g `git grep -l \" += copy_to_user(\"`\n\tsed -i s/\" -= copy_to_user(\"/\" -= copy_to_user_partial(\"/g `git grep -l \" -= copy_to_user(\"`\n\nThen the same was done with copy_from_user().\n\nDuring the review, patterns like the following were rejected and kept\nas is:\n\n-\treturn copy_to_user(osf_stat, &tmp, sizeof(tmp)) ? -EFAULT : 0;\n+\treturn copy_to_user_partial(osf_stat, &tmp, sizeof(tmp)) ? -EFAULT : 0;\n\nSigned-off-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org>\n---\n arch/alpha/kernel/osf_sys.c | 4 ++--\n arch/alpha/kernel/termios.c | 2 +-\n arch/arc/kernel/disasm.c | 2 +-\n arch/arm64/include/asm/gcs.h | 2 +-\n arch/arm64/kernel/signal32.c | 2 +-\n arch/mips/kernel/rtlx.c | 8 ++++----\n arch/mips/kernel/vpe.c | 2 +-\n arch/powerpc/kvm/book3s_64_mmu_hv.c | 4 ++--\n arch/powerpc/kvm/book3s_64_mmu_radix.c | 4 ++--\n arch/powerpc/kvm/book3s_hv.c | 2 +-\n arch/riscv/kernel/signal.c | 2 +-\n arch/s390/include/asm/idals.h | 8 ++++----\n arch/sparc/kernel/termios.c | 2 +-\n arch/um/kernel/process.c | 2 +-\n arch/x86/lib/insn-eval.c | 2 +-\n arch/x86/um/signal.c | 2 +-\n drivers/android/binder_alloc.c | 2 +-\n drivers/comedi/comedi_fops.c | 4 ++--\n drivers/dma/idxd/cdev.c | 2 +-\n drivers/firmware/efi/test/efi_test.c | 2 +-\n drivers/fsi/fsi-scom.c | 2 +-\n .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 2 +-\n drivers/gpu/drm/i915/gt/intel_sseu.c | 4 ++--\n drivers/gpu/drm/i915/i915_gem.c | 4 ++--\n drivers/hwtracing/intel_th/msu.c | 2 +-\n drivers/misc/ibmvmc.c | 2 +-\n drivers/misc/vmw_vmci/vmci_host.c | 2 +-\n drivers/most/most_cdev.c | 2 +-\n drivers/net/ieee802154/ca8210.c | 4 ++--\n drivers/net/wireless/ath/wil6210/debugfs.c | 2 +-\n .../wireless/intel/iwlwifi/pcie/gen1_2/trans.c | 2 +-\n drivers/net/wireless/ti/wlcore/debugfs.c | 2 +-\n drivers/ps3/ps3-lpm.c | 2 +-\n drivers/s390/crypto/zcrypt_api.h | 4 ++--\n drivers/spi/spidev.c | 2 +-\n .../staging/media/atomisp/pci/atomisp_cmd.c | 8 ++++----\n drivers/tty/tty_ioctl.c | 14 +++++++-------\n drivers/tty/vt/vc_screen.c | 4 ++--\n drivers/usb/gadget/function/f_hid.c | 4 ++--\n drivers/usb/gadget/function/f_printer.c | 2 +-\n drivers/vfio/vfio_iommu_type1.c | 4 ++--\n drivers/xen/xenbus/xenbus_dev_frontend.c | 2 +-\n fs/namespace.c | 2 +-\n fs/ocfs2/dlmfs/dlmfs.c | 2 +-\n fs/proc/base.c | 4 ++--\n include/linux/bpfptr.h | 2 +-\n include/linux/sockptr.h | 4 ++--\n ipc/msg.c | 8 ++++----\n ipc/sem.c | 8 ++++----\n ipc/shm.c | 18 +++++++++---------\n kernel/regset.c | 2 +-\n kernel/sys.c | 4 ++--\n lib/kfifo.c | 8 ++++----\n mm/kasan/kasan_test_c.c | 4 ++--\n mm/memory.c | 2 +-\n net/x25/af_x25.c | 2 +-\n rust/helpers/uaccess.c | 4 ++--\n sound/pci/emu10k1/emufx.c | 4 ++--\n sound/pci/rme9652/hdsp.c | 6 +++---\n sound/soc/intel/avs/probes.c | 6 +++---\n sound/soc/sof/compress.c | 12 ++++++------\n sound/soc/sof/sof-client-probes.c | 6 +++---\n 62 files changed, 122 insertions(+), 122 deletions(-)", "diff": "diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c\nindex 7b6543d2cca3..c8ea39fdbb9f 100644\n--- a/arch/alpha/kernel/osf_sys.c\n+++ b/arch/alpha/kernel/osf_sys.c\n@@ -944,7 +944,7 @@ get_tv32(struct timespec64 *o, struct timeval32 __user *i)\n static inline long\n put_tv32(struct timeval32 __user *o, struct timespec64 *i)\n {\n-\treturn copy_to_user(o, &(struct timeval32){\n+\treturn copy_to_user_partial(o, &(struct timeval32){\n \t\t\t\t.tv_sec = i->tv_sec,\n \t\t\t\t.tv_usec = i->tv_nsec / NSEC_PER_USEC},\n \t\t\t sizeof(struct timeval32));\n@@ -953,7 +953,7 @@ put_tv32(struct timeval32 __user *o, struct timespec64 *i)\n static inline long\n put_tv_to_tv32(struct timeval32 __user *o, struct __kernel_old_timeval *i)\n {\n-\treturn copy_to_user(o, &(struct timeval32){\n+\treturn copy_to_user_partial(o, &(struct timeval32){\n \t\t\t\t.tv_sec = i->tv_sec,\n \t\t\t\t.tv_usec = i->tv_usec},\n \t\t\t sizeof(struct timeval32));\ndiff --git a/arch/alpha/kernel/termios.c b/arch/alpha/kernel/termios.c\nindex a4c29a22edf7..a3693c29a0fd 100644\n--- a/arch/alpha/kernel/termios.c\n+++ b/arch/alpha/kernel/termios.c\n@@ -52,5 +52,5 @@ int kernel_termios_to_user_termio(struct termio __user *termio,\n \tv.c_cc[_VEOL2] = termios->c_cc[VEOL2];\n \tv.c_cc[_VSWTC] = termios->c_cc[VSWTC];\n \n-\treturn copy_to_user(termio, &v, sizeof(struct termio));\n+\treturn copy_to_user_partial(termio, &v, sizeof(struct termio));\n }\ndiff --git a/arch/arc/kernel/disasm.c b/arch/arc/kernel/disasm.c\nindex ccc7e8c39eb3..a3ef9d079e7f 100644\n--- a/arch/arc/kernel/disasm.c\n+++ b/arch/arc/kernel/disasm.c\n@@ -34,7 +34,7 @@ void __kprobes disasm_instr(unsigned long addr, struct disasm_state *state,\n \t/* This fetches the upper part of the 32 bit instruction\n \t * in both the cases of Little Endian or Big Endian configurations. */\n \tif (userspace) {\n-\t\tbytes_not_copied = copy_from_user(ins_buf,\n+\t\tbytes_not_copied = copy_from_user_partial(ins_buf,\n \t\t\t\t\t\t(const void __user *) addr, 8);\n \t\tif (bytes_not_copied > 6)\n \t\t\tgoto fault;\ndiff --git a/arch/arm64/include/asm/gcs.h b/arch/arm64/include/asm/gcs.h\nindex 8fa0707069e8..7ee23a8130b0 100644\n--- a/arch/arm64/include/asm/gcs.h\n+++ b/arch/arm64/include/asm/gcs.h\n@@ -139,7 +139,7 @@ static inline u64 get_user_gcs(unsigned long __user *addr, int *err)\n \n \t/* Ensure previous GCS operation are visible before we read the page */\n \tgcsb_dsync();\n-\tret = copy_from_user(&load, addr, sizeof(load));\n+\tret = copy_from_user_partial(&load, addr, sizeof(load));\n \tif (ret != 0)\n \t\t*err = ret;\n \treturn load;\ndiff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c\nindex bb3b526ff43f..7016d2a3bb76 100644\n--- a/arch/arm64/kernel/signal32.c\n+++ b/arch/arm64/kernel/signal32.c\n@@ -53,7 +53,7 @@ static inline int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set)\n \tcset.sig[0] = set->sig[0] & 0xffffffffull;\n \tcset.sig[1] = set->sig[0] >> 32;\n \n-\treturn copy_to_user(uset, &cset, sizeof(*uset));\n+\treturn copy_to_user_partial(uset, &cset, sizeof(*uset));\n }\n \n static inline int get_sigset_t(sigset_t *set,\ndiff --git a/arch/mips/kernel/rtlx.c b/arch/mips/kernel/rtlx.c\nindex 18c509c59f33..bc468064194d 100644\n--- a/arch/mips/kernel/rtlx.c\n+++ b/arch/mips/kernel/rtlx.c\n@@ -262,13 +262,13 @@ ssize_t rtlx_read(int index, void __user *buff, size_t count)\n \t/* then how much from the read pointer onwards */\n \tfl = min(count, (size_t)lx->buffer_size - lx->lx_read);\n \n-\tfailed = copy_to_user(buff, lx->lx_buffer + lx->lx_read, fl);\n+\tfailed = copy_to_user_partial(buff, lx->lx_buffer + lx->lx_read, fl);\n \tif (failed)\n \t\tgoto out;\n \n \t/* and if there is anything left at the beginning of the buffer */\n \tif (count - fl)\n-\t\tfailed = copy_to_user(buff + fl, lx->lx_buffer, count - fl);\n+\t\tfailed = copy_to_user_partial(buff + fl, lx->lx_buffer, count - fl);\n \n out:\n \tcount -= failed;\n@@ -304,13 +304,13 @@ ssize_t rtlx_write(int index, const void __user *buffer, size_t count)\n \t/* first bit from write pointer to the end of the buffer, or count */\n \tfl = min(count, (size_t) rt->buffer_size - rt->rt_write);\n \n-\tfailed = copy_from_user(rt->rt_buffer + rt->rt_write, buffer, fl);\n+\tfailed = copy_from_user_partial(rt->rt_buffer + rt->rt_write, buffer, fl);\n \tif (failed)\n \t\tgoto out;\n \n \t/* if there's any left copy to the beginning of the buffer */\n \tif (count - fl)\n-\t\tfailed = copy_from_user(rt->rt_buffer, buffer + fl, count - fl);\n+\t\tfailed = copy_from_user_partial(rt->rt_buffer, buffer + fl, count - fl);\n \n out:\n \tcount -= failed;\ndiff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c\nindex b05ee21a1d67..5a8d72d6c80c 100644\n--- a/arch/mips/kernel/vpe.c\n+++ b/arch/mips/kernel/vpe.c\n@@ -854,7 +854,7 @@ static ssize_t vpe_write(struct file *file, const char __user *buffer,\n \t\treturn -ENOMEM;\n \t}\n \n-\tcount -= copy_from_user(v->pbuffer + v->len, buffer, count);\n+\tcount -= copy_from_user_partial(v->pbuffer + v->len, buffer, count);\n \tif (!count)\n \t\treturn -EFAULT;\n \ndiff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c\nindex 2ccb3d138f46..1c43c7b8e801 100644\n--- a/arch/powerpc/kvm/book3s_64_mmu_hv.c\n+++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c\n@@ -2028,7 +2028,7 @@ static ssize_t debugfs_htab_read(struct file *file, char __user *buf,\n \t\tn = p->chars_left;\n \t\tif (n > len)\n \t\t\tn = len;\n-\t\tr = copy_to_user(buf, p->buf + p->buf_index, n);\n+\t\tr = copy_to_user_partial(buf, p->buf + p->buf_index, n);\n \t\tn -= r;\n \t\tp->chars_left -= n;\n \t\tp->buf_index += n;\n@@ -2068,7 +2068,7 @@ static ssize_t debugfs_htab_read(struct file *file, char __user *buf,\n \t\tp->chars_left = n;\n \t\tif (n > len)\n \t\t\tn = len;\n-\t\tr = copy_to_user(buf, p->buf, n);\n+\t\tr = copy_to_user_partial(buf, p->buf, n);\n \t\tn -= r;\n \t\tp->chars_left -= n;\n \t\tp->buf_index = n;\ndiff --git a/arch/powerpc/kvm/book3s_64_mmu_radix.c b/arch/powerpc/kvm/book3s_64_mmu_radix.c\nindex 933fc7cb9afc..0a27e018d27b 100644\n--- a/arch/powerpc/kvm/book3s_64_mmu_radix.c\n+++ b/arch/powerpc/kvm/book3s_64_mmu_radix.c\n@@ -1307,7 +1307,7 @@ static ssize_t debugfs_radix_read(struct file *file, char __user *buf,\n \t\tn = p->chars_left;\n \t\tif (n > len)\n \t\t\tn = len;\n-\t\tr = copy_to_user(buf, p->buf + p->buf_index, n);\n+\t\tr = copy_to_user_partial(buf, p->buf + p->buf_index, n);\n \t\tn -= r;\n \t\tp->chars_left -= n;\n \t\tp->buf_index += n;\n@@ -1407,7 +1407,7 @@ static ssize_t debugfs_radix_read(struct file *file, char __user *buf,\n \t\tp->chars_left = n;\n \t\tif (n > len)\n \t\t\tn = len;\n-\t\tr = copy_to_user(buf, p->buf, n);\n+\t\tr = copy_to_user_partial(buf, p->buf, n);\n \t\tn -= r;\n \t\tp->chars_left -= n;\n \t\tp->buf_index = n;\ndiff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c\nindex 61dbeea317f3..4c7a8f687c99 100644\n--- a/arch/powerpc/kvm/book3s_hv.c\n+++ b/arch/powerpc/kvm/book3s_hv.c\n@@ -2916,7 +2916,7 @@ static ssize_t debugfs_timings_read(struct file *file, char __user *buf,\n \t\treturn 0;\n \tif (len > p->buflen - pos)\n \t\tlen = p->buflen - pos;\n-\tn = copy_to_user(buf, p->buf + pos, len);\n+\tn = copy_to_user_partial(buf, p->buf + pos, len);\n \tif (n) {\n \t\tif (n == len)\n \t\t\treturn -EFAULT;\ndiff --git a/arch/riscv/kernel/signal.c b/arch/riscv/kernel/signal.c\nindex 59784dc117e4..4630dbad7428 100644\n--- a/arch/riscv/kernel/signal.c\n+++ b/arch/riscv/kernel/signal.c\n@@ -139,7 +139,7 @@ static long __restore_v_state(struct pt_regs *regs, void __user *sc_vec)\n \t * Copy the whole vector content from user space datap. Use\n \t * copy_from_user to prevent information leak.\n \t */\n-\treturn copy_from_user(current->thread.vstate.datap, datap, riscv_v_vsize);\n+\treturn copy_from_user_partial(current->thread.vstate.datap, datap, riscv_v_vsize);\n }\n \n static long save_cfiss_state(struct pt_regs *regs, void __user *sc_cfi)\ndiff --git a/arch/s390/include/asm/idals.h b/arch/s390/include/asm/idals.h\nindex 06e1ec2afd5a..d86f4eb1ce42 100644\n--- a/arch/s390/include/asm/idals.h\n+++ b/arch/s390/include/asm/idals.h\n@@ -301,14 +301,14 @@ static inline size_t idal_buffer_to_user(struct idal_buffer *ib, void __user *to\n \tBUG_ON(count > ib->size);\n \tfor (i = 0; count > IDA_BLOCK_SIZE; i++) {\n \t\tvaddr = dma64_to_virt(ib->data[i]);\n-\t\tleft = copy_to_user(to, vaddr, IDA_BLOCK_SIZE);\n+\t\tleft = copy_to_user_partial(to, vaddr, IDA_BLOCK_SIZE);\n \t\tif (left)\n \t\t\treturn left + count - IDA_BLOCK_SIZE;\n \t\tto = (void __user *)to + IDA_BLOCK_SIZE;\n \t\tcount -= IDA_BLOCK_SIZE;\n \t}\n \tvaddr = dma64_to_virt(ib->data[i]);\n-\treturn copy_to_user(to, vaddr, count);\n+\treturn copy_to_user_partial(to, vaddr, count);\n }\n \n /*\n@@ -323,14 +323,14 @@ static inline size_t idal_buffer_from_user(struct idal_buffer *ib, const void __\n \tBUG_ON(count > ib->size);\n \tfor (i = 0; count > IDA_BLOCK_SIZE; i++) {\n \t\tvaddr = dma64_to_virt(ib->data[i]);\n-\t\tleft = copy_from_user(vaddr, from, IDA_BLOCK_SIZE);\n+\t\tleft = copy_from_user_partial(vaddr, from, IDA_BLOCK_SIZE);\n \t\tif (left)\n \t\t\treturn left + count - IDA_BLOCK_SIZE;\n \t\tfrom = (void __user *)from + IDA_BLOCK_SIZE;\n \t\tcount -= IDA_BLOCK_SIZE;\n \t}\n \tvaddr = dma64_to_virt(ib->data[i]);\n-\treturn copy_from_user(vaddr, from, count);\n+\treturn copy_from_user_partial(vaddr, from, count);\n }\n \n #endif\ndiff --git a/arch/sparc/kernel/termios.c b/arch/sparc/kernel/termios.c\nindex ee64965c27cd..db9c07b7d5ee 100644\n--- a/arch/sparc/kernel/termios.c\n+++ b/arch/sparc/kernel/termios.c\n@@ -27,7 +27,7 @@ int kernel_termios_to_user_termio(struct termio __user *termio,\n \t\tv.c_cc[_VMIN] = termios->c_cc[VMIN];\n \t\tv.c_cc[_VTIME] = termios->c_cc[VTIME];\n \t}\n-\treturn copy_to_user(termio, &v, sizeof(struct termio));\n+\treturn copy_to_user_partial(termio, &v, sizeof(struct termio));\n }\n \n int user_termios_to_kernel_termios(struct ktermios *k,\ndiff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c\nindex 63b38a3f73f7..d41625dfa00b 100644\n--- a/arch/um/kernel/process.c\n+++ b/arch/um/kernel/process.c\n@@ -252,7 +252,7 @@ EXPORT_SYMBOL(uml_strdup);\n \n int copy_from_user_proc(void *to, void __user *from, int size)\n {\n-\treturn copy_from_user(to, from, size);\n+\treturn copy_from_user_partial(to, from, size);\n }\n \n int singlestepping(void)\ndiff --git a/arch/x86/lib/insn-eval.c b/arch/x86/lib/insn-eval.c\nindex e03eeec55cfe..e7cb03ab26f1 100644\n--- a/arch/x86/lib/insn-eval.c\n+++ b/arch/x86/lib/insn-eval.c\n@@ -1512,7 +1512,7 @@ int insn_fetch_from_user(struct pt_regs *regs, unsigned char buf[MAX_INSN_SIZE])\n \tif (insn_get_effective_ip(regs, &ip))\n \t\treturn -EINVAL;\n \n-\tnot_copied = copy_from_user(buf, (void __user *)ip, MAX_INSN_SIZE);\n+\tnot_copied = copy_from_user_partial(buf, (void __user *)ip, MAX_INSN_SIZE);\n \n \treturn MAX_INSN_SIZE - not_copied;\n }\ndiff --git a/arch/x86/um/signal.c b/arch/x86/um/signal.c\nindex 2934e170b0fe..e0fab7c1625b 100644\n--- a/arch/x86/um/signal.c\n+++ b/arch/x86/um/signal.c\n@@ -40,7 +40,7 @@ static int copy_sc_from_user(struct pt_regs *regs,\n \t/* Always make any pending restarted system calls return -EINTR */\n \tcurrent->restart_block.fn = do_no_restart_syscall;\n \n-\terr = copy_from_user(&sc, from, sizeof(sc));\n+\terr = copy_from_user_partial(&sc, from, sizeof(sc));\n \tif (err)\n \t\treturn err;\n \ndiff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c\nindex e4488ad86a65..8ba9c57b489c 100644\n--- a/drivers/android/binder_alloc.c\n+++ b/drivers/android/binder_alloc.c\n@@ -1346,7 +1346,7 @@ binder_alloc_copy_user_to_buffer(struct binder_alloc *alloc,\n \t\t\t\t\t buffer_offset, &pgoff);\n \t\tsize = min_t(size_t, bytes, PAGE_SIZE - pgoff);\n \t\tkptr = kmap_local_page(page) + pgoff;\n-\t\tret = copy_from_user(kptr, from, size);\n+\t\tret = copy_from_user_partial(kptr, from, size);\n \t\tkunmap_local(kptr);\n \t\tif (ret)\n \t\t\treturn bytes - size + ret;\ndiff --git a/drivers/comedi/comedi_fops.c b/drivers/comedi/comedi_fops.c\nindex c09bbe04be6c..272fdc54fb81 100644\n--- a/drivers/comedi/comedi_fops.c\n+++ b/drivers/comedi/comedi_fops.c\n@@ -2659,7 +2659,7 @@ static unsigned int comedi_buf_copy_to_user(struct comedi_subdevice *s,\n \t\tunsigned int copy_amount = min(n, PAGE_SIZE - offset);\n \t\tunsigned int uncopied;\n \n-\t\tuncopied = copy_to_user(dest, buf_page_list[page].virt_addr +\n+\t\tuncopied = copy_to_user_partial(dest, buf_page_list[page].virt_addr +\n \t\t\t\t\toffset, copy_amount);\n \t\tcopy_amount -= uncopied;\n \t\tn -= copy_amount;\n@@ -2687,7 +2687,7 @@ static unsigned int comedi_buf_copy_from_user(struct comedi_subdevice *s,\n \t\tunsigned int copy_amount = min(n, PAGE_SIZE - offset);\n \t\tunsigned int uncopied;\n \n-\t\tuncopied = copy_from_user(buf_page_list[page].virt_addr +\n+\t\tuncopied = copy_from_user_partial(buf_page_list[page].virt_addr +\n \t\t\t\t\t offset, src, copy_amount);\n \t\tcopy_amount -= uncopied;\n \t\tn -= copy_amount;\ndiff --git a/drivers/dma/idxd/cdev.c b/drivers/dma/idxd/cdev.c\nindex 0366c7cf3502..ac79bab6d6c3 100644\n--- a/drivers/dma/idxd/cdev.c\n+++ b/drivers/dma/idxd/cdev.c\n@@ -751,7 +751,7 @@ int idxd_copy_cr(struct idxd_wq *wq, ioasid_t pasid, unsigned long addr,\n \t * to addr in the mm.\n \t */\n \tkthread_use_mm(mm);\n-\tleft = copy_to_user((void __user *)addr + status_size, cr + status_size,\n+\tleft = copy_to_user_partial((void __user *)addr + status_size, cr + status_size,\n \t\t\t len - status_size);\n \t/*\n \t * Copy status only after the rest of completion record is copied\ndiff --git a/drivers/firmware/efi/test/efi_test.c b/drivers/firmware/efi/test/efi_test.c\nindex d54d6a671326..43b280ceb955 100644\n--- a/drivers/firmware/efi/test/efi_test.c\n+++ b/drivers/firmware/efi/test/efi_test.c\n@@ -133,7 +133,7 @@ copy_ucs2_to_user_len(efi_char16_t __user *dst, efi_char16_t *src, size_t len)\n \tif (!src)\n \t\treturn 0;\n \n-\treturn copy_to_user(dst, src, len);\n+\treturn copy_to_user_partial(dst, src, len);\n }\n \n static long efi_runtime_get_variable(unsigned long arg)\ndiff --git a/drivers/fsi/fsi-scom.c b/drivers/fsi/fsi-scom.c\nindex bb4d3700c934..370ec75b20e6 100644\n--- a/drivers/fsi/fsi-scom.c\n+++ b/drivers/fsi/fsi-scom.c\n@@ -332,7 +332,7 @@ static ssize_t scom_read(struct file *filep, char __user *buf, size_t len,\n \t\treturn rc;\n \t}\n \n-\trc = copy_to_user(buf, &val, len);\n+\trc = copy_to_user_partial(buf, &val, len);\n \tif (rc)\n \t\tdev_dbg(dev, \"copy to user failed:%d\\n\", rc);\n \ndiff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c\nindex 2409ac72b166..712605ec7ecc 100644\n--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c\n+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c\n@@ -1346,7 +1346,7 @@ static ssize_t dp_sdp_message_debugfs_write(struct file *f, const char __user *b\n \n \tacrtc_state = to_dm_crtc_state(connector->base.state->crtc->state);\n \n-\tr = copy_from_user(data, buf, write_size);\n+\tr = copy_from_user_partial(data, buf, write_size);\n \n \twrite_size -= r;\n \ndiff --git a/drivers/gpu/drm/i915/gt/intel_sseu.c b/drivers/gpu/drm/i915/gt/intel_sseu.c\nindex 656a499b2706..3f5b450a914a 100644\n--- a/drivers/gpu/drm/i915/gt/intel_sseu.c\n+++ b/drivers/gpu/drm/i915/gt/intel_sseu.c\n@@ -114,7 +114,7 @@ int intel_sseu_copy_eumask_to_user(void __user *to,\n \t\t}\n \t}\n \n-\treturn copy_to_user(to, eu_mask, len);\n+\treturn copy_to_user_partial(to, eu_mask, len);\n }\n \n /**\n@@ -146,7 +146,7 @@ int intel_sseu_copy_ssmask_to_user(void __user *to,\n \t\t}\n \t}\n \n-\treturn copy_to_user(to, ss_mask, len);\n+\treturn copy_to_user_partial(to, ss_mask, len);\n }\n \n static void gen11_compute_sseu_info(struct sseu_dev_info *sseu,\ndiff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c\nindex a432daf8038a..c1c2e762498f 100644\n--- a/drivers/gpu/drm/i915/i915_gem.c\n+++ b/drivers/gpu/drm/i915/i915_gem.c\n@@ -291,7 +291,7 @@ gtt_user_read(struct io_mapping *mapping,\n \tio_mapping_unmap_atomic(vaddr);\n \tif (unwritten) {\n \t\tvaddr = io_mapping_map_wc(mapping, base, PAGE_SIZE);\n-\t\tunwritten = copy_to_user(user_data,\n+\t\tunwritten = copy_to_user_partial(user_data,\n \t\t\t\t\t (void __force *)vaddr + offset,\n \t\t\t\t\t length);\n \t\tio_mapping_unmap(vaddr);\n@@ -525,7 +525,7 @@ ggtt_write(struct io_mapping *mapping,\n \tio_mapping_unmap_atomic(vaddr);\n \tif (unwritten) {\n \t\tvaddr = io_mapping_map_wc(mapping, base, PAGE_SIZE);\n-\t\tunwritten = copy_from_user((void __force *)vaddr + offset,\n+\t\tunwritten = copy_from_user_partial((void __force *)vaddr + offset,\n \t\t\t\t\t user_data, length);\n \t\tio_mapping_unmap(vaddr);\n \t}\ndiff --git a/drivers/hwtracing/intel_th/msu.c b/drivers/hwtracing/intel_th/msu.c\nindex a82cf74f39ad..9b97b71b44f1 100644\n--- a/drivers/hwtracing/intel_th/msu.c\n+++ b/drivers/hwtracing/intel_th/msu.c\n@@ -1457,7 +1457,7 @@ static unsigned long msc_win_to_user(void *data, void *src, size_t len)\n \tstruct msc_win_to_user_struct *u = data;\n \tunsigned long ret;\n \n-\tret = copy_to_user(u->buf + u->offset, src, len);\n+\tret = copy_to_user_partial(u->buf + u->offset, src, len);\n \tu->offset += len - ret;\n \n \treturn ret;\ndiff --git a/drivers/misc/ibmvmc.c b/drivers/misc/ibmvmc.c\nindex beb18c34f20d..e1d99354dd29 100644\n--- a/drivers/misc/ibmvmc.c\n+++ b/drivers/misc/ibmvmc.c\n@@ -1112,7 +1112,7 @@ static ssize_t ibmvmc_write(struct file *file, const char *buffer,\n \twhile (c > 0) {\n \t\tbytes = min_t(size_t, c, vmc_buffer->size);\n \n-\t\tbytes -= copy_from_user(buf, p, bytes);\n+\t\tbytes -= copy_from_user_partial(buf, p, bytes);\n \t\tif (!bytes) {\n \t\t\tret = -EFAULT;\n \t\t\tgoto out;\ndiff --git a/drivers/misc/vmw_vmci/vmci_host.c b/drivers/misc/vmw_vmci/vmci_host.c\nindex b71ca1bf0a20..bd502edbc173 100644\n--- a/drivers/misc/vmw_vmci/vmci_host.c\n+++ b/drivers/misc/vmw_vmci/vmci_host.c\n@@ -213,7 +213,7 @@ static int drv_cp_harray_to_user(void __user *user_buf_uva,\n \n \t*user_buf_size = array_size * sizeof(*handles);\n \tif (*user_buf_size)\n-\t\t*retval = copy_to_user(user_buf_uva,\n+\t\t*retval = copy_to_user_partial(user_buf_uva,\n \t\t\t\t vmci_handle_arr_get_handles\n \t\t\t\t (handle_array), *user_buf_size);\n \ndiff --git a/drivers/most/most_cdev.c b/drivers/most/most_cdev.c\nindex 5df508d8d60a..969c865ccbef 100644\n--- a/drivers/most/most_cdev.c\n+++ b/drivers/most/most_cdev.c\n@@ -265,7 +265,7 @@ comp_read(struct file *filp, char __user *buf, size_t count, loff_t *offset)\n \t\t\tcount,\n \t\t\tmbo->processed_length - c->mbo_offs);\n \n-\tnot_copied = copy_to_user(buf,\n+\tnot_copied = copy_to_user_partial(buf,\n \t\t\t\t mbo->virt_address + c->mbo_offs,\n \t\t\t\t to_copy);\n \ndiff --git a/drivers/net/ieee802154/ca8210.c b/drivers/net/ieee802154/ca8210.c\nindex ed4178155a5d..d474a008c73e 100644\n--- a/drivers/net/ieee802154/ca8210.c\n+++ b/drivers/net/ieee802154/ca8210.c\n@@ -2460,7 +2460,7 @@ static ssize_t ca8210_test_int_user_write(\n \t\treturn -EBADE;\n \t}\n \n-\tret = copy_from_user(command, in_buf, len);\n+\tret = copy_from_user_partial(command, in_buf, len);\n \tif (ret) {\n \t\tdev_err(\n \t\t\t&priv->spi->dev,\n@@ -2548,7 +2548,7 @@ static ssize_t ca8210_test_int_user_read(\n \tcmdlen = fifo_buffer[1];\n \tbytes_not_copied = cmdlen + 2;\n \n-\tbytes_not_copied = copy_to_user(buf, fifo_buffer, bytes_not_copied);\n+\tbytes_not_copied = copy_to_user_partial(buf, fifo_buffer, bytes_not_copied);\n \tif (bytes_not_copied > 0) {\n \t\tdev_err(\n \t\t\t&priv->spi->dev,\ndiff --git a/drivers/net/wireless/ath/wil6210/debugfs.c b/drivers/net/wireless/ath/wil6210/debugfs.c\nindex b8cb736a7185..f2130248fb7f 100644\n--- a/drivers/net/wireless/ath/wil6210/debugfs.c\n+++ b/drivers/net/wireless/ath/wil6210/debugfs.c\n@@ -659,7 +659,7 @@ static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf,\n \twil_memcpy_fromio_32(buf, (const void __iomem *)\n \t\t\t wil_blob->blob.data + aligned_pos, aligned_count);\n \n-\tret = copy_to_user(user_buf, buf + unaligned_bytes, count);\n+\tret = copy_to_user_partial(user_buf, buf + unaligned_bytes, count);\n \n \twil_mem_access_unlock(wil);\n \twil_pm_runtime_put(wil);\ndiff --git a/drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/trans.c\nindex a05f60f9224b..66ddaa0d8e36 100644\n--- a/drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/trans.c\n+++ b/drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/trans.c\n@@ -3060,7 +3060,7 @@ static bool iwl_write_to_user_buf(char __user *user_buf, ssize_t count,\n \tif (*size > buf_size_left)\n \t\t*size = buf_size_left;\n \n-\t*size -= copy_to_user(user_buf, buf, *size);\n+\t*size -= copy_to_user_partial(user_buf, buf, *size);\n \t*bytes_copied += *size;\n \n \tif (buf_size_left == *size)\ndiff --git a/drivers/net/wireless/ti/wlcore/debugfs.c b/drivers/net/wireless/ti/wlcore/debugfs.c\nindex bbfd2725215b..d359baea5100 100644\n--- a/drivers/net/wireless/ti/wlcore/debugfs.c\n+++ b/drivers/net/wireless/ti/wlcore/debugfs.c\n@@ -1088,7 +1088,7 @@ static ssize_t dev_mem_read(struct file *file,\n \tmutex_unlock(&wl->mutex);\n \n \tif (ret == 0) {\n-\t\tret = copy_to_user(user_buf, buf, bytes);\n+\t\tret = copy_to_user_partial(user_buf, buf, bytes);\n \t\tif (ret < bytes) {\n \t\t\tbytes -= ret;\n \t\t\t*ppos += bytes;\ndiff --git a/drivers/ps3/ps3-lpm.c b/drivers/ps3/ps3-lpm.c\nindex f8d8f607134a..5a2b150cda49 100644\n--- a/drivers/ps3/ps3-lpm.c\n+++ b/drivers/ps3/ps3-lpm.c\n@@ -999,7 +999,7 @@ int ps3_lpm_copy_tb_to_user(unsigned long offset, void __user *buf,\n \t\t\treturn result == LV1_WRONG_STATE ? -EBUSY : -EINVAL;\n \t\t}\n \n-\t\tresult = copy_to_user(buf, lpm_priv->tb_cache, tmp);\n+\t\tresult = copy_to_user_partial(buf, lpm_priv->tb_cache, tmp);\n \n \t\tif (result) {\n \t\t\tdev_dbg(sbd_core(), \"%s:%u: 0x%llx bytes at 0x%p\\n\",\ndiff --git a/drivers/s390/crypto/zcrypt_api.h b/drivers/s390/crypto/zcrypt_api.h\nindex 6ef8850a42df..61a5de90c354 100644\n--- a/drivers/s390/crypto/zcrypt_api.h\n+++ b/drivers/s390/crypto/zcrypt_api.h\n@@ -185,7 +185,7 @@ static inline unsigned long z_copy_from_user(bool userspace,\n \t\t\t\t\t unsigned long n)\n {\n \tif (likely(userspace))\n-\t\treturn copy_from_user(to, from, n);\n+\t\treturn copy_from_user_partial(to, from, n);\n \tmemcpy(to, (void __force *)from, n);\n \treturn 0;\n }\n@@ -196,7 +196,7 @@ static inline unsigned long z_copy_to_user(bool userspace,\n \t\t\t\t\t unsigned long n)\n {\n \tif (likely(userspace))\n-\t\treturn copy_to_user(to, from, n);\n+\t\treturn copy_to_user_partial(to, from, n);\n \tmemcpy((void __force *)to, from, n);\n \treturn 0;\n }\ndiff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c\nindex 638221178384..5b42fabcf4c4 100644\n--- a/drivers/spi/spidev.c\n+++ b/drivers/spi/spidev.c\n@@ -157,7 +157,7 @@ spidev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)\n \tif (status > 0) {\n \t\tunsigned long\tmissing;\n \n-\t\tmissing = copy_to_user(buf, spidev->rx_buffer, status);\n+\t\tmissing = copy_to_user_partial(buf, spidev->rx_buffer, status);\n \t\tif (missing == status)\n \t\t\tstatus = -EFAULT;\n \t\telse\ndiff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.c b/drivers/staging/media/atomisp/pci/atomisp_cmd.c\nindex fec369575d88..10a7aff375a9 100644\n--- a/drivers/staging/media/atomisp/pci/atomisp_cmd.c\n+++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.c\n@@ -1491,7 +1491,7 @@ int atomisp_gdc_cac_table(struct atomisp_sub_device *asd, int flag,\n \t\t}\n \n \t\tfor (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {\n-\t\t\tret = copy_from_user(tab->coordinates_x[i],\n+\t\t\tret = copy_from_user_partial(tab->coordinates_x[i],\n \t\t\t\t\t config->coordinates_x[i],\n \t\t\t\t\t config->height * config->width *\n \t\t\t\t\t sizeof(*config->coordinates_x[i]));\n@@ -1502,7 +1502,7 @@ int atomisp_gdc_cac_table(struct atomisp_sub_device *asd, int flag,\n \t\t\t\tatomisp_css_morph_table_free(tab);\n \t\t\t\treturn -EFAULT;\n \t\t\t}\n-\t\t\tret = copy_from_user(tab->coordinates_y[i],\n+\t\t\tret = copy_from_user_partial(tab->coordinates_y[i],\n \t\t\t\t\t config->coordinates_y[i],\n \t\t\t\t\t config->height * config->width *\n \t\t\t\t\t sizeof(*config->coordinates_y[i]));\n@@ -1709,7 +1709,7 @@ int atomisp_3a_stat(struct atomisp_sub_device *asd, int flag,\n \tconfig->exp_id = s3a_buf->s3a_data->exp_id;\n \tconfig->isp_config_id = s3a_buf->s3a_data->isp_config_id;\n \n-\tret = copy_to_user(config->data, asd->params.s3a_user_stat->data,\n+\tret = copy_to_user_partial(config->data, asd->params.s3a_user_stat->data,\n \t\t\t asd->params.s3a_output_bytes);\n \tif (ret) {\n \t\tdev_err(isp->dev, \"copy to user failed: copied %lu bytes\\n\",\n@@ -2031,7 +2031,7 @@ static unsigned int long copy_from_compatible(void *to, const void *from,\n \tunsigned long n, bool from_user)\n {\n \tif (from_user)\n-\t\treturn copy_from_user(to, (void __user *)from, n);\n+\t\treturn copy_from_user_partial(to, (void __user *)from, n);\n \telse\n \t\tmemcpy(to, from, n);\n \treturn 0;\ndiff --git a/drivers/tty/tty_ioctl.c b/drivers/tty/tty_ioctl.c\nindex 90c70d8d14e3..cdc274c0ff81 100644\n--- a/drivers/tty/tty_ioctl.c\n+++ b/drivers/tty/tty_ioctl.c\n@@ -388,29 +388,29 @@ __weak int kernel_termios_to_user_termio(struct termio __user *termio,\n \tv.c_lflag = termios->c_lflag;\n \tv.c_line = termios->c_line;\n \tmemcpy(v.c_cc, termios->c_cc, NCC);\n-\treturn copy_to_user(termio, &v, sizeof(struct termio));\n+\treturn copy_to_user_partial(termio, &v, sizeof(struct termio));\n }\n \n #ifdef TCGETS2\n __weak int user_termios_to_kernel_termios(struct ktermios *k,\n \t\t\t\t\t\t struct termios2 __user *u)\n {\n-\treturn copy_from_user(k, u, sizeof(struct termios2));\n+\treturn copy_from_user_partial(k, u, sizeof(struct termios2));\n }\n __weak int kernel_termios_to_user_termios(struct termios2 __user *u,\n \t\t\t\t\t\t struct ktermios *k)\n {\n-\treturn copy_to_user(u, k, sizeof(struct termios2));\n+\treturn copy_to_user_partial(u, k, sizeof(struct termios2));\n }\n __weak int user_termios_to_kernel_termios_1(struct ktermios *k,\n \t\t\t\t\t\t struct termios __user *u)\n {\n-\treturn copy_from_user(k, u, sizeof(struct termios));\n+\treturn copy_from_user_partial(k, u, sizeof(struct termios));\n }\n __weak int kernel_termios_to_user_termios_1(struct termios __user *u,\n \t\t\t\t\t\t struct ktermios *k)\n {\n-\treturn copy_to_user(u, k, sizeof(struct termios));\n+\treturn copy_to_user_partial(u, k, sizeof(struct termios));\n }\n \n #else\n@@ -418,12 +418,12 @@ __weak int kernel_termios_to_user_termios_1(struct termios __user *u,\n __weak int user_termios_to_kernel_termios(struct ktermios *k,\n \t\t\t\t\t\t struct termios __user *u)\n {\n-\treturn copy_from_user(k, u, sizeof(struct termios));\n+\treturn copy_from_user_partial(k, u, sizeof(struct termios));\n }\n __weak int kernel_termios_to_user_termios(struct termios __user *u,\n \t\t\t\t\t\t struct ktermios *k)\n {\n-\treturn copy_to_user(u, k, sizeof(struct termios));\n+\treturn copy_to_user_partial(u, k, sizeof(struct termios));\n }\n #endif /* TCGETS2 */\n \ndiff --git a/drivers/tty/vt/vc_screen.c b/drivers/tty/vt/vc_screen.c\nindex 4d2d46c95fef..e54c708149c3 100644\n--- a/drivers/tty/vt/vc_screen.c\n+++ b/drivers/tty/vt/vc_screen.c\n@@ -450,7 +450,7 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)\n \t\t */\n \n \t\tconsole_unlock();\n-\t\tret = copy_to_user(buf, con_buf + skip, this_round);\n+\t\tret = copy_to_user_partial(buf, con_buf + skip, this_round);\n \t\tconsole_lock();\n \n \t\tif (ret) {\n@@ -630,7 +630,7 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)\n \t\t * in the write data from userspace safely.\n \t\t */\n \t\tconsole_unlock();\n-\t\tret = copy_from_user(con_buf, buf, this_round);\n+\t\tret = copy_from_user_partial(con_buf, buf, this_round);\n \t\tconsole_lock();\n \n \t\tif (ret) {\ndiff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c\nindex c5a12a6760ea..f22dd3697a46 100644\n--- a/drivers/usb/gadget/function/f_hid.c\n+++ b/drivers/usb/gadget/function/f_hid.c\n@@ -349,7 +349,7 @@ static ssize_t f_hidg_intout_read(struct file *file, char __user *buffer,\n \tspin_unlock_irqrestore(&hidg->read_spinlock, flags);\n \n \t/* copy to user outside spinlock */\n-\tcount -= copy_to_user(buffer, req->buf + list->pos, count);\n+\tcount -= copy_to_user_partial(buffer, req->buf + list->pos, count);\n \tlist->pos += count;\n \n \t/*\n@@ -410,7 +410,7 @@ static ssize_t f_hidg_ssreport_read(struct file *file, char __user *buffer,\n \tspin_unlock_irqrestore(&hidg->read_spinlock, flags);\n \n \tif (tmp_buf != NULL) {\n-\t\tcount -= copy_to_user(buffer, tmp_buf, count);\n+\t\tcount -= copy_to_user_partial(buffer, tmp_buf, count);\n \t\tkfree(tmp_buf);\n \t} else {\n \t\tcount = -ENOMEM;\ndiff --git a/drivers/usb/gadget/function/f_printer.c b/drivers/usb/gadget/function/f_printer.c\nindex e4f7828ae75d..4fbed987b639 100644\n--- a/drivers/usb/gadget/function/f_printer.c\n+++ b/drivers/usb/gadget/function/f_printer.c\n@@ -525,7 +525,7 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr)\n \t\telse\n \t\t\tsize = len;\n \n-\t\tsize -= copy_to_user(buf, current_rx_buf, size);\n+\t\tsize -= copy_to_user_partial(buf, current_rx_buf, size);\n \t\tbytes_copied += size;\n \t\tlen -= size;\n \t\tbuf += size;\ndiff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c\nindex c8151ba54de3..ad74a891aa80 100644\n--- a/drivers/vfio/vfio_iommu_type1.c\n+++ b/drivers/vfio/vfio_iommu_type1.c\n@@ -3173,7 +3173,7 @@ static int vfio_iommu_type1_dma_rw_chunk(struct vfio_iommu *iommu,\n \tvaddr = dma->vaddr + offset;\n \n \tif (write) {\n-\t\t*copied = copy_to_user((void __user *)vaddr, data,\n+\t\t*copied = copy_to_user_partial((void __user *)vaddr, data,\n \t\t\t\t\t count) ? 0 : count;\n \t\tif (*copied && iommu->dirty_page_tracking) {\n \t\t\tunsigned long pgshift = __ffs(iommu->pgsize_bitmap);\n@@ -3186,7 +3186,7 @@ static int vfio_iommu_type1_dma_rw_chunk(struct vfio_iommu *iommu,\n \t\t\t\t (offset >> pgshift) + 1);\n \t\t}\n \t} else\n-\t\t*copied = copy_from_user(data, (void __user *)vaddr,\n+\t\t*copied = copy_from_user_partial(data, (void __user *)vaddr,\n \t\t\t\t\t count) ? 0 : count;\n \tif (kthread)\n \t\tkthread_unuse_mm(mm);\ndiff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c\nindex 61db6932a9d2..b1db90dac1d1 100644\n--- a/drivers/xen/xenbus/xenbus_dev_frontend.c\n+++ b/drivers/xen/xenbus/xenbus_dev_frontend.c\n@@ -150,7 +150,7 @@ static ssize_t xenbus_file_read(struct file *filp,\n \twhile (i < len) {\n \t\tsize_t sz = min_t(size_t, len - i, rb->len - rb->cons);\n \n-\t\tret = copy_to_user(ubuf + i, &rb->msg[rb->cons], sz);\n+\t\tret = copy_to_user_partial(ubuf + i, &rb->msg[rb->cons], sz);\n \n \t\ti += sz - ret;\n \t\trb->cons += sz - ret;\ndiff --git a/fs/namespace.c b/fs/namespace.c\nindex fe919abd2f01..27afb73fef20 100644\n--- a/fs/namespace.c\n+++ b/fs/namespace.c\n@@ -4033,7 +4033,7 @@ static void *copy_mount_options(const void __user * data)\n \tif (!copy)\n \t\treturn ERR_PTR(-ENOMEM);\n \n-\tleft = copy_from_user(copy, data, PAGE_SIZE);\n+\tleft = copy_from_user_partial(copy, data, PAGE_SIZE);\n \n \t/*\n \t * Not all architectures have an exact copy_from_user(). Resort to\ndiff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c\nindex 5821e33df78f..97c0b391b98e 100644\n--- a/fs/ocfs2/dlmfs/dlmfs.c\n+++ b/fs/ocfs2/dlmfs/dlmfs.c\n@@ -255,7 +255,7 @@ static ssize_t dlmfs_file_write(struct file *filp,\n \tif (!count)\n \t\treturn 0;\n \n-\tbytes_left = copy_from_user(lvb_buf, buf, count);\n+\tbytes_left = copy_from_user_partial(lvb_buf, buf, count);\n \tcount -= bytes_left;\n \tif (count)\n \t\tuser_dlm_write_lvb(inode, lvb_buf, count);\ndiff --git a/fs/proc/base.c b/fs/proc/base.c\nindex d9acfa89c894..49577662ae70 100644\n--- a/fs/proc/base.c\n+++ b/fs/proc/base.c\n@@ -278,7 +278,7 @@ static ssize_t get_mm_proctitle(struct mm_struct *mm, char __user *buf,\n \t\t\tlen -= pos;\n \t\t\tif (len > count)\n \t\t\t\tlen = count;\n-\t\t\tlen -= copy_to_user(buf, page+pos, len);\n+\t\t\tlen -= copy_to_user_partial(buf, page+pos, len);\n \t\t\tif (!len)\n \t\t\t\tlen = -EFAULT;\n \t\t\tret = len;\n@@ -359,7 +359,7 @@ static ssize_t get_mm_cmdline(struct mm_struct *mm, char __user *buf,\n \t\tgot = access_remote_vm(mm, pos, page, size, FOLL_ANON);\n \t\tif (got <= 0)\n \t\t\tbreak;\n-\t\tgot -= copy_to_user(buf, page, got);\n+\t\tgot -= copy_to_user_partial(buf, page, got);\n \t\tif (unlikely(!got)) {\n \t\t\tif (!len)\n \t\t\t\tlen = -EFAULT;\ndiff --git a/include/linux/bpfptr.h b/include/linux/bpfptr.h\nindex f6e0795db484..e4444d0f0cfe 100644\n--- a/include/linux/bpfptr.h\n+++ b/include/linux/bpfptr.h\n@@ -50,7 +50,7 @@ static inline int copy_from_bpfptr_offset(void *dst, bpfptr_t src,\n \t\t\t\t\t size_t offset, size_t size)\n {\n \tif (!bpfptr_is_kernel(src))\n-\t\treturn copy_from_user(dst, src.user + offset, size);\n+\t\treturn copy_from_user_partial(dst, src.user + offset, size);\n \treturn copy_from_kernel_nofault(dst, src.kernel + offset, size);\n }\n \ndiff --git a/include/linux/sockptr.h b/include/linux/sockptr.h\nindex 3e6c8e9d67ae..52ddddfe728d 100644\n--- a/include/linux/sockptr.h\n+++ b/include/linux/sockptr.h\n@@ -45,7 +45,7 @@ static inline int copy_from_sockptr_offset(void *dst, sockptr_t src,\n \t\tsize_t offset, size_t size)\n {\n \tif (!sockptr_is_kernel(src))\n-\t\treturn copy_from_user(dst, src.user + offset, size);\n+\t\treturn copy_from_user_partial(dst, src.user + offset, size);\n \tmemcpy(dst, src.kernel + offset, size);\n \treturn 0;\n }\n@@ -111,7 +111,7 @@ static inline int copy_to_sockptr_offset(sockptr_t dst, size_t offset,\n \t\tconst void *src, size_t size)\n {\n \tif (!sockptr_is_kernel(dst))\n-\t\treturn copy_to_user(dst.user + offset, src, size);\n+\t\treturn copy_to_user_partial(dst.user + offset, src, size);\n \tmemcpy(dst.kernel + offset, src, size);\n \treturn 0;\n }\ndiff --git a/ipc/msg.c b/ipc/msg.c\nindex 62996b97f0ac..39848238219d 100644\n--- a/ipc/msg.c\n+++ b/ipc/msg.c\n@@ -322,7 +322,7 @@ copy_msqid_to_user(void __user *buf, struct msqid64_ds *in, int version)\n {\n \tswitch (version) {\n \tcase IPC_64:\n-\t\treturn copy_to_user(buf, in, sizeof(*in));\n+\t\treturn copy_to_user_partial(buf, in, sizeof(*in));\n \tcase IPC_OLD:\n \t{\n \t\tstruct msqid_ds out;\n@@ -355,7 +355,7 @@ copy_msqid_to_user(void __user *buf, struct msqid64_ds *in, int version)\n \t\tout.msg_lspid\t\t= in->msg_lspid;\n \t\tout.msg_lrpid\t\t= in->msg_lrpid;\n \n-\t\treturn copy_to_user(buf, &out, sizeof(out));\n+\t\treturn copy_to_user_partial(buf, &out, sizeof(out));\n \t}\n \tdefault:\n \t\treturn -EINVAL;\n@@ -712,7 +712,7 @@ static int copy_compat_msqid_to_user(void __user *buf, struct msqid64_ds *in,\n \t\tv.msg_qbytes = in->msg_qbytes;\n \t\tv.msg_lspid = in->msg_lspid;\n \t\tv.msg_lrpid = in->msg_lrpid;\n-\t\treturn copy_to_user(buf, &v, sizeof(v));\n+\t\treturn copy_to_user_partial(buf, &v, sizeof(v));\n \t} else {\n \t\tstruct compat_msqid_ds v;\n \t\tmemset(&v, 0, sizeof(v));\n@@ -725,7 +725,7 @@ static int copy_compat_msqid_to_user(void __user *buf, struct msqid64_ds *in,\n \t\tv.msg_qbytes = in->msg_qbytes;\n \t\tv.msg_lspid = in->msg_lspid;\n \t\tv.msg_lrpid = in->msg_lrpid;\n-\t\treturn copy_to_user(buf, &v, sizeof(v));\n+\t\treturn copy_to_user_partial(buf, &v, sizeof(v));\n \t}\n }\n \ndiff --git a/ipc/sem.c b/ipc/sem.c\nindex 6cdf862b1f5c..3b56086ba07d 100644\n--- a/ipc/sem.c\n+++ b/ipc/sem.c\n@@ -1196,7 +1196,7 @@ static unsigned long copy_semid_to_user(void __user *buf, struct semid64_ds *in,\n {\n \tswitch (version) {\n \tcase IPC_64:\n-\t\treturn copy_to_user(buf, in, sizeof(*in));\n+\t\treturn copy_to_user_partial(buf, in, sizeof(*in));\n \tcase IPC_OLD:\n \t {\n \t\tstruct semid_ds out;\n@@ -1209,7 +1209,7 @@ static unsigned long copy_semid_to_user(void __user *buf, struct semid64_ds *in,\n \t\tout.sem_ctime\t= in->sem_ctime;\n \t\tout.sem_nsems\t= in->sem_nsems;\n \n-\t\treturn copy_to_user(buf, &out, sizeof(out));\n+\t\treturn copy_to_user_partial(buf, &out, sizeof(out));\n \t }\n \tdefault:\n \t\treturn -EINVAL;\n@@ -1759,7 +1759,7 @@ static int copy_compat_semid_to_user(void __user *buf, struct semid64_ds *in,\n \t\tv.sem_ctime\t = lower_32_bits(in->sem_ctime);\n \t\tv.sem_ctime_high = upper_32_bits(in->sem_ctime);\n \t\tv.sem_nsems = in->sem_nsems;\n-\t\treturn copy_to_user(buf, &v, sizeof(v));\n+\t\treturn copy_to_user_partial(buf, &v, sizeof(v));\n \t} else {\n \t\tstruct compat_semid_ds v;\n \t\tmemset(&v, 0, sizeof(v));\n@@ -1767,7 +1767,7 @@ static int copy_compat_semid_to_user(void __user *buf, struct semid64_ds *in,\n \t\tv.sem_otime = in->sem_otime;\n \t\tv.sem_ctime = in->sem_ctime;\n \t\tv.sem_nsems = in->sem_nsems;\n-\t\treturn copy_to_user(buf, &v, sizeof(v));\n+\t\treturn copy_to_user_partial(buf, &v, sizeof(v));\n \t}\n }\n \ndiff --git a/ipc/shm.c b/ipc/shm.c\nindex a95dae447707..1eb53c3df3b9 100644\n--- a/ipc/shm.c\n+++ b/ipc/shm.c\n@@ -853,7 +853,7 @@ static inline unsigned long copy_shmid_to_user(void __user *buf, struct shmid64_\n {\n \tswitch (version) {\n \tcase IPC_64:\n-\t\treturn copy_to_user(buf, in, sizeof(*in));\n+\t\treturn copy_to_user_partial(buf, in, sizeof(*in));\n \tcase IPC_OLD:\n \t {\n \t\tstruct shmid_ds out;\n@@ -868,7 +868,7 @@ static inline unsigned long copy_shmid_to_user(void __user *buf, struct shmid64_\n \t\tout.shm_lpid\t= in->shm_lpid;\n \t\tout.shm_nattch\t= in->shm_nattch;\n \n-\t\treturn copy_to_user(buf, &out, sizeof(out));\n+\t\treturn copy_to_user_partial(buf, &out, sizeof(out));\n \t }\n \tdefault:\n \t\treturn -EINVAL;\n@@ -905,7 +905,7 @@ static inline unsigned long copy_shminfo_to_user(void __user *buf, struct shminf\n {\n \tswitch (version) {\n \tcase IPC_64:\n-\t\treturn copy_to_user(buf, in, sizeof(*in));\n+\t\treturn copy_to_user_partial(buf, in, sizeof(*in));\n \tcase IPC_OLD:\n \t {\n \t\tstruct shminfo out;\n@@ -920,7 +920,7 @@ static inline unsigned long copy_shminfo_to_user(void __user *buf, struct shminf\n \t\tout.shmseg\t= in->shmseg;\n \t\tout.shmall\t= in->shmall;\n \n-\t\treturn copy_to_user(buf, &out, sizeof(out));\n+\t\treturn copy_to_user_partial(buf, &out, sizeof(out));\n \t }\n \tdefault:\n \t\treturn -EINVAL;\n@@ -1359,7 +1359,7 @@ static int copy_compat_shminfo_to_user(void __user *buf, struct shminfo64 *in,\n \t\tinfo.shmmni = in->shmmni;\n \t\tinfo.shmseg = in->shmseg;\n \t\tinfo.shmall = in->shmall;\n-\t\treturn copy_to_user(buf, &info, sizeof(info));\n+\t\treturn copy_to_user_partial(buf, &info, sizeof(info));\n \t} else {\n \t\tstruct shminfo info;\n \t\tmemset(&info, 0, sizeof(info));\n@@ -1368,7 +1368,7 @@ static int copy_compat_shminfo_to_user(void __user *buf, struct shminfo64 *in,\n \t\tinfo.shmmni = in->shmmni;\n \t\tinfo.shmseg = in->shmseg;\n \t\tinfo.shmall = in->shmall;\n-\t\treturn copy_to_user(buf, &info, sizeof(info));\n+\t\treturn copy_to_user_partial(buf, &info, sizeof(info));\n \t}\n }\n \n@@ -1384,7 +1384,7 @@ static int put_compat_shm_info(struct shm_info *ip,\n \tinfo.shm_swp = ip->shm_swp;\n \tinfo.swap_attempts = ip->swap_attempts;\n \tinfo.swap_successes = ip->swap_successes;\n-\treturn copy_to_user(uip, &info, sizeof(info));\n+\treturn copy_to_user_partial(uip, &info, sizeof(info));\n }\n \n static int copy_compat_shmid_to_user(void __user *buf, struct shmid64_ds *in,\n@@ -1404,7 +1404,7 @@ static int copy_compat_shmid_to_user(void __user *buf, struct shmid64_ds *in,\n \t\tv.shm_nattch = in->shm_nattch;\n \t\tv.shm_cpid = in->shm_cpid;\n \t\tv.shm_lpid = in->shm_lpid;\n-\t\treturn copy_to_user(buf, &v, sizeof(v));\n+\t\treturn copy_to_user_partial(buf, &v, sizeof(v));\n \t} else {\n \t\tstruct compat_shmid_ds v;\n \t\tmemset(&v, 0, sizeof(v));\n@@ -1417,7 +1417,7 @@ static int copy_compat_shmid_to_user(void __user *buf, struct shmid64_ds *in,\n \t\tv.shm_nattch = in->shm_nattch;\n \t\tv.shm_cpid = in->shm_cpid;\n \t\tv.shm_lpid = in->shm_lpid;\n-\t\treturn copy_to_user(buf, &v, sizeof(v));\n+\t\treturn copy_to_user_partial(buf, &v, sizeof(v));\n \t}\n }\n \ndiff --git a/kernel/regset.c b/kernel/regset.c\nindex b2871fa68b2a..29c6d19c3465 100644\n--- a/kernel/regset.c\n+++ b/kernel/regset.c\n@@ -70,7 +70,7 @@ int copy_regset_to_user(struct task_struct *target,\n \n \tret = regset_get_alloc(target, regset, size, &buf);\n \tif (ret > 0)\n-\t\tret = copy_to_user(data, buf, ret) ? -EFAULT : 0;\n+\t\tret = copy_to_user_partial(data, buf, ret) ? -EFAULT : 0;\n \tkvfree(buf);\n \treturn ret;\n }\ndiff --git a/kernel/sys.c b/kernel/sys.c\nindex 62e842055cc9..8e1ce8c26884 100644\n--- a/kernel/sys.c\n+++ b/kernel/sys.c\n@@ -1343,7 +1343,7 @@ static int override_release(char __user *release, size_t len)\n \t\tv = LINUX_VERSION_PATCHLEVEL + 60;\n \t\tcopy = clamp_t(size_t, len, 1, sizeof(buf));\n \t\tcopy = scnprintf(buf, copy, \"2.6.%u%s\", v, rest);\n-\t\tret = copy_to_user(release, buf, copy + 1);\n+\t\tret = copy_to_user_partial(release, buf, copy + 1);\n \t}\n \treturn ret;\n }\n@@ -1567,7 +1567,7 @@ SYSCALL_DEFINE2(getrlimit, unsigned int, resource, struct rlimit __user *, rlim)\n \n \tret = do_prlimit(current, resource, NULL, &value);\n \tif (!ret)\n-\t\tret = copy_to_user(rlim, &value, sizeof(*rlim)) ? -EFAULT : 0;\n+\t\tret = copy_to_user_partial(rlim, &value, sizeof(*rlim)) ? -EFAULT : 0;\n \n \treturn ret;\n }\ndiff --git a/lib/kfifo.c b/lib/kfifo.c\nindex 2633f9cc336c..00c19a321aae 100644\n--- a/lib/kfifo.c\n+++ b/lib/kfifo.c\n@@ -203,11 +203,11 @@ static unsigned long kfifo_copy_from_user(struct __kfifo *fifo,\n \t}\n \tl = min(len, size - off);\n \n-\tret = copy_from_user(fifo->data + off, from, l);\n+\tret = copy_from_user_partial(fifo->data + off, from, l);\n \tif (unlikely(ret))\n \t\tret = DIV_ROUND_UP(ret + len - l, esize);\n \telse {\n-\t\tret = copy_from_user(fifo->data, from + l, len - l);\n+\t\tret = copy_from_user_partial(fifo->data, from + l, len - l);\n \t\tif (unlikely(ret))\n \t\t\tret = DIV_ROUND_UP(ret, esize);\n \t}\n@@ -263,11 +263,11 @@ static unsigned long kfifo_copy_to_user(struct __kfifo *fifo, void __user *to,\n \t}\n \tl = min(len, size - off);\n \n-\tret = copy_to_user(to, fifo->data + off, l);\n+\tret = copy_to_user_partial(to, fifo->data + off, l);\n \tif (unlikely(ret))\n \t\tret = DIV_ROUND_UP(ret + len - l, esize);\n \telse {\n-\t\tret = copy_to_user(to + l, fifo->data, len - l);\n+\t\tret = copy_to_user_partial(to + l, fifo->data, len - l);\n \t\tif (unlikely(ret))\n \t\t\tret = DIV_ROUND_UP(ret, esize);\n \t}\ndiff --git a/mm/kasan/kasan_test_c.c b/mm/kasan/kasan_test_c.c\nindex 32d06cbf6a31..a4d19fc1068a 100644\n--- a/mm/kasan/kasan_test_c.c\n+++ b/mm/kasan/kasan_test_c.c\n@@ -2169,9 +2169,9 @@ static void copy_user_test_oob(struct kunit *test)\n \tusermem = (char __user *)useraddr;\n \n \tKUNIT_EXPECT_KASAN_FAIL(test,\n-\t\tunused = copy_from_user(kmem, usermem, size + 1));\n+\t\tunused = copy_from_user_partial(kmem, usermem, size + 1));\n \tKUNIT_EXPECT_KASAN_FAIL_READ(test,\n-\t\tunused = copy_to_user(usermem, kmem, size + 1));\n+\t\tunused = copy_to_user_partial(usermem, kmem, size + 1));\n \tKUNIT_EXPECT_KASAN_FAIL(test,\n \t\tunused = __copy_from_user(kmem, usermem, size + 1));\n \tKUNIT_EXPECT_KASAN_FAIL_READ(test,\ndiff --git a/mm/memory.c b/mm/memory.c\nindex ea6568571131..5a2f7543a2da 100644\n--- a/mm/memory.c\n+++ b/mm/memory.c\n@@ -7529,7 +7529,7 @@ long copy_folio_from_user(struct folio *dst_folio,\n \t\tkaddr = kmap_local_page(subpage);\n \t\tif (!allow_pagefault)\n \t\t\tpagefault_disable();\n-\t\trc = copy_from_user(kaddr, usr_src + i * PAGE_SIZE, PAGE_SIZE);\n+\t\trc = copy_from_user_partial(kaddr, usr_src + i * PAGE_SIZE, PAGE_SIZE);\n \t\tif (!allow_pagefault)\n \t\t\tpagefault_enable();\n \t\tkunmap_local(kaddr);\ndiff --git a/net/x25/af_x25.c b/net/x25/af_x25.c\nindex af8762b24039..7327c98b206a 100644\n--- a/net/x25/af_x25.c\n+++ b/net/x25/af_x25.c\n@@ -471,7 +471,7 @@ static int x25_getsockopt(struct socket *sock, int level, int optname,\n \t\tgoto out;\n \n \tval = test_bit(X25_Q_BIT_FLAG, &x25_sk(sk)->flags);\n-\trc = copy_to_user(optval, &val, len) ? -EFAULT : 0;\n+\trc = copy_to_user_partial(optval, &val, len) ? -EFAULT : 0;\n out:\n \treturn rc;\n }\ndiff --git a/rust/helpers/uaccess.c b/rust/helpers/uaccess.c\nindex 01de4fbbcc84..710e07cd60ae 100644\n--- a/rust/helpers/uaccess.c\n+++ b/rust/helpers/uaccess.c\n@@ -5,13 +5,13 @@\n __rust_helper unsigned long\n rust_helper_copy_from_user(void *to, const void __user *from, unsigned long n)\n {\n-\treturn copy_from_user(to, from, n);\n+\treturn copy_from_user_partial(to, from, n);\n }\n \n __rust_helper unsigned long\n rust_helper_copy_to_user(void __user *to, const void *from, unsigned long n)\n {\n-\treturn copy_to_user(to, from, n);\n+\treturn copy_to_user_partial(to, from, n);\n }\n \n #ifndef CONFIG_ARCH_WANTS_NOINLINE_COPY_USER\ndiff --git a/sound/pci/emu10k1/emufx.c b/sound/pci/emu10k1/emufx.c\nindex 08e0556bf161..3941bf9666a9 100644\n--- a/sound/pci/emu10k1/emufx.c\n+++ b/sound/pci/emu10k1/emufx.c\n@@ -739,10 +739,10 @@ static int copy_gctl_to_user(struct snd_emu10k1 *emu,\n \n \t_dst = (struct snd_emu10k1_fx8010_control_gpr __user *)dst;\n \tif (emu->support_tlv)\n-\t\treturn copy_to_user(&_dst[idx], src, sizeof(*src));\n+\t\treturn copy_to_user_partial(&_dst[idx], src, sizeof(*src));\n \t\n \toctl = (struct snd_emu10k1_fx8010_control_old_gpr __user *)dst;\n-\treturn copy_to_user(&octl[idx], src, sizeof(*octl));\n+\treturn copy_to_user_partial(&octl[idx], src, sizeof(*octl));\n }\n \n static int copy_ctl_elem_id(const struct emu10k1_ctl_elem_id *list, int i,\ndiff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c\nindex 31cc2d91c8d2..d5842d8a8509 100644\n--- a/sound/pci/rme9652/hdsp.c\n+++ b/sound/pci/rme9652/hdsp.c\n@@ -4541,7 +4541,7 @@ static int snd_hdsp_capture_release(struct snd_pcm_substream *substream)\n static inline int copy_u32_le(void __user *dest, void __iomem *src)\n {\n \tu32 val = readl(src);\n-\treturn copy_to_user(dest, &val, 4);\n+\treturn copy_to_user_partial(dest, &val, 4);\n }\n \n static inline int copy_u64_le(void __user *dest, void __iomem *src_low, void __iomem *src_high)\n@@ -4551,7 +4551,7 @@ static inline int copy_u64_le(void __user *dest, void __iomem *src_low, void __i\n \trms_low = readl(src_low);\n \trms_high = readl(src_high);\n \trms = ((u64)rms_high << 32) | rms_low;\n-\treturn copy_to_user(dest, &rms, 8);\n+\treturn copy_to_user_partial(dest, &rms, 8);\n }\n \n static inline int copy_u48_le(void __user *dest, void __iomem *src_low, void __iomem *src_high)\n@@ -4561,7 +4561,7 @@ static inline int copy_u48_le(void __user *dest, void __iomem *src_low, void __i\n \trms_low = readl(src_low) & 0xffffff00;\n \trms_high = readl(src_high) & 0xffffff00;\n \trms = ((u64)rms_high << 32) | rms_low;\n-\treturn copy_to_user(dest, &rms, 8);\n+\treturn copy_to_user_partial(dest, &rms, 8);\n }\n \n static int hdsp_9652_get_peak(struct hdsp *hdsp, struct hdsp_peak_rms __user *peak_rms)\ndiff --git a/sound/soc/intel/avs/probes.c b/sound/soc/intel/avs/probes.c\nindex 099119ad28b3..bc2871d3e18c 100644\n--- a/sound/soc/intel/avs/probes.c\n+++ b/sound/soc/intel/avs/probes.c\n@@ -244,10 +244,10 @@ static int avs_probe_compr_copy(struct snd_soc_component *comp, struct snd_compr\n \tn = rtd->buffer_size - offset;\n \n \tif (count < n) {\n-\t\tret = copy_to_user(buf, ptr, count);\n+\t\tret = copy_to_user_partial(buf, ptr, count);\n \t} else {\n-\t\tret = copy_to_user(buf, ptr, n);\n-\t\tret += copy_to_user(buf + n, rtd->dma_area, count - n);\n+\t\tret = copy_to_user_partial(buf, ptr, n);\n+\t\tret += copy_to_user_partial(buf + n, rtd->dma_area, count - n);\n \t}\n \n \tif (ret)\ndiff --git a/sound/soc/sof/compress.c b/sound/soc/sof/compress.c\nindex 93f2376585db..d54be8a188ec 100644\n--- a/sound/soc/sof/compress.c\n+++ b/sound/soc/sof/compress.c\n@@ -324,10 +324,10 @@ static int sof_compr_copy_playback(struct snd_compr_runtime *rtd,\n \tn = rtd->buffer_size - offset;\n \n \tif (count < n) {\n-\t\tret = copy_from_user(ptr, buf, count);\n+\t\tret = copy_from_user_partial(ptr, buf, count);\n \t} else {\n-\t\tret = copy_from_user(ptr, buf, n);\n-\t\tret += copy_from_user(rtd->dma_area, buf + n, count - n);\n+\t\tret = copy_from_user_partial(ptr, buf, n);\n+\t\tret += copy_from_user_partial(rtd->dma_area, buf + n, count - n);\n \t}\n \n \treturn count - ret;\n@@ -345,10 +345,10 @@ static int sof_compr_copy_capture(struct snd_compr_runtime *rtd,\n \tn = rtd->buffer_size - offset;\n \n \tif (count < n) {\n-\t\tret = copy_to_user(buf, ptr, count);\n+\t\tret = copy_to_user_partial(buf, ptr, count);\n \t} else {\n-\t\tret = copy_to_user(buf, ptr, n);\n-\t\tret += copy_to_user(buf + n, rtd->dma_area, count - n);\n+\t\tret = copy_to_user_partial(buf, ptr, n);\n+\t\tret += copy_to_user_partial(buf + n, rtd->dma_area, count - n);\n \t}\n \n \treturn count - ret;\ndiff --git a/sound/soc/sof/sof-client-probes.c b/sound/soc/sof/sof-client-probes.c\nindex 124f55508159..4c5f4f016ff8 100644\n--- a/sound/soc/sof/sof-client-probes.c\n+++ b/sound/soc/sof/sof-client-probes.c\n@@ -184,10 +184,10 @@ static int sof_probes_compr_copy(struct snd_soc_component *component,\n \tn = rtd->buffer_size - offset;\n \n \tif (count < n) {\n-\t\tret = copy_to_user(buf, ptr, count);\n+\t\tret = copy_to_user_partial(buf, ptr, count);\n \t} else {\n-\t\tret = copy_to_user(buf, ptr, n);\n-\t\tret += copy_to_user(buf + n, rtd->dma_area, count - n);\n+\t\tret = copy_to_user_partial(buf, ptr, n);\n+\t\tret += copy_to_user_partial(buf + n, rtd->dma_area, count - n);\n \t}\n \n \tif (ret)\n", "prefixes": [ "RFC", "v1", "5/9" ] }