.. | .. |
---|
31 | 31 | |
---|
32 | 32 | static int dcssblk_open(struct block_device *bdev, fmode_t mode); |
---|
33 | 33 | static void dcssblk_release(struct gendisk *disk, fmode_t mode); |
---|
34 | | -static blk_qc_t dcssblk_make_request(struct request_queue *q, |
---|
35 | | - struct bio *bio); |
---|
| 34 | +static blk_qc_t dcssblk_submit_bio(struct bio *bio); |
---|
36 | 35 | static long dcssblk_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, |
---|
37 | 36 | long nr_pages, void **kaddr, pfn_t *pfn); |
---|
38 | 37 | |
---|
.. | .. |
---|
41 | 40 | static int dcssblk_major; |
---|
42 | 41 | static const struct block_device_operations dcssblk_devops = { |
---|
43 | 42 | .owner = THIS_MODULE, |
---|
| 43 | + .submit_bio = dcssblk_submit_bio, |
---|
44 | 44 | .open = dcssblk_open, |
---|
45 | 45 | .release = dcssblk_release, |
---|
46 | 46 | }; |
---|
.. | .. |
---|
57 | 57 | return copy_to_iter(addr, bytes, i); |
---|
58 | 58 | } |
---|
59 | 59 | |
---|
| 60 | +static int dcssblk_dax_zero_page_range(struct dax_device *dax_dev, |
---|
| 61 | + pgoff_t pgoff, size_t nr_pages) |
---|
| 62 | +{ |
---|
| 63 | + long rc; |
---|
| 64 | + void *kaddr; |
---|
| 65 | + |
---|
| 66 | + rc = dax_direct_access(dax_dev, pgoff, nr_pages, &kaddr, NULL); |
---|
| 67 | + if (rc < 0) |
---|
| 68 | + return rc; |
---|
| 69 | + memset(kaddr, 0, nr_pages << PAGE_SHIFT); |
---|
| 70 | + dax_flush(dax_dev, kaddr, nr_pages << PAGE_SHIFT); |
---|
| 71 | + return 0; |
---|
| 72 | +} |
---|
| 73 | + |
---|
60 | 74 | static const struct dax_operations dcssblk_dax_ops = { |
---|
61 | 75 | .direct_access = dcssblk_dax_direct_access, |
---|
| 76 | + .dax_supported = generic_fsdax_supported, |
---|
62 | 77 | .copy_from_iter = dcssblk_dax_copy_from_iter, |
---|
63 | 78 | .copy_to_iter = dcssblk_dax_copy_to_iter, |
---|
| 79 | + .zero_page_range = dcssblk_dax_zero_page_range, |
---|
64 | 80 | }; |
---|
65 | 81 | |
---|
66 | 82 | struct dcssblk_dev_info { |
---|
.. | .. |
---|
635 | 651 | } |
---|
636 | 652 | dev_info->gd->major = dcssblk_major; |
---|
637 | 653 | dev_info->gd->fops = &dcssblk_devops; |
---|
638 | | - dev_info->dcssblk_queue = blk_alloc_queue(GFP_KERNEL); |
---|
| 654 | + dev_info->dcssblk_queue = blk_alloc_queue(NUMA_NO_NODE); |
---|
639 | 655 | dev_info->gd->queue = dev_info->dcssblk_queue; |
---|
640 | 656 | dev_info->gd->private_data = dev_info; |
---|
641 | | - blk_queue_make_request(dev_info->dcssblk_queue, dcssblk_make_request); |
---|
642 | 657 | blk_queue_logical_block_size(dev_info->dcssblk_queue, 4096); |
---|
643 | 658 | blk_queue_flag_set(QUEUE_FLAG_DAX, dev_info->dcssblk_queue); |
---|
644 | 659 | |
---|
.. | .. |
---|
678 | 693 | goto put_dev; |
---|
679 | 694 | |
---|
680 | 695 | dev_info->dax_dev = alloc_dax(dev_info, dev_info->gd->disk_name, |
---|
681 | | - &dcssblk_dax_ops); |
---|
682 | | - if (!dev_info->dax_dev) { |
---|
683 | | - rc = -ENOMEM; |
---|
| 696 | + &dcssblk_dax_ops, DAXDEV_F_SYNC); |
---|
| 697 | + if (IS_ERR(dev_info->dax_dev)) { |
---|
| 698 | + rc = PTR_ERR(dev_info->dax_dev); |
---|
| 699 | + dev_info->dax_dev = NULL; |
---|
684 | 700 | goto put_dev; |
---|
685 | 701 | } |
---|
686 | 702 | |
---|
687 | 703 | get_device(&dev_info->dev); |
---|
688 | | - device_add_disk(&dev_info->dev, dev_info->gd); |
---|
| 704 | + device_add_disk(&dev_info->dev, dev_info->gd, NULL); |
---|
689 | 705 | |
---|
690 | 706 | switch (dev_info->segment_type) { |
---|
691 | 707 | case SEG_TYPE_SR: |
---|
.. | .. |
---|
816 | 832 | goto out; |
---|
817 | 833 | } |
---|
818 | 834 | atomic_inc(&dev_info->use_count); |
---|
819 | | - bdev->bd_block_size = 4096; |
---|
820 | 835 | rc = 0; |
---|
821 | 836 | out: |
---|
822 | 837 | return rc; |
---|
.. | .. |
---|
851 | 866 | } |
---|
852 | 867 | |
---|
853 | 868 | static blk_qc_t |
---|
854 | | -dcssblk_make_request(struct request_queue *q, struct bio *bio) |
---|
| 869 | +dcssblk_submit_bio(struct bio *bio) |
---|
855 | 870 | { |
---|
856 | 871 | struct dcssblk_dev_info *dev_info; |
---|
857 | 872 | struct bio_vec bvec; |
---|
.. | .. |
---|
861 | 876 | unsigned long source_addr; |
---|
862 | 877 | unsigned long bytes_done; |
---|
863 | 878 | |
---|
864 | | - blk_queue_split(q, &bio); |
---|
| 879 | + blk_queue_split(&bio); |
---|
865 | 880 | |
---|
866 | 881 | bytes_done = 0; |
---|
867 | 882 | dev_info = bio->bi_disk->private_data; |
---|