struct sockaddr_storage         addr;
 };
 
-struct io_async_rw {
+struct io_rw_state {
        struct iovec                    fast_iov[UIO_FASTIOV];
-       const struct iovec              *free_iovec;
        struct iov_iter                 iter;
        struct iov_iter_state           iter_state;
+};
+
+struct io_async_rw {
+       struct io_rw_state              s;
+       const struct iovec              *free_iovec;
        size_t                          bytes_done;
        struct wait_page_queue          wpq;
 };
 
        if (!req_has_async_data(req))
                return !io_req_prep_async(req);
-       iov_iter_restore(&rw->iter, &rw->iter_state);
+       iov_iter_restore(&rw->s.iter, &rw->s.iter_state);
        return true;
 }
 
 {
        struct io_async_rw *rw = req->async_data;
 
-       memcpy(&rw->iter, iter, sizeof(*iter));
+       memcpy(&rw->s.iter, iter, sizeof(*iter));
        rw->free_iovec = iovec;
        rw->bytes_done = 0;
        /* can only be fixed buffers, no need to do anything */
        if (!iovec) {
                unsigned iov_off = 0;
 
-               rw->iter.iov = rw->fast_iov;
+               rw->s.iter.iov = rw->s.fast_iov;
                if (iter->iov != fast_iov) {
                        iov_off = iter->iov - fast_iov;
-                       rw->iter.iov += iov_off;
+                       rw->s.iter.iov += iov_off;
                }
-               if (rw->fast_iov != fast_iov)
-                       memcpy(rw->fast_iov + iov_off, fast_iov + iov_off,
+               if (rw->s.fast_iov != fast_iov)
+                       memcpy(rw->s.fast_iov + iov_off, fast_iov + iov_off,
                               sizeof(struct iovec) * iter->nr_segs);
        } else {
                req->flags |= REQ_F_NEED_CLEANUP;
                io_req_map_rw(req, iovec, fast_iov, iter);
                iorw = req->async_data;
                /* we've copied and mapped the iter, ensure state is saved */
-               iov_iter_save_state(&iorw->iter, &iorw->iter_state);
+               iov_iter_save_state(&iorw->s.iter, &iorw->s.iter_state);
        }
        return 0;
 }
 static inline int io_rw_prep_async(struct io_kiocb *req, int rw)
 {
        struct io_async_rw *iorw = req->async_data;
-       struct iovec *iov = iorw->fast_iov;
+       struct iovec *iov = iorw->s.fast_iov;
        int ret;
 
-       ret = io_import_iovec(rw, req, &iov, &iorw->iter, false);
+       ret = io_import_iovec(rw, req, &iov, &iorw->s.iter, false);
        if (unlikely(ret < 0))
                return ret;
 
        iorw->free_iovec = iov;
        if (iov)
                req->flags |= REQ_F_NEED_CLEANUP;
-       iov_iter_save_state(&iorw->iter, &iorw->iter_state);
+       iov_iter_save_state(&iorw->s.iter, &iorw->s.iter_state);
        return 0;
 }
 
 
        if (req_has_async_data(req)) {
                rw = req->async_data;
-               iter = &rw->iter;
-               state = &rw->iter_state;
+               iter = &rw->s.iter;
+               state = &rw->s.iter_state;
                /*
                 * We come here from an earlier attempt, restore our state to
                 * match in case it doesn't. It's cheap enough that we don't
         * Now use our persistent iterator and state, if we aren't already.
         * We've restored and mapped the iter to match.
         */
-       if (iter != &rw->iter) {
-               iter = &rw->iter;
-               state = &rw->iter_state;
+       if (iter != &rw->s.iter) {
+               iter = &rw->s.iter;
+               state = &rw->s.iter_state;
        }
 
        do {
 
        if (req_has_async_data(req)) {
                rw = req->async_data;
-               iter = &rw->iter;
-               state = &rw->iter_state;
+               iter = &rw->s.iter;
+               state = &rw->s.iter_state;
                iov_iter_restore(iter, state);
                iovec = NULL;
        } else {