static void io_free_req_many(struct io_ring_ctx *ctx, struct req_batch *rb)
 {
+       int fixed_refs = rb->to_free;
+
        if (!rb->to_free)
                return;
        if (rb->need_iter) {
                int i, inflight = 0;
                unsigned long flags;
 
+               fixed_refs = 0;
                for (i = 0; i < rb->to_free; i++) {
                        struct io_kiocb *req = rb->reqs[i];
 
-                       if (req->flags & REQ_F_FIXED_FILE)
+                       if (req->flags & REQ_F_FIXED_FILE) {
                                req->file = NULL;
+                               fixed_refs++;
+                       }
                        if (req->flags & REQ_F_INFLIGHT)
                                inflight++;
-                       else
-                               rb->reqs[i] = NULL;
                        __io_req_aux_free(req);
                }
                if (!inflight)
                for (i = 0; i < rb->to_free; i++) {
                        struct io_kiocb *req = rb->reqs[i];
 
-                       if (req) {
+                       if (req->flags & REQ_F_INFLIGHT) {
                                list_del(&req->inflight_entry);
                                if (!--inflight)
                                        break;
        }
 do_free:
        kmem_cache_free_bulk(req_cachep, rb->to_free, rb->reqs);
+       if (fixed_refs)
+               percpu_ref_put_many(&ctx->file_data->refs, fixed_refs);
        percpu_ref_put_many(&ctx->refs, rb->to_free);
-       percpu_ref_put_many(&ctx->file_data->refs, rb->to_free);
        rb->to_free = rb->need_iter = 0;
 }