]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - fs/iomap.c
Merge tag 'v4.20-rc6' into for-4.21/block
[mirror_ubuntu-jammy-kernel.git] / fs / iomap.c
index d6bc98ae8d3503870c1c23f8fe1277cdb4476d85..9a5bf1e8925b944afef5be2d5b631dbc2c0c163d 100644 (file)
@@ -1530,7 +1530,7 @@ static void iomap_dio_bio_end_io(struct bio *bio)
                if (dio->wait_for_completion) {
                        struct task_struct *waiter = dio->submit.waiter;
                        WRITE_ONCE(dio->submit.waiter, NULL);
-                       wake_up_process(waiter);
+                       blk_wake_io_task(waiter);
                } else if (dio->flags & IOMAP_DIO_WRITE) {
                        struct inode *inode = file_inode(dio->iocb->ki_filp);
 
@@ -1558,6 +1558,7 @@ iomap_dio_zero(struct iomap_dio *dio, struct iomap *iomap, loff_t pos,
                unsigned len)
 {
        struct page *page = ZERO_PAGE(0);
+       int flags = REQ_SYNC | REQ_IDLE;
        struct bio *bio;
 
        bio = bio_alloc(GFP_KERNEL, 1);
@@ -1566,9 +1567,12 @@ iomap_dio_zero(struct iomap_dio *dio, struct iomap *iomap, loff_t pos,
        bio->bi_private = dio;
        bio->bi_end_io = iomap_dio_bio_end_io;
 
+       if (dio->iocb->ki_flags & IOCB_HIPRI)
+               flags |= REQ_HIPRI;
+
        get_page(page);
        __bio_add_page(bio, page, len, 0);
-       bio_set_op_attrs(bio, REQ_OP_WRITE, REQ_SYNC | REQ_IDLE);
+       bio_set_op_attrs(bio, REQ_OP_WRITE, flags);
 
        atomic_inc(&dio->ref);
        return submit_bio(bio);
@@ -1674,6 +1678,9 @@ iomap_dio_bio_actor(struct inode *inode, loff_t pos, loff_t length,
                                bio_set_pages_dirty(bio);
                }
 
+               if (dio->iocb->ki_flags & IOCB_HIPRI)
+                       bio->bi_opf |= REQ_HIPRI;
+
                iov_iter_advance(dio->submit.iter, n);
 
                dio->size += n;
@@ -1901,14 +1908,15 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
                        return -EIOCBQUEUED;
 
                for (;;) {
-                       set_current_state(TASK_UNINTERRUPTIBLE);
+                       __set_current_state(TASK_UNINTERRUPTIBLE);
+
                        if (!READ_ONCE(dio->submit.waiter))
                                break;
 
                        if (!(iocb->ki_flags & IOCB_HIPRI) ||
                            !dio->submit.last_queue ||
                            !blk_poll(dio->submit.last_queue,
-                                        dio->submit.cookie))
+                                        dio->submit.cookie, true))
                                io_schedule();
                }
                __set_current_state(TASK_RUNNING);