]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
nfs: use credential guards in nfs_local_call_read()
authorChristian Brauner <brauner@kernel.org>
Mon, 3 Nov 2025 11:26:58 +0000 (12:26 +0100)
committerChristian Brauner <brauner@kernel.org>
Tue, 4 Nov 2025 11:36:42 +0000 (12:36 +0100)
Use credential guards for scoped credential override with automatic
restoration on scope exit.

Link: https://patch.msgid.link/20251103-work-creds-guards-simple-v1-10-a3e156839e7f@kernel.org
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/nfs/localio.c

index 2c0455e91571b8c21408fe87027654a0f2621aa9..48bfe54b48a4a75f7159ffc0ffa1ef2893b5f620 100644 (file)
@@ -595,29 +595,26 @@ static void nfs_local_call_read(struct work_struct *work)
        struct nfs_local_kiocb *iocb =
                container_of(work, struct nfs_local_kiocb, work);
        struct file *filp = iocb->kiocb.ki_filp;
-       const struct cred *save_cred;
        ssize_t status;
 
-       save_cred = override_creds(filp->f_cred);
-
-       for (int i = 0; i < iocb->n_iters ; i++) {
-               if (iocb->iter_is_dio_aligned[i]) {
-                       iocb->kiocb.ki_flags |= IOCB_DIRECT;
-                       iocb->kiocb.ki_complete = nfs_local_read_aio_complete;
-                       iocb->aio_complete_work = nfs_local_read_aio_complete_work;
-               }
+       scoped_with_creds(filp->f_cred) {
+               for (int i = 0; i < iocb->n_iters ; i++) {
+                       if (iocb->iter_is_dio_aligned[i]) {
+                               iocb->kiocb.ki_flags |= IOCB_DIRECT;
+                               iocb->kiocb.ki_complete = nfs_local_read_aio_complete;
+                               iocb->aio_complete_work = nfs_local_read_aio_complete_work;
+                       }
 
-               iocb->kiocb.ki_pos = iocb->offset[i];
-               status = filp->f_op->read_iter(&iocb->kiocb, &iocb->iters[i]);
-               if (status != -EIOCBQUEUED) {
-                       nfs_local_pgio_done(iocb->hdr, status);
-                       if (iocb->hdr->task.tk_status)
-                               break;
+                       iocb->kiocb.ki_pos = iocb->offset[i];
+                       status = filp->f_op->read_iter(&iocb->kiocb, &iocb->iters[i]);
+                       if (status != -EIOCBQUEUED) {
+                               nfs_local_pgio_done(iocb->hdr, status);
+                               if (iocb->hdr->task.tk_status)
+                                       break;
+                       }
                }
        }
 
-       revert_creds(save_cred);
-
        if (status != -EIOCBQUEUED) {
                nfs_local_read_done(iocb, status);
                nfs_local_pgio_release(iocb);