Merge tag 'v5.3-rc1' into patchwork
[linux-2.6-microblaze.git] / fs / block_dev.c
index 749f598..4707dff 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/writeback.h>
 #include <linux/mpage.h>
 #include <linux/mount.h>
+#include <linux/pseudo_fs.h>
 #include <linux/uio.h>
 #include <linux/namei.h>
 #include <linux/log2.h>
@@ -203,13 +204,12 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter,
 {
        struct file *file = iocb->ki_filp;
        struct block_device *bdev = I_BDEV(bdev_file_inode(file));
-       struct bio_vec inline_vecs[DIO_INLINE_BIO_VECS], *vecs, *bvec;
+       struct bio_vec inline_vecs[DIO_INLINE_BIO_VECS], *vecs;
        loff_t pos = iocb->ki_pos;
        bool should_dirty = false;
        struct bio bio;
        ssize_t ret;
        blk_qc_t qc;
-       struct bvec_iter_all iter_all;
 
        if ((pos | iov_iter_alignment(iter)) &
            (bdev_logical_block_size(bdev) - 1))
@@ -259,13 +259,7 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter,
        }
        __set_current_state(TASK_RUNNING);
 
-       bio_for_each_segment_all(bvec, &bio, iter_all) {
-               if (should_dirty && !PageCompound(bvec->bv_page))
-                       set_page_dirty_lock(bvec->bv_page);
-               if (!bio_flagged(&bio, BIO_NO_PAGE_REF))
-                       put_page(bvec->bv_page);
-       }
-
+       bio_release_pages(&bio, should_dirty);
        if (unlikely(bio.bi_status))
                ret = blk_status_to_errno(bio.bi_status);
 
@@ -335,13 +329,7 @@ static void blkdev_bio_end_io(struct bio *bio)
        if (should_dirty) {
                bio_check_pages_dirty(bio);
        } else {
-               if (!bio_flagged(bio, BIO_NO_PAGE_REF)) {
-                       struct bvec_iter_all iter_all;
-                       struct bio_vec *bvec;
-
-                       bio_for_each_segment_all(bvec, bio, iter_all)
-                               put_page(bvec->bv_page);
-               }
+               bio_release_pages(bio, false);
                bio_put(bio);
        }
 }
@@ -834,19 +822,19 @@ static const struct super_operations bdev_sops = {
        .evict_inode = bdev_evict_inode,
 };
 
-static struct dentry *bd_mount(struct file_system_type *fs_type,
-       int flags, const char *dev_name, void *data)
+static int bd_init_fs_context(struct fs_context *fc)
 {
-       struct dentry *dent;
-       dent = mount_pseudo(fs_type, "bdev:", &bdev_sops, NULL, BDEVFS_MAGIC);
-       if (!IS_ERR(dent))
-               dent->d_sb->s_iflags |= SB_I_CGROUPWB;
-       return dent;
+       struct pseudo_fs_context *ctx = init_pseudo(fc, BDEVFS_MAGIC);
+       if (!ctx)
+               return -ENOMEM;
+       fc->s_iflags |= SB_I_CGROUPWB;
+       ctx->ops = &bdev_sops;
+       return 0;
 }
 
 static struct file_system_type bd_type = {
        .name           = "bdev",
-       .mount          = bd_mount,
+       .init_fs_context = bd_init_fs_context,
        .kill_sb        = kill_anon_super,
 };