Skip to content

Commit bff3c84

Browse files
committed
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>
1 parent 94afb62 commit bff3c84

1 file changed

Lines changed: 18 additions & 10 deletions

File tree

fs/nfs/localio.c

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -781,18 +781,11 @@ static void nfs_local_write_aio_complete(struct kiocb *kiocb, long ret)
781781
nfs_local_pgio_aio_complete(iocb); /* Calls nfs_local_write_aio_complete_work */
782782
}
783783

784-
static void nfs_local_call_write(struct work_struct *work)
784+
static ssize_t do_nfs_local_call_write(struct nfs_local_kiocb *iocb,
785+
struct file *filp)
785786
{
786-
struct nfs_local_kiocb *iocb =
787-
container_of(work, struct nfs_local_kiocb, work);
788-
struct file *filp = iocb->kiocb.ki_filp;
789-
unsigned long old_flags = current->flags;
790-
const struct cred *save_cred;
791787
ssize_t status;
792788

793-
current->flags |= PF_LOCAL_THROTTLE | PF_MEMALLOC_NOIO;
794-
save_cred = override_creds(filp->f_cred);
795-
796789
file_start_write(filp);
797790
for (int i = 0; i < iocb->n_iters ; i++) {
798791
if (iocb->iter_is_dio_aligned[i]) {
@@ -837,7 +830,22 @@ static void nfs_local_call_write(struct work_struct *work)
837830
}
838831
file_end_write(filp);
839832

840-
revert_creds(save_cred);
833+
return status;
834+
}
835+
836+
static void nfs_local_call_write(struct work_struct *work)
837+
{
838+
struct nfs_local_kiocb *iocb =
839+
container_of(work, struct nfs_local_kiocb, work);
840+
struct file *filp = iocb->kiocb.ki_filp;
841+
unsigned long old_flags = current->flags;
842+
ssize_t status;
843+
844+
current->flags |= PF_LOCAL_THROTTLE | PF_MEMALLOC_NOIO;
845+
846+
scoped_with_creds(filp->f_cred)
847+
status = do_nfs_local_call_write(iocb, filp);
848+
841849
current->flags = old_flags;
842850

843851
if (status != -EIOCBQUEUED) {

0 commit comments

Comments
 (0)