REQ_F_SUPPORT_NOWAIT_BIT,
        REQ_F_ISREG_BIT,
        REQ_F_POLL_NO_LAZY_BIT,
+       REQ_F_CANCEL_SEQ_BIT,
 
        /* not a real bit, just to check we're not overflowing the space */
        __REQ_F_LAST_BIT,
        REQ_F_HASH_LOCKED       = IO_REQ_FLAG(REQ_F_HASH_LOCKED_BIT),
        /* don't use lazy poll wake for this request */
        REQ_F_POLL_NO_LAZY      = IO_REQ_FLAG(REQ_F_POLL_NO_LAZY_BIT),
+       /* cancel sequence is set and valid */
+       REQ_F_CANCEL_SEQ        = IO_REQ_FLAG(REQ_F_CANCEL_SEQ_BIT),
 };
 
 typedef void (*io_req_tw_func_t)(struct io_kiocb *req, struct io_tw_state *ts);
 
                return false;
        if (cd->flags & IORING_ASYNC_CANCEL_ALL) {
 check_seq:
-               if (cd->seq == req->work.cancel_seq)
+               if (io_cancel_match_sequence(req, cd->seq))
                        return false;
-               req->work.cancel_seq = cd->seq;
        }
 
        return true;
 
 int io_sync_cancel(struct io_ring_ctx *ctx, void __user *arg);
 bool io_cancel_req_match(struct io_kiocb *req, struct io_cancel_data *cd);
 
+static inline bool io_cancel_match_sequence(struct io_kiocb *req, int sequence)
+{
+       if ((req->flags & REQ_F_CANCEL_SEQ) && sequence == req->work.cancel_seq)
+               return true;
+
+       req->flags |= REQ_F_CANCEL_SEQ;
+       req->work.cancel_seq = sequence;
+       return false;
+}
+
 #endif
 
 
        req->work.list.next = NULL;
        req->work.flags = 0;
-       req->work.cancel_seq = atomic_read(&ctx->cancel_seq);
        if (req->flags & REQ_F_FORCE_ASYNC)
                req->work.flags |= IO_WQ_WORK_CONCURRENT;
 
 
                                 struct io_poll_table *ipt, __poll_t mask,
                                 unsigned issue_flags)
 {
-       struct io_ring_ctx *ctx = req->ctx;
-
        INIT_HLIST_NODE(&req->hash_node);
-       req->work.cancel_seq = atomic_read(&ctx->cancel_seq);
        io_init_poll_iocb(poll, mask);
        poll->file = req->file;
        req->apoll_events = poll->events;
                if (poll_only && req->opcode != IORING_OP_POLL_ADD)
                        continue;
                if (cd->flags & IORING_ASYNC_CANCEL_ALL) {
-                       if (cd->seq == req->work.cancel_seq)
+                       if (io_cancel_match_sequence(req, cd->seq))
                                continue;
-                       req->work.cancel_seq = cd->seq;
                }
                *out_bucket = hb;
                return req;