OSDN Git Service

io_uring: mark ->work uninitialised after cleanup
authorPavel Begunkov <asml.silence@gmail.com>
Sat, 25 Jul 2020 11:41:58 +0000 (14:41 +0300)
committerJens Axboe <axboe@kernel.dk>
Sat, 25 Jul 2020 15:47:44 +0000 (09:47 -0600)
Remove REQ_F_WORK_INITIALIZED after io_req_clean_work(). That's a cold
path but is safer for those using io_req_clean_work() out of
*dismantle_req()/*io_free(). And for the same reason zero work.fs

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index c7e8e9a..59f1f47 100644 (file)
@@ -1141,7 +1141,9 @@ static void io_req_clean_work(struct io_kiocb *req)
                spin_unlock(&req->work.fs->lock);
                if (fs)
                        free_fs_struct(fs);
+               req->work.fs = NULL;
        }
+       req->flags &= ~REQ_F_WORK_INITIALIZED;
 }
 
 static void io_prep_async_work(struct io_kiocb *req)
@@ -4969,7 +4971,6 @@ static int io_poll_add(struct io_kiocb *req)
 
        /* ->work is in union with hash_node and others */
        io_req_clean_work(req);
-       req->flags &= ~REQ_F_WORK_INITIALIZED;
 
        INIT_HLIST_NODE(&req->hash_node);
        ipt.pt._qproc = io_poll_queue_proc;