summaryrefslogtreecommitdiff
path: root/fs/io-wq.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2020-01-14 22:06:11 -0700
committerJens Axboe <axboe@kernel.dk>2020-01-14 22:06:11 -0700
commite0bbb3461ae000baec13e8ec5b5063202df228df (patch)
tree0b3f8f9a36b0bbe0fe4b286485e5f43af6fadc8f /fs/io-wq.c
parent74566df3a71c1b92da608868cca787557d8be7b2 (diff)
downloadlwn-e0bbb3461ae000baec13e8ec5b5063202df228df.tar.gz
lwn-e0bbb3461ae000baec13e8ec5b5063202df228df.zip
io-wq: cancel work if we fail getting a mm reference
If we require mm and user context, mark the request for cancellation if we fail to acquire the desired mm. Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs/io-wq.c')
-rw-r--r--fs/io-wq.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/fs/io-wq.c b/fs/io-wq.c
index 541c8a3e0bbb..5147d2213b01 100644
--- a/fs/io-wq.c
+++ b/fs/io-wq.c
@@ -445,10 +445,14 @@ next:
task_unlock(current);
}
if ((work->flags & IO_WQ_WORK_NEEDS_USER) && !worker->mm &&
- wq->mm && mmget_not_zero(wq->mm)) {
- use_mm(wq->mm);
- set_fs(USER_DS);
- worker->mm = wq->mm;
+ wq->mm) {
+ if (mmget_not_zero(wq->mm)) {
+ use_mm(wq->mm);
+ set_fs(USER_DS);
+ worker->mm = wq->mm;
+ } else {
+ work->flags |= IO_WQ_WORK_CANCEL;
+ }
}
if (!worker->creds)
worker->creds = override_creds(wq->creds);