diff options
-rw-r--r-- | Documentation/filesystems/Locking | 3 | ||||
-rw-r--r-- | arch/powerpc/sysdev/axonram.c | 7 | ||||
-rw-r--r-- | drivers/block/brd.c | 4 | ||||
-rw-r--r-- | drivers/nvdimm/pmem.c | 4 | ||||
-rw-r--r-- | drivers/s390/block/dcssblk.c | 10 | ||||
-rw-r--r-- | fs/block_dev.c | 2 | ||||
-rw-r--r-- | fs/dax.c | 37 | ||||
-rw-r--r-- | include/linux/blkdev.h | 8 |
8 files changed, 41 insertions, 34 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index 6a34a0f4d37c..06d443450f21 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking | |||
@@ -397,7 +397,8 @@ prototypes: | |||
397 | int (*release) (struct gendisk *, fmode_t); | 397 | int (*release) (struct gendisk *, fmode_t); |
398 | int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | 398 | int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); |
399 | int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | 399 | int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); |
400 | int (*direct_access) (struct block_device *, sector_t, void **, unsigned long *); | 400 | int (*direct_access) (struct block_device *, sector_t, void __pmem **, |
401 | unsigned long *); | ||
401 | int (*media_changed) (struct gendisk *); | 402 | int (*media_changed) (struct gendisk *); |
402 | void (*unlock_native_capacity) (struct gendisk *); | 403 | void (*unlock_native_capacity) (struct gendisk *); |
403 | int (*revalidate_disk) (struct gendisk *); | 404 | int (*revalidate_disk) (struct gendisk *); |
diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c index ee90db17b097..a2be2a66dab6 100644 --- a/arch/powerpc/sysdev/axonram.c +++ b/arch/powerpc/sysdev/axonram.c | |||
@@ -141,13 +141,14 @@ axon_ram_make_request(struct request_queue *queue, struct bio *bio) | |||
141 | */ | 141 | */ |
142 | static long | 142 | static long |
143 | axon_ram_direct_access(struct block_device *device, sector_t sector, | 143 | axon_ram_direct_access(struct block_device *device, sector_t sector, |
144 | void **kaddr, unsigned long *pfn, long size) | 144 | void __pmem **kaddr, unsigned long *pfn, long size) |
145 | { | 145 | { |
146 | struct axon_ram_bank *bank = device->bd_disk->private_data; | 146 | struct axon_ram_bank *bank = device->bd_disk->private_data; |
147 | loff_t offset = (loff_t)sector << AXON_RAM_SECTOR_SHIFT; | 147 | loff_t offset = (loff_t)sector << AXON_RAM_SECTOR_SHIFT; |
148 | void *addr = (void *)(bank->ph_addr + offset); | ||
148 | 149 | ||
149 | *kaddr = (void *)(bank->ph_addr + offset); | 150 | *kaddr = (void __pmem *)addr; |
150 | *pfn = virt_to_phys(*kaddr) >> PAGE_SHIFT; | 151 | *pfn = virt_to_phys(addr) >> PAGE_SHIFT; |
151 | 152 | ||
152 | return bank->size - offset; | 153 | return bank->size - offset; |
153 | } | 154 | } |
diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 64ab4951e9d6..c96402fd1560 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c | |||
@@ -371,7 +371,7 @@ static int brd_rw_page(struct block_device *bdev, sector_t sector, | |||
371 | 371 | ||
372 | #ifdef CONFIG_BLK_DEV_RAM_DAX | 372 | #ifdef CONFIG_BLK_DEV_RAM_DAX |
373 | static long brd_direct_access(struct block_device *bdev, sector_t sector, | 373 | static long brd_direct_access(struct block_device *bdev, sector_t sector, |
374 | void **kaddr, unsigned long *pfn, long size) | 374 | void __pmem **kaddr, unsigned long *pfn, long size) |
375 | { | 375 | { |
376 | struct brd_device *brd = bdev->bd_disk->private_data; | 376 | struct brd_device *brd = bdev->bd_disk->private_data; |
377 | struct page *page; | 377 | struct page *page; |
@@ -381,7 +381,7 @@ static long brd_direct_access(struct block_device *bdev, sector_t sector, | |||
381 | page = brd_insert_page(brd, sector); | 381 | page = brd_insert_page(brd, sector); |
382 | if (!page) | 382 | if (!page) |
383 | return -ENOSPC; | 383 | return -ENOSPC; |
384 | *kaddr = page_address(page); | 384 | *kaddr = (void __pmem *)page_address(page); |
385 | *pfn = page_to_pfn(page); | 385 | *pfn = page_to_pfn(page); |
386 | 386 | ||
387 | /* | 387 | /* |
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index eb7552d939e1..f3b629779266 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c | |||
@@ -92,7 +92,7 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector, | |||
92 | } | 92 | } |
93 | 93 | ||
94 | static long pmem_direct_access(struct block_device *bdev, sector_t sector, | 94 | static long pmem_direct_access(struct block_device *bdev, sector_t sector, |
95 | void **kaddr, unsigned long *pfn, long size) | 95 | void __pmem **kaddr, unsigned long *pfn, long size) |
96 | { | 96 | { |
97 | struct pmem_device *pmem = bdev->bd_disk->private_data; | 97 | struct pmem_device *pmem = bdev->bd_disk->private_data; |
98 | size_t offset = sector << 9; | 98 | size_t offset = sector << 9; |
@@ -101,7 +101,7 @@ static long pmem_direct_access(struct block_device *bdev, sector_t sector, | |||
101 | return -ENODEV; | 101 | return -ENODEV; |
102 | 102 | ||
103 | /* FIXME convert DAX to comprehend that this mapping has a lifetime */ | 103 | /* FIXME convert DAX to comprehend that this mapping has a lifetime */ |
104 | *kaddr = (void __force *) pmem->virt_addr + offset; | 104 | *kaddr = pmem->virt_addr + offset; |
105 | *pfn = (pmem->phys_addr + offset) >> PAGE_SHIFT; | 105 | *pfn = (pmem->phys_addr + offset) >> PAGE_SHIFT; |
106 | 106 | ||
107 | return pmem->size - offset; | 107 | return pmem->size - offset; |
diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c index da212813f2d5..2c5a397b9f3e 100644 --- a/drivers/s390/block/dcssblk.c +++ b/drivers/s390/block/dcssblk.c | |||
@@ -29,7 +29,7 @@ static int dcssblk_open(struct block_device *bdev, fmode_t mode); | |||
29 | static void dcssblk_release(struct gendisk *disk, fmode_t mode); | 29 | static void dcssblk_release(struct gendisk *disk, fmode_t mode); |
30 | static void dcssblk_make_request(struct request_queue *q, struct bio *bio); | 30 | static void dcssblk_make_request(struct request_queue *q, struct bio *bio); |
31 | static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum, | 31 | static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum, |
32 | void **kaddr, unsigned long *pfn, long size); | 32 | void __pmem **kaddr, unsigned long *pfn, long size); |
33 | 33 | ||
34 | static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; | 34 | static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; |
35 | 35 | ||
@@ -879,18 +879,20 @@ fail: | |||
879 | 879 | ||
880 | static long | 880 | static long |
881 | dcssblk_direct_access (struct block_device *bdev, sector_t secnum, | 881 | dcssblk_direct_access (struct block_device *bdev, sector_t secnum, |
882 | void **kaddr, unsigned long *pfn, long size) | 882 | void __pmem **kaddr, unsigned long *pfn, long size) |
883 | { | 883 | { |
884 | struct dcssblk_dev_info *dev_info; | 884 | struct dcssblk_dev_info *dev_info; |
885 | unsigned long offset, dev_sz; | 885 | unsigned long offset, dev_sz; |
886 | void *addr; | ||
886 | 887 | ||
887 | dev_info = bdev->bd_disk->private_data; | 888 | dev_info = bdev->bd_disk->private_data; |
888 | if (!dev_info) | 889 | if (!dev_info) |
889 | return -ENODEV; | 890 | return -ENODEV; |
890 | dev_sz = dev_info->end - dev_info->start; | 891 | dev_sz = dev_info->end - dev_info->start; |
891 | offset = secnum * 512; | 892 | offset = secnum * 512; |
892 | *kaddr = (void *) (dev_info->start + offset); | 893 | addr = (void *) (dev_info->start + offset); |
893 | *pfn = virt_to_phys(*kaddr) >> PAGE_SHIFT; | 894 | *pfn = virt_to_phys(addr) >> PAGE_SHIFT; |
895 | *kaddr = (void __pmem *) addr; | ||
894 | 896 | ||
895 | return dev_sz - offset; | 897 | return dev_sz - offset; |
896 | } | 898 | } |
diff --git a/fs/block_dev.c b/fs/block_dev.c index 198243717da5..2345a9870e2c 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -441,7 +441,7 @@ EXPORT_SYMBOL_GPL(bdev_write_page); | |||
441 | * accessible at this address. | 441 | * accessible at this address. |
442 | */ | 442 | */ |
443 | long bdev_direct_access(struct block_device *bdev, sector_t sector, | 443 | long bdev_direct_access(struct block_device *bdev, sector_t sector, |
444 | void **addr, unsigned long *pfn, long size) | 444 | void __pmem **addr, unsigned long *pfn, long size) |
445 | { | 445 | { |
446 | long avail; | 446 | long avail; |
447 | const struct block_device_operations *ops = bdev->bd_disk->fops; | 447 | const struct block_device_operations *ops = bdev->bd_disk->fops; |
@@ -35,7 +35,7 @@ int dax_clear_blocks(struct inode *inode, sector_t block, long size) | |||
35 | 35 | ||
36 | might_sleep(); | 36 | might_sleep(); |
37 | do { | 37 | do { |
38 | void *addr; | 38 | void __pmem *addr; |
39 | unsigned long pfn; | 39 | unsigned long pfn; |
40 | long count; | 40 | long count; |
41 | 41 | ||
@@ -47,7 +47,7 @@ int dax_clear_blocks(struct inode *inode, sector_t block, long size) | |||
47 | unsigned pgsz = PAGE_SIZE - offset_in_page(addr); | 47 | unsigned pgsz = PAGE_SIZE - offset_in_page(addr); |
48 | if (pgsz > count) | 48 | if (pgsz > count) |
49 | pgsz = count; | 49 | pgsz = count; |
50 | clear_pmem((void __pmem *)addr, pgsz); | 50 | clear_pmem(addr, pgsz); |
51 | addr += pgsz; | 51 | addr += pgsz; |
52 | size -= pgsz; | 52 | size -= pgsz; |
53 | count -= pgsz; | 53 | count -= pgsz; |
@@ -62,7 +62,8 @@ int dax_clear_blocks(struct inode *inode, sector_t block, long size) | |||
62 | } | 62 | } |
63 | EXPORT_SYMBOL_GPL(dax_clear_blocks); | 63 | EXPORT_SYMBOL_GPL(dax_clear_blocks); |
64 | 64 | ||
65 | static long dax_get_addr(struct buffer_head *bh, void **addr, unsigned blkbits) | 65 | static long dax_get_addr(struct buffer_head *bh, void __pmem **addr, |
66 | unsigned blkbits) | ||
66 | { | 67 | { |
67 | unsigned long pfn; | 68 | unsigned long pfn; |
68 | sector_t sector = bh->b_blocknr << (blkbits - 9); | 69 | sector_t sector = bh->b_blocknr << (blkbits - 9); |
@@ -70,15 +71,15 @@ static long dax_get_addr(struct buffer_head *bh, void **addr, unsigned blkbits) | |||
70 | } | 71 | } |
71 | 72 | ||
72 | /* the clear_pmem() calls are ordered by a wmb_pmem() in the caller */ | 73 | /* the clear_pmem() calls are ordered by a wmb_pmem() in the caller */ |
73 | static void dax_new_buf(void *addr, unsigned size, unsigned first, loff_t pos, | 74 | static void dax_new_buf(void __pmem *addr, unsigned size, unsigned first, |
74 | loff_t end) | 75 | loff_t pos, loff_t end) |
75 | { | 76 | { |
76 | loff_t final = end - pos + first; /* The final byte of the buffer */ | 77 | loff_t final = end - pos + first; /* The final byte of the buffer */ |
77 | 78 | ||
78 | if (first > 0) | 79 | if (first > 0) |
79 | clear_pmem((void __pmem *)addr, first); | 80 | clear_pmem(addr, first); |
80 | if (final < size) | 81 | if (final < size) |
81 | clear_pmem((void __pmem *)addr + final, size - final); | 82 | clear_pmem(addr + final, size - final); |
82 | } | 83 | } |
83 | 84 | ||
84 | static bool buffer_written(struct buffer_head *bh) | 85 | static bool buffer_written(struct buffer_head *bh) |
@@ -106,7 +107,7 @@ static ssize_t dax_io(struct inode *inode, struct iov_iter *iter, | |||
106 | loff_t pos = start; | 107 | loff_t pos = start; |
107 | loff_t max = start; | 108 | loff_t max = start; |
108 | loff_t bh_max = start; | 109 | loff_t bh_max = start; |
109 | void *addr; | 110 | void __pmem *addr; |
110 | bool hole = false; | 111 | bool hole = false; |
111 | bool need_wmb = false; | 112 | bool need_wmb = false; |
112 | 113 | ||
@@ -158,11 +159,11 @@ static ssize_t dax_io(struct inode *inode, struct iov_iter *iter, | |||
158 | } | 159 | } |
159 | 160 | ||
160 | if (iov_iter_rw(iter) == WRITE) { | 161 | if (iov_iter_rw(iter) == WRITE) { |
161 | len = copy_from_iter_pmem((void __pmem *)addr, | 162 | len = copy_from_iter_pmem(addr, max - pos, iter); |
162 | max - pos, iter); | ||
163 | need_wmb = true; | 163 | need_wmb = true; |
164 | } else if (!hole) | 164 | } else if (!hole) |
165 | len = copy_to_iter(addr, max - pos, iter); | 165 | len = copy_to_iter((void __force *)addr, max - pos, |
166 | iter); | ||
166 | else | 167 | else |
167 | len = iov_iter_zero(max - pos, iter); | 168 | len = iov_iter_zero(max - pos, iter); |
168 | 169 | ||
@@ -268,11 +269,13 @@ static int dax_load_hole(struct address_space *mapping, struct page *page, | |||
268 | static int copy_user_bh(struct page *to, struct buffer_head *bh, | 269 | static int copy_user_bh(struct page *to, struct buffer_head *bh, |
269 | unsigned blkbits, unsigned long vaddr) | 270 | unsigned blkbits, unsigned long vaddr) |
270 | { | 271 | { |
271 | void *vfrom, *vto; | 272 | void __pmem *vfrom; |
273 | void *vto; | ||
274 | |||
272 | if (dax_get_addr(bh, &vfrom, blkbits) < 0) | 275 | if (dax_get_addr(bh, &vfrom, blkbits) < 0) |
273 | return -EIO; | 276 | return -EIO; |
274 | vto = kmap_atomic(to); | 277 | vto = kmap_atomic(to); |
275 | copy_user_page(vto, vfrom, vaddr, to); | 278 | copy_user_page(vto, (void __force *)vfrom, vaddr, to); |
276 | kunmap_atomic(vto); | 279 | kunmap_atomic(vto); |
277 | return 0; | 280 | return 0; |
278 | } | 281 | } |
@@ -283,7 +286,7 @@ static int dax_insert_mapping(struct inode *inode, struct buffer_head *bh, | |||
283 | struct address_space *mapping = inode->i_mapping; | 286 | struct address_space *mapping = inode->i_mapping; |
284 | sector_t sector = bh->b_blocknr << (inode->i_blkbits - 9); | 287 | sector_t sector = bh->b_blocknr << (inode->i_blkbits - 9); |
285 | unsigned long vaddr = (unsigned long)vmf->virtual_address; | 288 | unsigned long vaddr = (unsigned long)vmf->virtual_address; |
286 | void *addr; | 289 | void __pmem *addr; |
287 | unsigned long pfn; | 290 | unsigned long pfn; |
288 | pgoff_t size; | 291 | pgoff_t size; |
289 | int error; | 292 | int error; |
@@ -312,7 +315,7 @@ static int dax_insert_mapping(struct inode *inode, struct buffer_head *bh, | |||
312 | } | 315 | } |
313 | 316 | ||
314 | if (buffer_unwritten(bh) || buffer_new(bh)) { | 317 | if (buffer_unwritten(bh) || buffer_new(bh)) { |
315 | clear_pmem((void __pmem *)addr, PAGE_SIZE); | 318 | clear_pmem(addr, PAGE_SIZE); |
316 | wmb_pmem(); | 319 | wmb_pmem(); |
317 | } | 320 | } |
318 | 321 | ||
@@ -548,11 +551,11 @@ int dax_zero_page_range(struct inode *inode, loff_t from, unsigned length, | |||
548 | if (err < 0) | 551 | if (err < 0) |
549 | return err; | 552 | return err; |
550 | if (buffer_written(&bh)) { | 553 | if (buffer_written(&bh)) { |
551 | void *addr; | 554 | void __pmem *addr; |
552 | err = dax_get_addr(&bh, &addr, inode->i_blkbits); | 555 | err = dax_get_addr(&bh, &addr, inode->i_blkbits); |
553 | if (err < 0) | 556 | if (err < 0) |
554 | return err; | 557 | return err; |
555 | clear_pmem((void __pmem *)addr + offset, length); | 558 | clear_pmem(addr + offset, length); |
556 | wmb_pmem(); | 559 | wmb_pmem(); |
557 | } | 560 | } |
558 | 561 | ||
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index d4068c17d0df..c401ecdff9cb 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
@@ -1555,8 +1555,8 @@ struct block_device_operations { | |||
1555 | int (*rw_page)(struct block_device *, sector_t, struct page *, int rw); | 1555 | int (*rw_page)(struct block_device *, sector_t, struct page *, int rw); |
1556 | int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | 1556 | int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); |
1557 | int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | 1557 | int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); |
1558 | long (*direct_access)(struct block_device *, sector_t, | 1558 | long (*direct_access)(struct block_device *, sector_t, void __pmem **, |
1559 | void **, unsigned long *pfn, long size); | 1559 | unsigned long *pfn, long size); |
1560 | unsigned int (*check_events) (struct gendisk *disk, | 1560 | unsigned int (*check_events) (struct gendisk *disk, |
1561 | unsigned int clearing); | 1561 | unsigned int clearing); |
1562 | /* ->media_changed() is DEPRECATED, use ->check_events() instead */ | 1562 | /* ->media_changed() is DEPRECATED, use ->check_events() instead */ |
@@ -1574,8 +1574,8 @@ extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int, | |||
1574 | extern int bdev_read_page(struct block_device *, sector_t, struct page *); | 1574 | extern int bdev_read_page(struct block_device *, sector_t, struct page *); |
1575 | extern int bdev_write_page(struct block_device *, sector_t, struct page *, | 1575 | extern int bdev_write_page(struct block_device *, sector_t, struct page *, |
1576 | struct writeback_control *); | 1576 | struct writeback_control *); |
1577 | extern long bdev_direct_access(struct block_device *, sector_t, void **addr, | 1577 | extern long bdev_direct_access(struct block_device *, sector_t, |
1578 | unsigned long *pfn, long size); | 1578 | void __pmem **addr, unsigned long *pfn, long size); |
1579 | #else /* CONFIG_BLOCK */ | 1579 | #else /* CONFIG_BLOCK */ |
1580 | 1580 | ||
1581 | struct block_device; | 1581 | struct block_device; |