|
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