aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoss Zwisler <ross.zwisler@linux.intel.com>2015-08-18 15:55:41 -0400
committerDan Williams <dan.j.williams@intel.com>2015-08-20 14:07:24 -0400
commite2e05394e4a3420dab96f728df4531893494e15d (patch)
treeba7d067880cf626ca90856ad6ba703b8c99fc276
parent2765cfbb342c727c3fd47b165196cb16da158022 (diff)
pmem, dax: have direct_access use __pmem annotation
Update the annotation for the kaddr pointer returned by direct_access() so that it is a __pmem pointer. This is consistent with the PMEM driver and with how this direct_access() pointer is used in the DAX code. Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r--Documentation/filesystems/Locking3
-rw-r--r--arch/powerpc/sysdev/axonram.c7
-rw-r--r--drivers/block/brd.c4
-rw-r--r--drivers/nvdimm/pmem.c4
-rw-r--r--drivers/s390/block/dcssblk.c10
-rw-r--r--fs/block_dev.c2
-rw-r--r--fs/dax.c37
-rw-r--r--include/linux/blkdev.h8
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 */
142static long 142static long
143axon_ram_direct_access(struct block_device *device, sector_t sector, 143axon_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
373static long brd_direct_access(struct block_device *bdev, sector_t sector, 373static 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
94static long pmem_direct_access(struct block_device *bdev, sector_t sector, 94static 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);
29static void dcssblk_release(struct gendisk *disk, fmode_t mode); 29static void dcssblk_release(struct gendisk *disk, fmode_t mode);
30static void dcssblk_make_request(struct request_queue *q, struct bio *bio); 30static void dcssblk_make_request(struct request_queue *q, struct bio *bio);
31static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum, 31static 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
34static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; 34static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0";
35 35
@@ -879,18 +879,20 @@ fail:
879 879
880static long 880static long
881dcssblk_direct_access (struct block_device *bdev, sector_t secnum, 881dcssblk_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 */
443long bdev_direct_access(struct block_device *bdev, sector_t sector, 443long 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;
diff --git a/fs/dax.c b/fs/dax.c
index e07fecc93f80..7c634ac797b1 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -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}
63EXPORT_SYMBOL_GPL(dax_clear_blocks); 63EXPORT_SYMBOL_GPL(dax_clear_blocks);
64 64
65static long dax_get_addr(struct buffer_head *bh, void **addr, unsigned blkbits) 65static 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 */
73static void dax_new_buf(void *addr, unsigned size, unsigned first, loff_t pos, 74static 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
84static bool buffer_written(struct buffer_head *bh) 85static 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,
268static int copy_user_bh(struct page *to, struct buffer_head *bh, 269static 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,
1574extern int bdev_read_page(struct block_device *, sector_t, struct page *); 1574extern int bdev_read_page(struct block_device *, sector_t, struct page *);
1575extern int bdev_write_page(struct block_device *, sector_t, struct page *, 1575extern int bdev_write_page(struct block_device *, sector_t, struct page *,
1576 struct writeback_control *); 1576 struct writeback_control *);
1577extern long bdev_direct_access(struct block_device *, sector_t, void **addr, 1577extern 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
1581struct block_device; 1581struct block_device;