{
        struct ffs_io_data *io_data = container_of(work, struct ffs_io_data,
                                                   work);
-       int ret = io_data->req->status ? io_data->req->status :
-                                        io_data->req->actual;
+       int ret = io_data->status;
        bool kiocb_has_eventfd = io_data->kiocb->ki_flags & IOCB_EVENTFD;
 
        if (io_data->read && ret > 0) {
        if (io_data->ffs->ffs_eventfd && !kiocb_has_eventfd)
                eventfd_signal(io_data->ffs->ffs_eventfd, 1);
 
-       usb_ep_free_request(io_data->ep, io_data->req);
-
        if (io_data->read)
                kfree(io_data->to_free);
        ffs_free_buffer(io_data);
 
        ENTER();
 
+       io_data->status = req->status ? req->status : req->actual;
+       usb_ep_free_request(_ep, req);
+
        INIT_WORK(&io_data->work, ffs_user_copy_worker);
        queue_work(ffs->io_completion_wq, &io_data->work);
 }