hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/s390/block/dcssblk.c
....@@ -31,8 +31,7 @@
3131
3232 static int dcssblk_open(struct block_device *bdev, fmode_t mode);
3333 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);
3635 static long dcssblk_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff,
3736 long nr_pages, void **kaddr, pfn_t *pfn);
3837
....@@ -41,6 +40,7 @@
4140 static int dcssblk_major;
4241 static const struct block_device_operations dcssblk_devops = {
4342 .owner = THIS_MODULE,
43
+ .submit_bio = dcssblk_submit_bio,
4444 .open = dcssblk_open,
4545 .release = dcssblk_release,
4646 };
....@@ -57,10 +57,26 @@
5757 return copy_to_iter(addr, bytes, i);
5858 }
5959
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
+
6074 static const struct dax_operations dcssblk_dax_ops = {
6175 .direct_access = dcssblk_dax_direct_access,
76
+ .dax_supported = generic_fsdax_supported,
6277 .copy_from_iter = dcssblk_dax_copy_from_iter,
6378 .copy_to_iter = dcssblk_dax_copy_to_iter,
79
+ .zero_page_range = dcssblk_dax_zero_page_range,
6480 };
6581
6682 struct dcssblk_dev_info {
....@@ -635,10 +651,9 @@
635651 }
636652 dev_info->gd->major = dcssblk_major;
637653 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);
639655 dev_info->gd->queue = dev_info->dcssblk_queue;
640656 dev_info->gd->private_data = dev_info;
641
- blk_queue_make_request(dev_info->dcssblk_queue, dcssblk_make_request);
642657 blk_queue_logical_block_size(dev_info->dcssblk_queue, 4096);
643658 blk_queue_flag_set(QUEUE_FLAG_DAX, dev_info->dcssblk_queue);
644659
....@@ -678,14 +693,15 @@
678693 goto put_dev;
679694
680695 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;
684700 goto put_dev;
685701 }
686702
687703 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);
689705
690706 switch (dev_info->segment_type) {
691707 case SEG_TYPE_SR:
....@@ -816,7 +832,6 @@
816832 goto out;
817833 }
818834 atomic_inc(&dev_info->use_count);
819
- bdev->bd_block_size = 4096;
820835 rc = 0;
821836 out:
822837 return rc;
....@@ -851,7 +866,7 @@
851866 }
852867
853868 static blk_qc_t
854
-dcssblk_make_request(struct request_queue *q, struct bio *bio)
869
+dcssblk_submit_bio(struct bio *bio)
855870 {
856871 struct dcssblk_dev_info *dev_info;
857872 struct bio_vec bvec;
....@@ -861,7 +876,7 @@
861876 unsigned long source_addr;
862877 unsigned long bytes_done;
863878
864
- blk_queue_split(q, &bio);
879
+ blk_queue_split(&bio);
865880
866881 bytes_done = 0;
867882 dev_info = bio->bi_disk->private_data;