mirror of https://github.com/torvalds/linux.git
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:
parent
94afb627df
commit
bff3c841f7
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue