]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
firmware: don't copy kernel creds
authorChristian Brauner <brauner@kernel.org>
Sun, 2 Nov 2025 23:12:44 +0000 (00:12 +0100)
committerChristian Brauner <brauner@kernel.org>
Tue, 4 Nov 2025 11:36:10 +0000 (12:36 +0100)
No need to copy kernel credentials.

Link: https://patch.msgid.link/20251103-work-creds-init_cred-v1-5-cb3ec8711a6a@kernel.org
Reviewed-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Christian Brauner <brauner@kernel.org>
drivers/base/firmware_loader/main.c

index 6942c62fa59d122b2e8a3d3240d43472007c2d87..bee3050a20d9e89c00b2bbded06b03abe25edff2 100644 (file)
@@ -829,8 +829,6 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
                  size_t offset, u32 opt_flags)
 {
        struct firmware *fw = NULL;
-       struct cred *kern_cred = NULL;
-       const struct cred *old_cred;
        bool nondirect = false;
        int ret;
 
@@ -871,45 +869,38 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
         * called by a driver when serving an unrelated request from userland, we use
         * the kernel credentials to read the file.
         */
-       kern_cred = prepare_kernel_cred(&init_task);
-       if (!kern_cred) {
-               ret = -ENOMEM;
-               goto out;
-       }
-       old_cred = override_creds(kern_cred);
+       scoped_with_kernel_creds() {
+               ret = fw_get_filesystem_firmware(device, fw->priv, "", NULL);
 
-       ret = fw_get_filesystem_firmware(device, fw->priv, "", NULL);
-
-       /* Only full reads can support decompression, platform, and sysfs. */
-       if (!(opt_flags & FW_OPT_PARTIAL))
-               nondirect = true;
+               /* Only full reads can support decompression, platform, and sysfs. */
+               if (!(opt_flags & FW_OPT_PARTIAL))
+                       nondirect = true;
 
 #ifdef CONFIG_FW_LOADER_COMPRESS_ZSTD
-       if (ret == -ENOENT && nondirect)
-               ret = fw_get_filesystem_firmware(device, fw->priv, ".zst",
-                                                fw_decompress_zstd);
+               if (ret == -ENOENT && nondirect)
+                       ret = fw_get_filesystem_firmware(device, fw->priv, ".zst",
+                                                        fw_decompress_zstd);
 #endif
 #ifdef CONFIG_FW_LOADER_COMPRESS_XZ
-       if (ret == -ENOENT && nondirect)
-               ret = fw_get_filesystem_firmware(device, fw->priv, ".xz",
-                                                fw_decompress_xz);
+               if (ret == -ENOENT && nondirect)
+                       ret = fw_get_filesystem_firmware(device, fw->priv, ".xz",
+                                                        fw_decompress_xz);
 #endif
-       if (ret == -ENOENT && nondirect)
-               ret = firmware_fallback_platform(fw->priv);
+               if (ret == -ENOENT && nondirect)
+                       ret = firmware_fallback_platform(fw->priv);
 
-       if (ret) {
-               if (!(opt_flags & FW_OPT_NO_WARN))
-                       dev_warn(device,
-                                "Direct firmware load for %s failed with error %d\n",
-                                name, ret);
-               if (nondirect)
-                       ret = firmware_fallback_sysfs(fw, name, device,
-                                                     opt_flags, ret);
-       } else
-               ret = assign_fw(fw, device);
-
-       revert_creds(old_cred);
-       put_cred(kern_cred);
+               if (ret) {
+                       if (!(opt_flags & FW_OPT_NO_WARN))
+                               dev_warn(device,
+                                        "Direct firmware load for %s failed with error %d\n",
+                                        name, ret);
+                       if (nondirect)
+                               ret = firmware_fallback_sysfs(fw, name, device,
+                                                             opt_flags, ret);
+               } else {
+                       ret = assign_fw(fw, device);
+               }
+       }
 
 out:
        if (ret < 0) {