nfs: use credential guards in nfs_local_call_write()

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

Link: https://patch.msgid.link/20251103-work-creds-guards-simple-v1-11-a3e156839e7f@kernel.org
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
Christian Brauner 2025-11-03 12:26:59 +01:00
parent 94afb627df
commit bff3c841f7
No known key found for this signature in database
GPG Key ID: 91C61BC06578DCA2
1 changed files with 18 additions and 10 deletions

View File

@ -781,18 +781,11 @@ static void nfs_local_write_aio_complete(struct kiocb *kiocb, long ret)
nfs_local_pgio_aio_complete(iocb); /* Calls nfs_local_write_aio_complete_work */ nfs_local_pgio_aio_complete(iocb); /* Calls nfs_local_write_aio_complete_work */
} }
static void nfs_local_call_write(struct work_struct *work) static ssize_t do_nfs_local_call_write(struct nfs_local_kiocb *iocb,
struct file *filp)
{ {
struct nfs_local_kiocb *iocb =
container_of(work, struct nfs_local_kiocb, work);
struct file *filp = iocb->kiocb.ki_filp;
unsigned long old_flags = current->flags;
const struct cred *save_cred;
ssize_t status; ssize_t status;
current->flags |= PF_LOCAL_THROTTLE | PF_MEMALLOC_NOIO;
save_cred = override_creds(filp->f_cred);
file_start_write(filp); file_start_write(filp);
for (int i = 0; i < iocb->n_iters ; i++) { for (int i = 0; i < iocb->n_iters ; i++) {
if (iocb->iter_is_dio_aligned[i]) { if (iocb->iter_is_dio_aligned[i]) {
@ -837,7 +830,22 @@ static void nfs_local_call_write(struct work_struct *work)
} }
file_end_write(filp); file_end_write(filp);
revert_creds(save_cred); return status;
}
static void nfs_local_call_write(struct work_struct *work)
{
struct nfs_local_kiocb *iocb =
container_of(work, struct nfs_local_kiocb, work);
struct file *filp = iocb->kiocb.ki_filp;
unsigned long old_flags = current->flags;
ssize_t status;
current->flags |= PF_LOCAL_THROTTLE | PF_MEMALLOC_NOIO;
scoped_with_creds(filp->f_cred)
status = do_nfs_local_call_write(iocb, filp);
current->flags = old_flags; current->flags = old_flags;
if (status != -EIOCBQUEUED) { if (status != -EIOCBQUEUED) {