Skip to content

Commit e2e0539

Browse files
Ross Zwislerdjbw
authored andcommitted
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 <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Dan Williams <[email protected]>
1 parent 2765cfb commit e2e0539

File tree

8 files changed

+41
-34
lines changed

8 files changed

+41
-34
lines changed

Documentation/filesystems/Locking

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,8 @@ prototypes:
397397
int (*release) (struct gendisk *, fmode_t);
398398
int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
399399
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 *);
401402
int (*media_changed) (struct gendisk *);
402403
void (*unlock_native_capacity) (struct gendisk *);
403404
int (*revalidate_disk) (struct gendisk *);

arch/powerpc/sysdev/axonram.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,14 @@ axon_ram_make_request(struct request_queue *queue, struct bio *bio)
141141
*/
142142
static long
143143
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)
145145
{
146146
struct axon_ram_bank *bank = device->bd_disk->private_data;
147147
loff_t offset = (loff_t)sector << AXON_RAM_SECTOR_SHIFT;
148+
void *addr = (void *)(bank->ph_addr + offset);
148149

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;
151152

152153
return bank->size - offset;
153154
}

drivers/block/brd.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ static int brd_rw_page(struct block_device *bdev, sector_t sector,
371371

372372
#ifdef CONFIG_BLK_DEV_RAM_DAX
373373
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)
375375
{
376376
struct brd_device *brd = bdev->bd_disk->private_data;
377377
struct page *page;
@@ -381,7 +381,7 @@ static long brd_direct_access(struct block_device *bdev, sector_t sector,
381381
page = brd_insert_page(brd, sector);
382382
if (!page)
383383
return -ENOSPC;
384-
*kaddr = page_address(page);
384+
*kaddr = (void __pmem *)page_address(page);
385385
*pfn = page_to_pfn(page);
386386

387387
/*

drivers/nvdimm/pmem.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector,
9292
}
9393

9494
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)
9696
{
9797
struct pmem_device *pmem = bdev->bd_disk->private_data;
9898
size_t offset = sector << 9;
@@ -101,7 +101,7 @@ static long pmem_direct_access(struct block_device *bdev, sector_t sector,
101101
return -ENODEV;
102102

103103
/* 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;
105105
*pfn = (pmem->phys_addr + offset) >> PAGE_SHIFT;
106106

107107
return pmem->size - offset;

drivers/s390/block/dcssblk.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ static int dcssblk_open(struct block_device *bdev, fmode_t mode);
2929
static void dcssblk_release(struct gendisk *disk, fmode_t mode);
3030
static void dcssblk_make_request(struct request_queue *q, struct bio *bio);
3131
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);
3333

3434
static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0";
3535

@@ -879,18 +879,20 @@ dcssblk_make_request(struct request_queue *q, struct bio *bio)
879879

880880
static long
881881
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)
883883
{
884884
struct dcssblk_dev_info *dev_info;
885885
unsigned long offset, dev_sz;
886+
void *addr;
886887

887888
dev_info = bdev->bd_disk->private_data;
888889
if (!dev_info)
889890
return -ENODEV;
890891
dev_sz = dev_info->end - dev_info->start;
891892
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;
894896

895897
return dev_sz - offset;
896898
}

fs/block_dev.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ EXPORT_SYMBOL_GPL(bdev_write_page);
441441
* accessible at this address.
442442
*/
443443
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)
445445
{
446446
long avail;
447447
const struct block_device_operations *ops = bdev->bd_disk->fops;

fs/dax.c

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ int dax_clear_blocks(struct inode *inode, sector_t block, long size)
3535

3636
might_sleep();
3737
do {
38-
void *addr;
38+
void __pmem *addr;
3939
unsigned long pfn;
4040
long count;
4141

@@ -47,7 +47,7 @@ int dax_clear_blocks(struct inode *inode, sector_t block, long size)
4747
unsigned pgsz = PAGE_SIZE - offset_in_page(addr);
4848
if (pgsz > count)
4949
pgsz = count;
50-
clear_pmem((void __pmem *)addr, pgsz);
50+
clear_pmem(addr, pgsz);
5151
addr += pgsz;
5252
size -= pgsz;
5353
count -= pgsz;
@@ -62,23 +62,24 @@ int dax_clear_blocks(struct inode *inode, sector_t block, long size)
6262
}
6363
EXPORT_SYMBOL_GPL(dax_clear_blocks);
6464

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)
6667
{
6768
unsigned long pfn;
6869
sector_t sector = bh->b_blocknr << (blkbits - 9);
6970
return bdev_direct_access(bh->b_bdev, sector, addr, &pfn, bh->b_size);
7071
}
7172

7273
/* 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-
loff_t end)
74+
static void dax_new_buf(void __pmem *addr, unsigned size, unsigned first,
75+
loff_t pos, loff_t end)
7576
{
7677
loff_t final = end - pos + first; /* The final byte of the buffer */
7778

7879
if (first > 0)
79-
clear_pmem((void __pmem *)addr, first);
80+
clear_pmem(addr, first);
8081
if (final < size)
81-
clear_pmem((void __pmem *)addr + final, size - final);
82+
clear_pmem(addr + final, size - final);
8283
}
8384

