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

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

index a853c65ac65dfe0caefb26157e040b605aa4fe89..3263040fcf2d0cd25e495937501dffca8309a66d 100644 (file)
@@ -52,7 +52,6 @@
 static DEFINE_IDR(nbd_index_idr);
 static DEFINE_MUTEX(nbd_index_mutex);
 static struct workqueue_struct *nbd_del_wq;
-static struct cred *nbd_cred;
 static int nbd_total_devices = 0;
 
 struct nbd_sock {
@@ -555,7 +554,6 @@ static int __sock_xmit(struct nbd_device *nbd, struct socket *sock, int send,
        int result;
        struct msghdr msg = {} ;
        unsigned int noreclaim_flag;
-       const struct cred *old_cred;
 
        if (unlikely(!sock)) {
                dev_err_ratelimited(disk_to_dev(nbd->disk),
@@ -564,33 +562,32 @@ static int __sock_xmit(struct nbd_device *nbd, struct socket *sock, int send,
                return -EINVAL;
        }
 
-       old_cred = override_creds(nbd_cred);
-
        msg.msg_iter = *iter;
 
        noreclaim_flag = memalloc_noreclaim_save();
-       do {
-               sock->sk->sk_allocation = GFP_NOIO | __GFP_MEMALLOC;
-               sock->sk->sk_use_task_frag = false;
-               msg.msg_flags = msg_flags | MSG_NOSIGNAL;
-
-               if (send)
-                       result = sock_sendmsg(sock, &msg);
-               else
-                       result = sock_recvmsg(sock, &msg, msg.msg_flags);
-
-               if (result <= 0) {
-                       if (result == 0)
-                               result = -EPIPE; /* short read */
-                       break;
-               }
-               if (sent)
-                       *sent += result;
-       } while (msg_data_left(&msg));
 
-       memalloc_noreclaim_restore(noreclaim_flag);
+       scoped_with_kernel_creds() {
+               do {
+                       sock->sk->sk_allocation = GFP_NOIO | __GFP_MEMALLOC;
+                       sock->sk->sk_use_task_frag = false;
+                       msg.msg_flags = msg_flags | MSG_NOSIGNAL;
 
-       revert_creds(old_cred);
+                       if (send)
+                               result = sock_sendmsg(sock, &msg);
+                       else
+                               result = sock_recvmsg(sock, &msg, msg.msg_flags);
+
+                       if (result <= 0) {
+                               if (result == 0)
+                                       result = -EPIPE; /* short read */
+                               break;
+                       }
+                       if (sent)
+                               *sent += result;
+               } while (msg_data_left(&msg));
+       }
+
+       memalloc_noreclaim_restore(noreclaim_flag);
 
        return result;
 }
@@ -2683,15 +2680,7 @@ static int __init nbd_init(void)
                return -ENOMEM;
        }
 
-       nbd_cred = prepare_kernel_cred(&init_task);
-       if (!nbd_cred) {
-               destroy_workqueue(nbd_del_wq);
-               unregister_blkdev(NBD_MAJOR, "nbd");
-               return -ENOMEM;
-       }
-
        if (genl_register_family(&nbd_genl_family)) {
-               put_cred(nbd_cred);
                destroy_workqueue(nbd_del_wq);
                unregister_blkdev(NBD_MAJOR, "nbd");
                return -EINVAL;
@@ -2746,7 +2735,6 @@ static void __exit nbd_cleanup(void)
        /* Also wait for nbd_dev_remove_work() completes */
        destroy_workqueue(nbd_del_wq);
 
-       put_cred(nbd_cred);
        idr_destroy(&nbd_index_idr);
        unregister_blkdev(NBD_MAJOR, "nbd");
 }