diff options
| author | Matthew Wilcox <matthew.r.wilcox@intel.com> | 2015-01-07 11:05:34 -0500 |
|---|---|---|
| committer | Jens Axboe <axboe@fb.com> | 2015-01-13 23:58:11 -0500 |
| commit | dd22f551ac0ad366f92f601835f6623b83adc331 (patch) | |
| tree | 47f6c4f274b3b6989869734b32afdc2e5d85769d /arch/powerpc/sysdev | |
| parent | c761d96b079e99d106fa4064e730ef7d0f312f9d (diff) | |
block: Change direct_access calling convention
In order to support accesses to larger chunks of memory, pass in a
'size' parameter (counted in bytes), and return the amount available at
that address.
Add a new helper function, bdev_direct_access(), to handle common
functionality including partition handling, checking the length requested
is positive, checking for the sector being page-aligned, and checking
the length of the request does not pass the end of the partition.
Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Boaz Harrosh <boaz@plexistor.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'arch/powerpc/sysdev')
| -rw-r--r-- | arch/powerpc/sysdev/axonram.c | 17 |
1 files changed, 4 insertions, 13 deletions
diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c index f532c92bf99d..20f8afe855d1 100644 --- a/arch/powerpc/sysdev/axonram.c +++ b/arch/powerpc/sysdev/axonram.c | |||
| @@ -139,26 +139,17 @@ axon_ram_make_request(struct request_queue *queue, struct bio *bio) | |||
| 139 | * axon_ram_direct_access - direct_access() method for block device | 139 | * axon_ram_direct_access - direct_access() method for block device |
| 140 | * @device, @sector, @data: see block_device_operations method | 140 | * @device, @sector, @data: see block_device_operations method |
| 141 | */ | 141 | */ |
| 142 | static int | 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) | 144 | void **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; | 147 | loff_t offset = (loff_t)sector << AXON_RAM_SECTOR_SHIFT; |
| 148 | |||
| 149 | offset = sector; | ||
| 150 | if (device->bd_part != NULL) | ||
| 151 | offset += device->bd_part->start_sect; | ||
| 152 | offset <<= AXON_RAM_SECTOR_SHIFT; | ||
| 153 | if (offset >= bank->size) { | ||
| 154 | dev_err(&bank->device->dev, "Access outside of address space\n"); | ||
| 155 | return -ERANGE; | ||
| 156 | } | ||
| 157 | 148 | ||
| 158 | *kaddr = (void *)(bank->ph_addr + offset); | 149 | *kaddr = (void *)(bank->ph_addr + offset); |
| 159 | *pfn = virt_to_phys(kaddr) >> PAGE_SHIFT; | 150 | *pfn = virt_to_phys(kaddr) >> PAGE_SHIFT; |
| 160 | 151 | ||
| 161 | return 0; | 152 | return bank->size - offset; |
| 162 | } | 153 | } |
| 163 | 154 | ||
| 164 | static const struct block_device_operations axon_ram_devops = { | 155 | static const struct block_device_operations axon_ram_devops = { |