8485
static bool buffer_written(struct buffer_head *bh)
@@ -106,7 +107,7 @@ static ssize_t dax_io(struct inode *inode, struct iov_iter *iter,
106107
loff_t pos = start;
107108
loff_t max = start;
108109
loff_t bh_max = start;
109-
void *addr;
110+
void __pmem *addr;
110111
bool hole = false;
111112
bool need_wmb = false;
112113

@@ -158,11 +159,11 @@ static ssize_t dax_io(struct inode *inode, struct iov_iter *iter,
158159
}
159160

160161
if (iov_iter_rw(iter) == WRITE) {
161-
len = copy_from_iter_pmem((void __pmem *)addr,
162-
max - pos, iter);
162+
len = copy_from_iter_pmem(addr, max - pos, iter);
163163
need_wmb = true;
164164
} else if (!hole)
165-
len = copy_to_iter(addr, max - pos, iter);
165+
len = copy_to_iter((void __force *)addr, max - pos,
166+
iter);
166167
else
167168
len = iov_iter_zero(max - pos, iter);
168169

@@ -268,11 +269,13 @@ static int dax_load_hole(struct address_space *mapping, struct page *page,
268269
static int copy_user_bh(struct page *to, struct buffer_head *bh,
269270
unsigned blkbits, unsigned long vaddr)
270271
{
271-
void *vfrom, *vto;
272+
void __pmem *vfrom;
273+
void *vto;
274+
272275
if (dax_get_addr(bh, &vfrom, blkbits) < 0)
273276
return -EIO;
274277
vto = kmap_atomic(to);
275-
copy_user_page(vto, vfrom, vaddr, to);
278+
copy_user_page(vto, (void __force *)vfrom, vaddr, to);
276279
kunmap_atomic(vto);
277280
return 0;
278281
}
@@ -283,7 +286,7 @@ static int dax_insert_mapping(struct inode *inode, struct buffer_head *bh,
283286
struct address_space *mapping = inode->i_mapping;
284287
sector_t sector = bh->b_blocknr << (inode->i_blkbits - 9);
285288
unsigned long vaddr = (unsigned long)vmf->virtual_address;
286-
void *addr;
289+
void __pmem *addr;
287290
unsigned long pfn;
288291
pgoff_t size;
289292
int error;
@@ -312,7 +315,7 @@ static int dax_insert_mapping(struct inode *inode, struct buffer_head *bh,
312315
}
313316

314317
if (buffer_unwritten(bh) || buffer_new(bh)) {
315-
clear_pmem((void __pmem *)addr, PAGE_SIZE);
318+
clear_pmem(addr, PAGE_SIZE);
316319
wmb_pmem();
317320
}
318321

@@ -548,11 +551,11 @@ int dax_zero_page_range(struct inode *inode, loff_t from, unsigned length,
548551
if (err < 0)
549552
return err;
550553
if (buffer_written(&bh)) {
551-
void *addr;
554+
void __pmem *addr;
552555
err = dax_get_addr(&bh, &addr, inode->i_blkbits);
553556
if (err < 0)
554557
return err;
555-
clear_pmem((void __pmem *)addr + offset, length);
558+
clear_pmem(addr + offset, length);
556559
wmb_pmem();
557560
}
558561

include/linux/blkdev.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,8 +1555,8 @@ struct block_device_operations {
15551555
int (*rw_page)(struct block_device *, sector_t, struct page *, int rw);
15561556
int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
15571557
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);
15601560
unsigned int (*check_events) (struct gendisk *disk,
15611561
unsigned int clearing);
15621562
/* ->media_changed() is DEPRECATED, use ->check_events() instead */
@@ -1574,8 +1574,8 @@ extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int,
15741574
extern int bdev_read_page(struct block_device *, sector_t, struct page *);
15751575
extern int bdev_write_page(struct block_device *, sector_t, struct page *,
15761576
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);
15791579
#else /* CONFIG_BLOCK */
15801580

15811581
struct block_device;

0 commit comments

Comments
 (0)