mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
return pfn from direct_access, for XIP
Alter the block device ->direct_access() API to work with the new get_xip_mem() API (that requires both kaddr and pfn are returned). Some architectures will not do the right thing in their virt_to_page() for use by XIP (to translate from the kernel virtual address returned by direct_access(), to a user mappable pfn in XIP's page fault handler. However, we can't switch it to just return the pfn and not the kaddr, because we have no good way to get a kva from a pfn, and XIP requires the kva for its read(2) and write(2) handlers. So we have to return both. Signed-off-by: Jared Hulbert <[email protected]> Signed-off-by: Nick Piggin <[email protected]> Cc: Carsten Otte <[email protected]> Cc: Heiko Carstens <[email protected]> Cc: [email protected] Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
423bad6004
commit
30afcb4bd2
5 changed files with 27 additions and 18 deletions
|
|
@ -36,7 +36,7 @@ static int dcssblk_open(struct inode *inode, struct file *filp);
|
|||
static int dcssblk_release(struct inode *inode, struct file *filp);
|
||||
static int dcssblk_make_request(struct request_queue *q, struct bio *bio);
|
||||
static int dcssblk_direct_access(struct block_device *bdev, sector_t secnum,
|
||||
unsigned long *data);
|
||||
void **kaddr, unsigned long *pfn);
|
||||
|
||||
static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0";
|
||||
|
||||
|
|
@ -636,7 +636,7 @@ fail:
|
|||
|
||||
static int
|
||||
dcssblk_direct_access (struct block_device *bdev, sector_t secnum,
|
||||
unsigned long *data)
|
||||
void **kaddr, unsigned long *pfn)
|
||||
{
|
||||
struct dcssblk_dev_info *dev_info;
|
||||
unsigned long pgoff;
|
||||
|
|
@ -649,7 +649,9 @@ dcssblk_direct_access (struct block_device *bdev, sector_t secnum,
|
|||
pgoff = secnum / (PAGE_SIZE / 512);
|
||||
if ((pgoff+1)*PAGE_SIZE-1 > dev_info->end - dev_info->start)
|
||||
return -ERANGE;
|
||||
*data = (unsigned long) (dev_info->start+pgoff*PAGE_SIZE);
|
||||
*kaddr = (void *) (dev_info->start+pgoff*PAGE_SIZE);
|
||||
*pfn = virt_to_phys(*kaddr) >> PAGE_SHIFT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue