block: make __blkdev_direct_IO_sync() support O_SYNC/DSYNC
Split the op setting code into a helper, use it in both places. Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
parent
72ecad22d9
commit
78250c02d9
|
@ -176,6 +176,16 @@ static struct inode *bdev_file_inode(struct file *file)
|
||||||
return file->f_mapping->host;
|
return file->f_mapping->host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned int dio_bio_write_op(struct kiocb *iocb)
|
||||||
|
{
|
||||||
|
unsigned int op = REQ_OP_WRITE | REQ_SYNC | REQ_IDLE;
|
||||||
|
|
||||||
|
/* avoid the need for a I/O completion work item */
|
||||||
|
if (iocb->ki_flags & IOCB_DSYNC)
|
||||||
|
op |= REQ_FUA;
|
||||||
|
return op;
|
||||||
|
}
|
||||||
|
|
||||||
#define DIO_INLINE_BIO_VECS 4
|
#define DIO_INLINE_BIO_VECS 4
|
||||||
|
|
||||||
static void blkdev_bio_end_io_simple(struct bio *bio)
|
static void blkdev_bio_end_io_simple(struct bio *bio)
|
||||||
|
@ -226,11 +236,11 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter,
|
||||||
ret = bio.bi_iter.bi_size;
|
ret = bio.bi_iter.bi_size;
|
||||||
|
|
||||||
if (iov_iter_rw(iter) == READ) {
|
if (iov_iter_rw(iter) == READ) {
|
||||||
bio_set_op_attrs(&bio, REQ_OP_READ, 0);
|
bio.bi_opf = REQ_OP_READ;
|
||||||
if (iter_is_iovec(iter))
|
if (iter_is_iovec(iter))
|
||||||
should_dirty = true;
|
should_dirty = true;
|
||||||
} else {
|
} else {
|
||||||
bio_set_op_attrs(&bio, REQ_OP_WRITE, REQ_SYNC | REQ_IDLE);
|
bio.bi_opf = dio_bio_write_op(iocb);
|
||||||
task_io_account_write(ret);
|
task_io_account_write(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue