From nobody Mon Apr 6 10:36:57 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 79B622248B3 for ; Sun, 29 Mar 2026 10:45:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774781132; cv=none; b=LFbkSqV3+3jzTSGcobHDAJaAJwwftEKe0w2odb2NdhEk5oq0KPumR9PzO17aiCYealhu1b+jVmCfHyItQN608k4nUneP9CIuuKzi4/tvd5ZOCc+32HJvQCBekBURPsXMQEiUeLXDms6BxxCkG3NNwPsSkVUeof0tfYSjv2fBau8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774781132; c=relaxed/simple; bh=byZn94NxoaGSGigXnG3B+BNbKvcykYDcIYUg8s93bqM=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=rF3xT4a7nVp+rIxo5f7bAwvE5buo/Iqzfj3q8VcG8Cx4L1wpMV7cXr3+Xw9PShIA5BQeywYm93zohOu7/5gr0nBRA0ruKLOc5+l8wfHZFCfyFiPgnUO2fi40N/uAUxUDtmifUi/2quPx/n++xBJ3a7U3XM3oLVwDG3PO4EWpZxA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=G28QXw/X; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="G28QXw/X" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-48334ee0aeaso29726285e9.1 for ; Sun, 29 Mar 2026 03:45:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774781130; x=1775385930; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=rUtx9MBrKKdVVK4+rruGEsG6IE+IP4DvHcD7OpZeCTQ=; b=G28QXw/XBYoUhb8YhtiwcLBvgL+jF11OWdM7dsOfMNz5E8HNvKNEM2g1JCt4+dnoaI 5+XU9ofzHf9wUjBGXO+zFhRJKbVUCIiGRzhC5BozPGtlCqsvN+AzHr55aOvytHQKJRNN u2tduL0gORjn1Ho2cqIeQ5MoVxhZA3lQR77820KbBOqmqbyGhibEVO6/DHi8kbMkLJ9R x8lqhNgC5l/00OuYcrSOg1zeezrBD29Z1nMwHqxFAXx4AeifUBx7iaHZO4dwnzHbQGzY DnEUyXF0mD0aOzopSxzD4CITpiBweHzexNe/l42ahKS+aKGUz2yqpA6zdBBBhp66Aupn pvkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774781130; x=1775385930; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=rUtx9MBrKKdVVK4+rruGEsG6IE+IP4DvHcD7OpZeCTQ=; b=lJfNWYZQRSxcObj+6kg3Qvse2uTDHnp3tb53H5Lt78m35lSqR/s5L6xJvbHhcecDN+ PhTG1opG31b9eCKJlJWXyBSmZKVV6TS6SwlhjkoxxOKSab8S/6KrHGTpIsUdVplH4qst ft0/HosBBBTQAhjs62Nk/Ldyt2N4yznJXRlDjjFteyr8UKJEcARS+zeflV1xdTCD6daa yGJCPEl1ftZxcWGO9xEom+V0EdvqwBTP1TK8AjuydQ8HMbrJoyYcTngaDMNg6vWcRAlg Qk6XKGBiYaL8bC4SWtMTYdwr5HxaRu/pnkV4VeQwe57aht3Vul1iEmq820wMPLbZp7K+ 5/Ng== X-Forwarded-Encrypted: i=1; AJvYcCVYDoVwPllJoxMseRdnwuhjA8FGZEL3YIez97Ugj9r91lJAsVWujWN1rH+wEvdPaypwBqeY3IUkrup7Tqk=@vger.kernel.org X-Gm-Message-State: AOJu0Ywid6HkV/r56iAAhOtPPakS+p8u0JVwMaPChOIEd/OhfQSfvmHJ U+P2Uxe1Mhqzx/QTDKYV292zlOPG3fVCmIW8PKK1RIFrWE58mEZzwgI= X-Gm-Gg: ATEYQzwOrEJeMDXVLzf2VCRTFiUTNVfcOfGMPWjI4Gal50GPkUBV1FDgbwGnvB/mRDY 5ZYAX5r5Juq8cZjah4WIfbmib1/Qj/z4rLnOihB+nJNmtHZy1npTy9xv2OIdFGEefOSpGO7SmSu 4nTVBZTBeCkY8sujUY43/9t9Dp1bEhB4T1pr9hRKY1MThzFGBwNoWaIJ8uSR/19N0NxXdWToEda EqrM2jFU2x5FX7QXUfbU+TSQ/rjBwWboBjLStXR2AtJwYPiLqES2BfLmruUhnPDul5FK4dv8rqC 8g8ww1XTVe4MqKgU8W5KMiIfhjozoC9XIPb2+gFPb/F/fcqShLokV4GOKcL3HJk7bRqgoF6CIBL lK8HsHQySZfoxcP5EQDy75QBnOOH36ahcX0oGqZO5LvyV7zRJNTQh9ipev2rCyUD2xQpsT6O8iJ D6jSvJT1aiHtwvvyE6RfDvlHKdSo8= X-Received: by 2002:a05:600c:c081:b0:485:4453:401d with SMTP id 5b1f17b1804b1-48727d5a269mr108675325e9.2.1774781129463; Sun, 29 Mar 2026 03:45:29 -0700 (PDT) Received: from panzer.local ([188.246.34.248]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43cf21ebef9sm11269286f8f.13.2026.03.29.03.45.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Mar 2026 03:45:28 -0700 (PDT) From: Mirko Adzic To: adzicmirko97@gmail.com, ojeda@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, daniel.almeida@collabora.com, khali@linux-fr.org Cc: boqun@kernel.org, gary@garyguo.net, bjorn3_gh@protonmail.com, lossin@kernel.org, a.hindborg@kernel.org, aliceryhl@google.com, tmgross@umich.edu, dakr@kernel.org, tamird@kernel.org, alistair.francis@wdc.com, acourbot@nvidia.com, work@onurozkan.dev, rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] rust: error: clarify that `from_err_ptr` can return `Ok(NULL)` Date: Sun, 29 Mar 2026 12:41:10 +0200 Message-ID: <20260329104319.131057-1-adzicmirko97@gmail.com> X-Mailer: git-send-email 2.53.0 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 Content-Type: text/plain; charset="utf-8" Improve the doc comment of `from_err_ptr` by explicitly stating that it will return `Ok(NULL)` when passed a null pointer, as it isn't an error value. Add a doctest case that tests the behavior described above, as well as other scenarios (non-null/non-error pointer, error value). Suggested-by: Miguel Ojeda Link: https://lore.kernel.org/rust-for-linux/20260322193830.89324-1-ojeda@k= ernel.org/ Link: https://github.com/Rust-for-Linux/linux/issues/1231 Signed-off-by: Mirko Adzic Reviewed-by: Alice Ryhl --- v1 -> v2: - Move the doctest code outside of functions so that it actually gets executed. - Instead of asserting a magic pointer value that comes from a hidden module, simply assert it isn't null. v1: https://lore.kernel.org/all/20260328114005.125617-1-adzicmirko97@gmail.= com/ rust/kernel/error.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/rust/kernel/error.rs b/rust/kernel/error.rs index 935787c2a91c..e3e8ff775e0d 100644 --- a/rust/kernel/error.rs +++ b/rust/kernel/error.rs @@ -452,6 +452,9 @@ pub fn to_result(err: crate::ffi::c_int) -> Result { /// for errors. This function performs the check and converts the "error p= ointer" /// to a normal pointer in an idiomatic fashion. /// +/// Note that a `NULL` pointer is not considered an error pointer, and is = returned +/// as-is, wrapped in `Ok`. +/// /// # Examples /// /// ```ignore @@ -466,6 +469,35 @@ pub fn to_result(err: crate::ffi::c_int) -> Result { /// from_err_ptr(unsafe { bindings::devm_platform_ioremap_resource(pde= v.to_ptr(), index) }) /// } /// ``` +/// +/// ``` +/// # use kernel::error::from_err_ptr; +/// # mod bindings { +/// # use kernel::prelude::*; +/// # pub(super) unsafe fn einval_err_ptr() -> *mut kernel::ffi::c_voi= d { +/// # let einval =3D -(kernel::bindings::EINVAL as isize); +/// # // SAFETY: `einval` is a valid error. +/// # unsafe { kernel::bindings::ERR_PTR(einval) } +/// # } +/// # pub(super) unsafe fn null_ptr() -> *mut kernel::ffi::c_void { +/// # core::ptr::null_mut() +/// # } +/// # pub(super) unsafe fn non_null_ptr() -> *mut kernel::ffi::c_void { +/// # 0x1234 as *mut kernel::ffi::c_void +/// # } +/// # } +/// // SAFETY: ... +/// let einval_err =3D from_err_ptr(unsafe { bindings::einval_err_ptr() }); +/// assert_eq!(einval_err, Err(EINVAL)); +/// +/// // SAFETY: ... +/// let null_ok =3D from_err_ptr(unsafe { bindings::null_ptr() }); +/// assert_eq!(null_ok, Ok(core::ptr::null_mut())); +/// +/// // SAFETY: ... +/// let non_null =3D from_err_ptr(unsafe { bindings::non_null_ptr() }).unw= rap(); +/// assert_ne!(non_null, core::ptr::null_mut()); +/// ``` pub fn from_err_ptr(ptr: *mut T) -> Result<*mut T> { // CAST: Casting a pointer to `*const crate::ffi::c_void` is always va= lid. let const_ptr: *const crate::ffi::c_void =3D ptr.cast(); --=20 2.53.0