|
7 | 7 | #include <linux/init.h> |
8 | 8 | #include <linux/mm.h> |
9 | 9 | #include <linux/blkdev.h> |
| 10 | +#include <linux/blk-integrity.h> |
10 | 11 | #include <linux/buffer_head.h> |
11 | 12 | #include <linux/mpage.h> |
12 | 13 | #include <linux/uio.h> |
@@ -54,7 +55,6 @@ static ssize_t __blkdev_direct_IO_simple(struct kiocb *iocb, |
54 | 55 | struct bio bio; |
55 | 56 | ssize_t ret; |
56 | 57 |
|
57 | | - WARN_ON_ONCE(iocb->ki_flags & IOCB_HAS_METADATA); |
58 | 58 | if (nr_pages <= DIO_INLINE_BIO_VECS) |
59 | 59 | vecs = inline_vecs; |
60 | 60 | else { |
@@ -131,7 +131,7 @@ static void blkdev_bio_end_io(struct bio *bio) |
131 | 131 | if (bio->bi_status && !dio->bio.bi_status) |
132 | 132 | dio->bio.bi_status = bio->bi_status; |
133 | 133 |
|
134 | | - if (!is_sync && (dio->iocb->ki_flags & IOCB_HAS_METADATA)) |
| 134 | + if (bio_integrity(bio)) |
135 | 135 | bio_integrity_unmap_user(bio); |
136 | 136 |
|
137 | 137 | if (atomic_dec_and_test(&dio->ref)) { |
@@ -233,7 +233,7 @@ static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, |
233 | 233 | } |
234 | 234 | bio->bi_opf |= REQ_NOWAIT; |
235 | 235 | } |
236 | | - if (!is_sync && (iocb->ki_flags & IOCB_HAS_METADATA)) { |
| 236 | + if (iocb->ki_flags & IOCB_HAS_METADATA) { |
237 | 237 | ret = bio_integrity_map_iter(bio, iocb->private); |
238 | 238 | if (unlikely(ret)) |
239 | 239 | goto fail; |
@@ -301,7 +301,7 @@ static void blkdev_bio_end_io_async(struct bio *bio) |
301 | 301 | ret = blk_status_to_errno(bio->bi_status); |
302 | 302 | } |
303 | 303 |
|
304 | | - if (iocb->ki_flags & IOCB_HAS_METADATA) |
| 304 | + if (bio_integrity(bio)) |
305 | 305 | bio_integrity_unmap_user(bio); |
306 | 306 |
|
307 | 307 | iocb->ki_complete(iocb, ret); |
@@ -422,7 +422,8 @@ static ssize_t blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter) |
422 | 422 | } |
423 | 423 |
|
424 | 424 | nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS + 1); |
425 | | - if (likely(nr_pages <= BIO_MAX_VECS)) { |
| 425 | + if (likely(nr_pages <= BIO_MAX_VECS && |
| 426 | + !(iocb->ki_flags & IOCB_HAS_METADATA))) { |
426 | 427 | if (is_sync_kiocb(iocb)) |
427 | 428 | return __blkdev_direct_IO_simple(iocb, iter, bdev, |
428 | 429 | nr_pages); |
@@ -687,6 +688,8 @@ static int blkdev_open(struct inode *inode, struct file *filp) |
687 | 688 |
|
688 | 689 | if (bdev_can_atomic_write(bdev)) |
689 | 690 | filp->f_mode |= FMODE_CAN_ATOMIC_WRITE; |
| 691 | + if (blk_get_integrity(bdev->bd_disk)) |
| 692 | + filp->f_mode |= FMODE_HAS_METADATA; |
690 | 693 |
|
691 | 694 | ret = bdev_open(bdev, mode, filp->private_data, NULL, filp); |
692 | 695 | if (ret) |
|
0 commit comments