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:
@@ -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 @@ retry:
|
|||||||
}
|
}
|
||||||
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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user