Signed-off-by: Jens Axboe <axboe@fb.com>
*/
ssize_t wait_on_sync_kiocb(struct kiocb *req)
{
+ struct backing_dev_info *bdi = NULL;
+
+ if (req->ki_filp)
+ bdi = inode_to_bdi(req->ki_filp->f_inode);
+
while (!req->ki_ctx) {
set_current_state(TASK_UNINTERRUPTIBLE);
if (req->ki_ctx)
break;
- io_schedule();
+
+ bdi_io_wait(bdi, req->ki_queue_cookie);
}
__set_current_state(TASK_RUNNING);
return req->ki_user_data;
} else
dio->bio_cookie = submit_bio(dio->rw, bio);
+ if (dio->iocb)
+ dio->iocb->ki_queue_cookie = dio->bio_cookie;
+
sdio->bio = NULL;
sdio->boundary = 0;
sdio->logical_offset_in_bio = 0;
#include <linux/rcupdate.h>
#include <linux/atomic.h>
+#include <linux/blk_types.h>
struct kioctx;
struct kiocb;
* this is the underlying eventfd context to deliver events to.
*/
struct eventfd_ctx *ki_eventfd;
+
+ queue_cookie_t ki_queue_cookie;
};
static inline bool is_sync_kiocb(struct kiocb *kiocb)