From nobody Fri Jul 24 04:50:57 2026 Received: from m16.mail.126.com (m16.mail.126.com [220.197.31.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C646223507C; Fri, 24 Jul 2026 02:18:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=220.197.31.9 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784859488; cv=none; b=pFe1CWVBOoYGm8QzqiT/qbc7FSouQ+G6USKovKHUnzZUEly8Dvnfbb0mrBaJ7/9Bb0/NA3cUVigReni5XUajd/dIj6uu7YjXJ56jgoCGXI6ASdC67rITJpi20OUI6r/hPxlQFPQbqiZryvaIsRCD1QMwPPBNkvHk/ESPH0DtCME= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784859488; c=relaxed/simple; bh=rwRg529y05peA/WWTMCXEBfX3q0s9gAsSrO8arvTDhM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Udv56V9xCfVJxhYRYDg+oD+o8A8OYh9Q+MRX1L6OQV4XPJiKY0WlhSa1tEkaeyJwsovsRQdzUUkw7psDmYIz3pDG1Q5aGJOUQX9hoR9pOBPE59WWeHK9k4fhu75WLIh0eaBRxddYgJdPZ2RsbZvzUVlan9OK951snMtGjcO1eq4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=126.com; spf=pass smtp.mailfrom=126.com; dkim=pass (1024-bit key) header.d=126.com header.i=@126.com header.b=ipar9103; arc=none smtp.client-ip=220.197.31.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=126.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=126.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=126.com header.i=@126.com header.b="ipar9103" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=126.com; s=s110527; h=From:To:Subject:Date:Message-ID:MIME-Version; bh=L/ SZp0vPqZ6bgIHdMlwc9563CUsJkyQzIo7rI6wG1fs=; b=ipar9103VugBwa7uzk RoqjOghrHfRoqDl2bzaHe0YPIkBrqYCLgiYNa1/ES/GRQ8WHq2GbajVuBN2uMDbr +3gkFYU0bsk813V33HstJUih1FcKIA7lBelM4qVniwAowoHQCdo0vuE4VHpsY6gY n6ZDAiMe/dnXvn4gK6jlV0i+Y= Received: from song-MS-7D48.. (unknown []) by gzsmtp2 (Coremail) with SMTP id PSkvCgDnr+wRymJqH7z4DA--.34972S3; Fri, 24 Jul 2026 10:12:39 +0800 (CST) From: Song Chen To: arnd@arndb.de, kees@kernel.org, clm@fb.com, dsterba@suse.com, linux@armlinux.org.uk, catalin.marinas@arm.com, will@kernel.org, guoren@kernel.org, kernel@xen0n.name, maddy@linux.ibm.com, mpe@ellerman.id.au, npiggin@gmail.com, chleroy@kernel.org, pjw@kernel.org, palmer@dabbelt.com, aou@eecs.berkeley.edu, alex@ghiti.fr, gor@linux.ibm.com, borntraeger@linux.ibm.com, agordeev@linux.ibm.com, svens@linux.ibm.com, tglx@kernel.org, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, jpoimboe@kernel.org Cc: linux-arm-kernel@lists.infradead.org, linux-csky@vger.kernel.org, loongarch@lists.linux.dev, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, Song Chen Subject: [RFC PATCH v2 1/3] error-injection: Introduce EI_ETYPE_FALSE for fail_function Date: Fri, 24 Jul 2026 10:12:27 +0800 Message-ID: <20260724021229.47302-2-chensong_2000@126.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260724021229.47302-1-chensong_2000@126.com> References: <20260724021229.47302-1-chensong_2000@126.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: PSkvCgDnr+wRymJqH7z4DA--.34972S3 X-Coremail-Antispam: 1Uf129KBjvJXoWrtr4DJw4kKF1xCrWkZFW8JFb_yoW8JF1DpF 1q9r9rury8K348Cry8AFZ2yr1F9rsrGrZxKasxWws7Zw17tF4kt39FgrWUXrykGrW8uayj va9rWFZ0yr45AFJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0zRwvttUUUUU= X-CM-SenderInfo: xfkh02prqjsjqqqqqiyswou0bp/xtbBsxfqampiyhdNyQAA31 Content-Type: text/plain; charset="utf-8" Introduce EI_ETYPE_FALSE for functions which need false as return value in their error-injections, like btrfs_data_csum_ok. EI_ETYPE_NULL can return 0 too but its readability is not good enough. Signed-off-by: Song Chen --- include/asm-generic/error-injection.h | 1 + kernel/fail_function.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/include/asm-generic/error-injection.h b/include/asm-generic/er= ror-injection.h index b05253f68eaa..6c399121ab7a 100644 --- a/include/asm-generic/error-injection.h +++ b/include/asm-generic/error-injection.h @@ -8,6 +8,7 @@ enum { EI_ETYPE_ERRNO, /* Return -ERRNO if failure */ EI_ETYPE_ERRNO_NULL, /* Return -ERRNO or NULL if failure */ EI_ETYPE_TRUE, /* Return true if failure */ + EI_ETYPE_FALSE, /* Return false if failure */ }; =20 struct error_injection_entry { diff --git a/kernel/fail_function.c b/kernel/fail_function.c index 2eaf55005f49..90cdad0412cd 100644 --- a/kernel/fail_function.c +++ b/kernel/fail_function.c @@ -48,6 +48,8 @@ static unsigned long adjust_error_retval(unsigned long ad= dr, unsigned long retv) break; case EI_ETYPE_TRUE: return 1; + case EI_ETYPE_FALSE: + return 0; } =20 return retv; --=20 2.43.0 From nobody Fri Jul 24 04:50:57 2026 Received: from m16.mail.126.com (m16.mail.126.com [220.197.31.6]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AC6FA1C5D7D; Fri, 24 Jul 2026 02:15:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=220.197.31.6 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784859311; cv=none; b=olxe6ZgDNqXYf60vlPy/nfASZjJLAPhbucyzoG8O5cFHbEuQQrkCy8xj5uKV+y+xeo0AmX/ALJzFlPQrVzYAPUSY2KOyOeICEI4fA+j2bAIyqtTICz0XyRrsGLDpH/JjMcUN0W3D5szONBIzS4RthGcv6hMgzoYqCAfL7cIP5Kc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784859311; c=relaxed/simple; bh=C2IH9lN6ISt8C5qJl7zLutJbyLDuah7mmkj1ow/z4U4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oK4iQLwXRZ0RCf2FfLGfJN6A/Vkdbll3ewxOH4XJKiUiqaFCbWFpLrFXJDbUQZ4ne4X9jp9cBSMzgRfc6dIrc01p+3EbsbtJygx9glHBOF3tz2pg7R2B4EL2r5kAqVYxbTIWE9axvG+J30jDr1bgTz6bK40CGPK776RxtSzlz1w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=126.com; spf=pass smtp.mailfrom=126.com; dkim=pass (1024-bit key) header.d=126.com header.i=@126.com header.b=e4V5LBZg; arc=none smtp.client-ip=220.197.31.6 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=126.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=126.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=126.com header.i=@126.com header.b="e4V5LBZg" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=126.com; s=s110527; h=From:To:Subject:Date:Message-ID:MIME-Version; bh=R0 fZk7cw47NM3PZyeQotTKEsd6zLI7x4WIDlkM2CwcM=; b=e4V5LBZgUcm5oq799U 7a3h6abrPnRrCCVAvummdZRPY8PbC0JeoIi/jMUsu3oBmHVz0vsso+pLxULG/D1v xCoCVPqs72DWoIg/AsQRHgzlMviTeGpOYmqNBW1jHGynpeFYHGo6XiuVKyQ4sbm/ oxpAlt6fWlzkbCvbLcBdYsNNA= Received: from song-MS-7D48.. (unknown []) by gzsmtp2 (Coremail) with SMTP id PSkvCgDnr+wRymJqH7z4DA--.34972S4; Fri, 24 Jul 2026 10:12:43 +0800 (CST) From: Song Chen To: arnd@arndb.de, kees@kernel.org, clm@fb.com, dsterba@suse.com, linux@armlinux.org.uk, catalin.marinas@arm.com, will@kernel.org, guoren@kernel.org, kernel@xen0n.name, maddy@linux.ibm.com, mpe@ellerman.id.au, npiggin@gmail.com, chleroy@kernel.org, pjw@kernel.org, palmer@dabbelt.com, aou@eecs.berkeley.edu, alex@ghiti.fr, gor@linux.ibm.com, borntraeger@linux.ibm.com, agordeev@linux.ibm.com, svens@linux.ibm.com, tglx@kernel.org, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, jpoimboe@kernel.org Cc: linux-arm-kernel@lists.infradead.org, linux-csky@vger.kernel.org, loongarch@lists.linux.dev, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, Song Chen Subject: [RFC PATCH v2 2/3] btrfs: Allow error injection on btrfs_data_csum_ok Date: Fri, 24 Jul 2026 10:12:28 +0800 Message-ID: <20260724021229.47302-3-chensong_2000@126.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260724021229.47302-1-chensong_2000@126.com> References: <20260724021229.47302-1-chensong_2000@126.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: PSkvCgDnr+wRymJqH7z4DA--.34972S4 X-Coremail-Antispam: 1Uf129KBjvJXoW7uFWfZr4kWFykJw4xJFWrXwb_yoW8Xw4fpr WUGw1ruFWDXr97Wrs7Gay09ryFg3yDWa10gFnxZw4YywsIkw1FqrZay3WxGa48KrZrX343 Z3Z0gw17ZF1DAFJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07USeH9UUUUU= X-CM-SenderInfo: xfkh02prqjsjqqqqqiyswou0bp/xtbBpRvra2piyhtNggAA3o Content-Type: text/plain; charset="utf-8" btrfs_data_csum_ok validates the checksum of a data block after a read I/O completes. A mismatch between the on-disk checksum and the one computed from the read data indicates silent data corruption, which can be caused by bit flips due to DRAM errors, storage media degradation, or bus transmission faults. Testing the error handling path that responds to such corruption, including any warning output and uspace notification, normally requires reproducing the hardware fault, which is not always feasible. Mark btrfs_data_csum_ok with ALLOW_ERROR_INJECTION so that the fail_function infrastructure can override its return value to false, simulating a checksum mismatch without requiring actual data corruption. This enables validation of the full error detection and reporting path in a controlled environment. Usage: cd /sys/kernel/debug/fail_function echo btrfs_data_csum_ok > inject echo 0 > btrfs_data_csum_ok/retval echo 100 > probability echo N > times Signed-off-by: Song Chen --- fs/btrfs/inode.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 906d5c21ebc4..6be3e920b954 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -3574,6 +3574,7 @@ bool btrfs_data_csum_ok(struct btrfs_bio *bbio, struc= t btrfs_device *dev, memzero_page(phys_to_page(paddrs[i]), offset_in_page(paddrs[i]), step); return false; } +ALLOW_ERROR_INJECTION(btrfs_data_csum_ok, FALSE); =20 /* * Perform a delayed iput on @inode. --=20 2.43.0 From nobody Fri Jul 24 04:50:57 2026 Received: from m16.mail.126.com (m16.mail.126.com [220.197.31.8]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 701082FF66B; Fri, 24 Jul 2026 02:15:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=220.197.31.8 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784859316; cv=none; b=fJWX7Fnk/Y6qCv4L2a0/Yh8QhiDwi7nm3n1Tj4ZPGPZ8X5xy7rcUmLb/g5PkjM3u6T6DULIWeV7ZFH5rIA5wzFsPp/dhJm35SL3i3Q3D2lP/6H5RRmTx6LvvnbGg8EcoEYEVFh8YCgvl4i+qL13eFzkgLN9cf5xIB/WYopGmt6M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784859316; c=relaxed/simple; bh=x64qnH7Z/XVRp3jXlI8bXqnYx5shnHKsoZa88m5xpUY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EDFvX4shJW3iO5nm2ldr8iMrNXJG+maC3CyUDFUkO3Ayk20Gvhp5GzeXlRch3oYvKou1yzKDu8mWFHKf7hxobt9RrJvlCmeKn6W19WufKH8Q1VK+919j8xD2lhnR3Nwi3dUT/BrL+XjjibCMk01xKqKG5SV2/3Mnu/f2HjlK5QQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=126.com; spf=pass smtp.mailfrom=126.com; dkim=pass (1024-bit key) header.d=126.com header.i=@126.com header.b=Ga9yHEXd; arc=none smtp.client-ip=220.197.31.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=126.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=126.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=126.com header.i=@126.com header.b="Ga9yHEXd" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=126.com; s=s110527; h=From:To:Subject:Date:Message-ID:MIME-Version; bh=vK m5ZaQZj0/THfOt/BL4ITNpCCG/uj8gX537c+qR0iw=; b=Ga9yHEXdoLJFjcSNzQ kblZe0nP9Lq0t3mLP48fAt0rVtKqCI47c/it0BDYEvvgmYxr2oJqsUYJx39DLurs 0o3nGrT0xqh56ofmseQs8Dlc8H6w0vIo+waJfzbmkSOZY1dUrktpq0AEsnd6tWEw tHHQG8jqLBHiIIjjTcUjI4fr4= Received: from song-MS-7D48.. (unknown []) by gzsmtp2 (Coremail) with SMTP id PSkvCgDnr+wRymJqH7z4DA--.34972S5; Fri, 24 Jul 2026 10:12:47 +0800 (CST) From: Song Chen To: arnd@arndb.de, kees@kernel.org, clm@fb.com, dsterba@suse.com, linux@armlinux.org.uk, catalin.marinas@arm.com, will@kernel.org, guoren@kernel.org, kernel@xen0n.name, maddy@linux.ibm.com, mpe@ellerman.id.au, npiggin@gmail.com, chleroy@kernel.org, pjw@kernel.org, palmer@dabbelt.com, aou@eecs.berkeley.edu, alex@ghiti.fr, gor@linux.ibm.com, borntraeger@linux.ibm.com, agordeev@linux.ibm.com, svens@linux.ibm.com, tglx@kernel.org, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, jpoimboe@kernel.org Cc: linux-arm-kernel@lists.infradead.org, linux-csky@vger.kernel.org, loongarch@lists.linux.dev, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, Song Chen Subject: [RFC PATCH v2 3/3] error-injection: Introduce parent in fei_attr Date: Fri, 24 Jul 2026 10:12:29 +0800 Message-ID: <20260724021229.47302-4-chensong_2000@126.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260724021229.47302-1-chensong_2000@126.com> References: <20260724021229.47302-1-chensong_2000@126.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: PSkvCgDnr+wRymJqH7z4DA--.34972S5 X-Coremail-Antispam: 1Uf129KBjvJXoWfJF1kurW7uFWfArWkuw4UJwb_yoWDXF1fpF y3A3srWrWrWw1rGrZrAa1rZw1FkrsxZFy7AFyxGa4fu39IqFyIqF1fWa4jqF4SvrWDGay7 XFs8trW5tF15uFJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07Ug0eXUUUUU= X-CM-SenderInfo: xfkh02prqjsjqqqqqiyswou0bp/xtbBsx-sbGpiyh9OEgAA3t Content-Type: text/plain; charset="utf-8" Add a parent field to fei_attr to allow fault injection on a function only when called from a specific parent function. This enables more precise fault injection control, for example, injecting failures into btrfs_data_csum_ok() only when called from btrfs_check_read_bio(), not from btrfs_end_repair_bio(). Introduce fei_return_address() in each architecture's error-injection.c (x86, arm64, riscv, loongarch) to retrieve the return address from pt_regs in a kprobe handler, following the same pattern as the existing override_function_with_return(). A new parent debugfs file is added under /sys/kernel/debug/fail_function// to configure the filter. Usage: echo "btrfs_data_csum_ok" > /sys/kernel/debug/fail_function/inject echo 0 > /sys/kernel/debug/fail_function/btrfs_data_csum_ok/retval echo 100 > /sys/kernel/debug/fail_function/probability echo 10 > /sys/kernel/debug/fail_function/times echo "btrfs_check_read_bio" > \ /sys/kernel/debug/fail_function/btrfs_data_csum_ok/parent To clear the parent filter: echo "" > /sys/kernel/debug/fail_function/btrfs_data_csum_ok/parent Signed-off-by: Song Chen --- arch/arm/lib/error-inject.c | 6 ++ arch/arm64/lib/error-inject.c | 6 ++ arch/csky/lib/error-inject.c | 6 ++ arch/loongarch/lib/error-inject.c | 6 ++ arch/powerpc/lib/error-inject.c | 6 ++ arch/riscv/lib/error-inject.c | 6 ++ arch/s390/lib/error-inject.c | 6 ++ arch/x86/lib/error-inject.c | 6 ++ include/asm-generic/error-injection.h | 5 ++ kernel/fail_function.c | 96 ++++++++++++++++++++++++++- 10 files changed, 148 insertions(+), 1 deletion(-) diff --git a/arch/arm/lib/error-inject.c b/arch/arm/lib/error-inject.c index 5a5b405792ba..1f7a482555ea 100644 --- a/arch/arm/lib/error-inject.c +++ b/arch/arm/lib/error-inject.c @@ -8,3 +8,9 @@ void override_function_with_return(struct pt_regs *regs) instruction_pointer_set(regs, regs->ARM_lr); } NOKPROBE_SYMBOL(override_function_with_return); + +unsigned long fei_return_address(struct pt_regs *regs) +{ + return regs->ARM_lr; +} +NOKPROBE_SYMBOL(fei_return_address); diff --git a/arch/arm64/lib/error-inject.c b/arch/arm64/lib/error-inject.c index ed15021da3ed..ccd33c92bb37 100644 --- a/arch/arm64/lib/error-inject.c +++ b/arch/arm64/lib/error-inject.c @@ -16,3 +16,9 @@ void override_function_with_return(struct pt_regs *regs) instruction_pointer_set(regs, procedure_link_pointer(regs)); } NOKPROBE_SYMBOL(override_function_with_return); + +unsigned long fei_return_address(struct pt_regs *regs) +{ + return procedure_link_pointer(regs); +} +NOKPROBE_SYMBOL(fei_return_address); diff --git a/arch/csky/lib/error-inject.c b/arch/csky/lib/error-inject.c index c15fb36fe067..c7a1b3948c76 100644 --- a/arch/csky/lib/error-inject.c +++ b/arch/csky/lib/error-inject.c @@ -8,3 +8,9 @@ void override_function_with_return(struct pt_regs *regs) instruction_pointer_set(regs, regs->lr); } NOKPROBE_SYMBOL(override_function_with_return); + +unsigned long fei_return_address(struct pt_regs *regs) +{ + return regs->lr; +} +NOKPROBE_SYMBOL(fei_return_address); diff --git a/arch/loongarch/lib/error-inject.c b/arch/loongarch/lib/error-i= nject.c index afc9e1c7c973..844356fef828 100644 --- a/arch/loongarch/lib/error-inject.c +++ b/arch/loongarch/lib/error-inject.c @@ -8,3 +8,9 @@ void override_function_with_return(struct pt_regs *regs) instruction_pointer_set(regs, regs->regs[1]); } NOKPROBE_SYMBOL(override_function_with_return); + +unsigned long fei_return_address(struct pt_regs *regs) +{ + return regs->regs[1]; +} +NOKPROBE_SYMBOL(fei_return_address); diff --git a/arch/powerpc/lib/error-inject.c b/arch/powerpc/lib/error-injec= t.c index e834079d2b5c..c72abce5d19f 100644 --- a/arch/powerpc/lib/error-inject.c +++ b/arch/powerpc/lib/error-inject.c @@ -14,3 +14,9 @@ void override_function_with_return(struct pt_regs *regs) regs_set_return_ip(regs, regs->link); } NOKPROBE_SYMBOL(override_function_with_return); + +unsigned long fei_return_address(struct pt_regs *regs) +{ + return regs->link; +} +NOKPROBE_SYMBOL(fei_return_address); diff --git a/arch/riscv/lib/error-inject.c b/arch/riscv/lib/error-inject.c index d667ade2bc41..ed8b17acc379 100644 --- a/arch/riscv/lib/error-inject.c +++ b/arch/riscv/lib/error-inject.c @@ -8,3 +8,9 @@ void override_function_with_return(struct pt_regs *regs) instruction_pointer_set(regs, regs->ra); } NOKPROBE_SYMBOL(override_function_with_return); + +unsigned long fei_return_address(struct pt_regs *regs) +{ + return regs->ra; +} +NOKPROBE_SYMBOL(fei_return_address); diff --git a/arch/s390/lib/error-inject.c b/arch/s390/lib/error-inject.c index 8c9d4da87eef..15b23076ebeb 100644 --- a/arch/s390/lib/error-inject.c +++ b/arch/s390/lib/error-inject.c @@ -12,3 +12,9 @@ void override_function_with_return(struct pt_regs *regs) regs->psw.addr =3D regs->gprs[14]; } NOKPROBE_SYMBOL(override_function_with_return); + +unsigned long fei_return_address(struct pt_regs *regs) +{ + return regs->gprs[14]; +} +NOKPROBE_SYMBOL(fei_return_address); diff --git a/arch/x86/lib/error-inject.c b/arch/x86/lib/error-inject.c index 512a2538596f..85cc46e2dd7c 100644 --- a/arch/x86/lib/error-inject.c +++ b/arch/x86/lib/error-inject.c @@ -23,3 +23,9 @@ void override_function_with_return(struct pt_regs *regs) regs->ip =3D (unsigned long)&just_return_func; } NOKPROBE_SYMBOL(override_function_with_return); + +unsigned long fei_return_address(struct pt_regs *regs) +{ + return *(unsigned long *)regs->sp; +} +NOKPROBE_SYMBOL(fei_return_address); diff --git a/include/asm-generic/error-injection.h b/include/asm-generic/er= ror-injection.h index 6c399121ab7a..8f526d76cdcb 100644 --- a/include/asm-generic/error-injection.h +++ b/include/asm-generic/error-injection.h @@ -34,10 +34,15 @@ static struct error_injection_entry __used \ } =20 void override_function_with_return(struct pt_regs *regs); +unsigned long fei_return_address(struct pt_regs *regs); #else #define ALLOW_ERROR_INJECTION(fname, _etype) =20 static inline void override_function_with_return(struct pt_regs *regs) { } +static inline unsigned long fei_return_address(struct pt_regs *regs) +{ + return 0UL; +} #endif #endif =20 diff --git a/kernel/fail_function.c b/kernel/fail_function.c index 90cdad0412cd..a336fc565dc9 100644 --- a/kernel/fail_function.c +++ b/kernel/fail_function.c @@ -27,6 +27,9 @@ struct fei_attr { struct list_head list; struct kprobe kp; unsigned long retval; + char parent[KSYM_NAME_LEN]; + unsigned long parent_start; + unsigned long parent_end; }; static DEFINE_MUTEX(fei_lock); static LIST_HEAD(fei_attr_list); @@ -154,13 +157,94 @@ static int fei_retval_get(void *data, u64 *val) DEFINE_DEBUGFS_ATTRIBUTE(fei_retval_ops, fei_retval_get, fei_retval_set, "%llx\n"); =20 +static ssize_t fei_parent_read(struct file *file, char __user *buf, + size_t count, loff_t *ppos) +{ + struct fei_attr *attr =3D file->private_data; + char tmp[KSYM_NAME_LEN + 1]; + int len; + int err =3D 0; + + mutex_lock(&fei_lock); + if (!fei_attr_is_valid(attr)) { + err =3D -ENOENT; + goto out; + } + len =3D scnprintf(tmp, sizeof(tmp), "%s\n", attr->parent); + mutex_unlock(&fei_lock); + + return simple_read_from_buffer(buf, count, ppos, tmp, len); +out: + mutex_unlock(&fei_lock); + return err; +} + +static ssize_t fei_parent_write(struct file *file, const char __user *buf, + size_t count, loff_t *ppos) +{ + struct fei_attr *attr =3D file->private_data; + char tmp[KSYM_NAME_LEN]; + unsigned long start, size; + ssize_t err =3D 0; + + if (count =3D=3D 0 || count >=3D sizeof(tmp)) + return -EINVAL; + + if (copy_from_user(tmp, buf, count)) + return -EFAULT; + + tmp[count] =3D '\0'; + strim(tmp); + + mutex_lock(&fei_lock); + if (!fei_attr_is_valid(attr)) { + err =3D -ENOENT; + goto out; + } + + if (tmp[0] =3D=3D '\0') { + attr->parent[0] =3D '\0'; + attr->parent_start =3D 0; + attr->parent_end =3D 0; + err =3D count; + goto out; + } + + start =3D kallsyms_lookup_name(tmp); + if (!start) { + err =3D -EINVAL; + goto out; + } + + if (!kallsyms_lookup_size_offset(start, &size, NULL)) { + err =3D -EINVAL; + goto out; + } + + strscpy(attr->parent, tmp, sizeof(attr->parent)); + attr->parent_start =3D start; + attr->parent_end =3D start + size; + err =3D count; + +out: + mutex_unlock(&fei_lock); + return err; +} + +static const struct file_operations fei_parent_ops =3D { + .owner =3D THIS_MODULE, + .open =3D simple_open, + .read =3D fei_parent_read, + .write =3D fei_parent_write, +}; + static void fei_debugfs_add_attr(struct fei_attr *attr) { struct dentry *dir; =20 dir =3D debugfs_create_dir(attr->kp.symbol_name, fei_debugfs_dir); - debugfs_create_file("retval", 0600, dir, attr, &fei_retval_ops); + debugfs_create_file("parent", 0600, dir, attr, &fei_parent_ops); } =20 static void fei_debugfs_remove_attr(struct fei_attr *attr) @@ -171,6 +255,16 @@ static void fei_debugfs_remove_attr(struct fei_attr *a= ttr) static int fei_kprobe_handler(struct kprobe *kp, struct pt_regs *regs) { struct fei_attr *attr =3D container_of(kp, struct fei_attr, kp); + unsigned long ret_addr =3D 0; + bool in_parent =3D false; + + ret_addr =3D fei_return_address(regs); + if (attr->parent_start) { + in_parent =3D (ret_addr >=3D attr->parent_start && + ret_addr < attr->parent_end); + if (!in_parent) + return 0; + } =20 if (should_fail(&fei_fault_attr, 1)) { regs_set_return_value(regs, attr->retval); --=20 2.43.0