{
        struct io_ring_ctx_rings o = { }, n = { }, *to_free = NULL;
        size_t size, sq_array_offset;
+       unsigned i, tail, old_head;
        struct io_uring_params p;
-       unsigned i, tail;
        void *ptr;
        int ret;
 
         */
        n.sq_sqes = ptr;
        tail = READ_ONCE(o.rings->sq.tail);
-       if (tail - READ_ONCE(o.rings->sq.head) > p.sq_entries)
+       old_head = READ_ONCE(o.rings->sq.head);
+       if (tail - old_head > p.sq_entries)
                goto overflow;
-       for (i = READ_ONCE(o.rings->sq.head); i < tail; i++) {
+       for (i = old_head; i < tail; i++) {
                unsigned src_head = i & (ctx->sq_entries - 1);
                unsigned dst_head = i & (p.sq_entries - 1);
 
        WRITE_ONCE(n.rings->sq.tail, READ_ONCE(o.rings->sq.tail));
 
        tail = READ_ONCE(o.rings->cq.tail);
-       if (tail - READ_ONCE(o.rings->cq.head) > p.cq_entries) {
+       old_head = READ_ONCE(o.rings->cq.head);
+       if (tail - old_head > p.cq_entries) {
 overflow:
                /* restore old rings, and return -EOVERFLOW via cleanup path */
                ctx->rings = o.rings;
                ret = -EOVERFLOW;
                goto out;
        }
-       for (i = READ_ONCE(o.rings->cq.head); i < tail; i++) {
+       for (i = old_head; i < tail; i++) {
                unsigned src_head = i & (ctx->cq_entries - 1);
                unsigned dst_head = i & (p.cq_entries - 1);