Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+18 -10
+18 -10
fs/nfs/localio.c
··· 781 781 nfs_local_pgio_aio_complete(iocb); /* Calls nfs_local_write_aio_complete_work */ 782 782 } 783 783 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) 785 786 { 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; 791 787 ssize_t status; 792 - 793 - current->flags |= PF_LOCAL_THROTTLE | PF_MEMALLOC_NOIO; 794 - save_cred = override_creds(filp->f_cred); 795 788 796 789 file_start_write(filp); 797 790 for (int i = 0; i < iocb->n_iters ; i++) { ··· 830 837 } 831 838 file_end_write(filp); 832 839 833 - revert_creds(save_cred); 840 + return status; 841 + } 842 + 843 + static void nfs_local_call_write(struct work_struct *work) 844 + { 845 + struct nfs_local_kiocb *iocb = 846 + container_of(work, struct nfs_local_kiocb, work); 847 + struct file *filp = iocb->kiocb.ki_filp; 848 + unsigned long old_flags = current->flags; 849 + ssize_t status; 850 + 851 + current->flags |= PF_LOCAL_THROTTLE | PF_MEMALLOC_NOIO; 852 + 853 + scoped_with_creds(filp->f_cred) 854 + status = do_nfs_local_call_write(iocb, filp); 855 + 834 856 current->flags = old_flags; 835 857 836 858 if (status != -EIOCBQUEUED) {