Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Ross Zwisler and committed by
Dan Williams
e2e05394 2765cfbb

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