Use credential guards for scoped credential override with automatic
restoration on scope exit.

Signed-off-by: Christian Brauner <[email protected]>
---
 fs/nfs/localio.c | 31 ++++++++++++++-----------------
 1 file changed, 14 insertions(+), 17 deletions(-)

diff --git a/fs/nfs/localio.c b/fs/nfs/localio.c
index 2c0455e91571..48bfe54b48a4 100644
--- a/fs/nfs/localio.c
+++ b/fs/nfs/localio.c
@@ -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);

-- 
2.47.3


Reply via email to