From 439c24627f4c72686e8b5892a215167980f2072b Mon Sep 17 00:00:00 2001 From: Jared Hulbert Date: Mon, 28 Apr 2008 02:13:02 -0700 Subject: [PATCH] --- yaml --- r: 94025 b: refs/heads/master c: 30afcb4bd2762fa4b87b17ada9500aa46dc10b1b h: refs/heads/master i: 94023: 444c9f227594381aea0f3ff0aa8ad98c37d277f9 v: v3 --- [refs] | 2 +- trunk/arch/powerpc/sysdev/axonram.c | 5 +++-- trunk/drivers/block/brd.c | 5 +++-- trunk/drivers/s390/block/dcssblk.c | 8 +++++--- trunk/fs/ext2/xip.c | 24 ++++++++++++++---------- trunk/include/linux/fs.h | 3 ++- 6 files changed, 28 insertions(+), 19 deletions(-) diff --git a/[refs] b/[refs] index a7d3cdb5ad7c..a76895112b2a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 423bad600443c590f34ed7ce357591f76f48f137 +refs/heads/master: 30afcb4bd2762fa4b87b17ada9500aa46dc10b1b diff --git a/trunk/arch/powerpc/sysdev/axonram.c b/trunk/arch/powerpc/sysdev/axonram.c index d359d6e92975..7f59188cd9a1 100644 --- a/trunk/arch/powerpc/sysdev/axonram.c +++ b/trunk/arch/powerpc/sysdev/axonram.c @@ -143,7 +143,7 @@ axon_ram_make_request(struct request_queue *queue, struct bio *bio) */ static int axon_ram_direct_access(struct block_device *device, sector_t sector, - unsigned long *data) + void **kaddr, unsigned long *pfn) { struct axon_ram_bank *bank = device->bd_disk->private_data; loff_t offset; @@ -154,7 +154,8 @@ axon_ram_direct_access(struct block_device *device, sector_t sector, return -ERANGE; } - *data = bank->ph_addr + offset; + *kaddr = (void *)(bank->ph_addr + offset); + *pfn = virt_to_phys(kaddr) >> PAGE_SHIFT; return 0; } diff --git a/trunk/drivers/block/brd.c b/trunk/drivers/block/brd.c index 7bd76639544c..e8e38faeafd8 100644 --- a/trunk/drivers/block/brd.c +++ b/trunk/drivers/block/brd.c @@ -319,7 +319,7 @@ static int brd_make_request(struct request_queue *q, struct bio *bio) #ifdef CONFIG_BLK_DEV_XIP static int brd_direct_access (struct block_device *bdev, sector_t sector, - unsigned long *data) + void **kaddr, unsigned long *pfn) { struct brd_device *brd = bdev->bd_disk->private_data; struct page *page; @@ -333,7 +333,8 @@ static int brd_direct_access (struct block_device *bdev, sector_t sector, page = brd_insert_page(brd, sector); if (!page) return -ENOMEM; - *data = (unsigned long)page_address(page); + *kaddr = page_address(page); + *pfn = page_to_pfn(page); return 0; } diff --git a/trunk/drivers/s390/block/dcssblk.c b/trunk/drivers/s390/block/dcssblk.c index 04787eab1016..bb52d2fbac18 100644 --- a/trunk/drivers/s390/block/dcssblk.c +++ b/trunk/drivers/s390/block/dcssblk.c @@ -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 @@ 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) { 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; } diff --git a/trunk/fs/ext2/xip.c b/trunk/fs/ext2/xip.c index ca7f00312388..430b4c8ee971 100644 --- a/trunk/fs/ext2/xip.c +++ b/trunk/fs/ext2/xip.c @@ -16,11 +16,13 @@ static inline int __inode_direct_access(struct inode *inode, sector_t sector, - unsigned long *data) + void **kaddr, unsigned long *pfn) { - BUG_ON(!inode->i_sb->s_bdev->bd_disk->fops->direct_access); - return inode->i_sb->s_bdev->bd_disk->fops - ->direct_access(inode->i_sb->s_bdev,sector,data); + struct block_device *bdev = inode->i_sb->s_bdev; + struct block_device_operations *ops = bdev->bd_disk->fops; + + BUG_ON(!ops->direct_access); + return ops->direct_access(bdev, sector, kaddr, pfn); } static inline int @@ -48,12 +50,13 @@ int ext2_clear_xip_target(struct inode *inode, int block) { sector_t sector = block * (PAGE_SIZE/512); - unsigned long data; + void *kaddr; + unsigned long pfn; int rc; - rc = __inode_direct_access(inode, sector, &data); + rc = __inode_direct_access(inode, sector, &kaddr, &pfn); if (!rc) - clear_page((void*)data); + clear_page(kaddr); return rc; } @@ -74,7 +77,8 @@ ext2_get_xip_page(struct address_space *mapping, sector_t offset, int create) { int rc; - unsigned long data; + void *kaddr; + unsigned long pfn; sector_t sector; /* first, retrieve the sector number */ @@ -84,9 +88,9 @@ ext2_get_xip_page(struct address_space *mapping, sector_t offset, /* retrieve address of the target data */ rc = __inode_direct_access - (mapping->host, sector * (PAGE_SIZE/512), &data); + (mapping->host, sector * (PAGE_SIZE/512), &kaddr, &pfn); if (!rc) - return virt_to_page(data); + return pfn_to_page(pfn); error: return ERR_PTR(rc); diff --git a/trunk/include/linux/fs.h b/trunk/include/linux/fs.h index d6d7c52055c6..bd05f5678045 100644 --- a/trunk/include/linux/fs.h +++ b/trunk/include/linux/fs.h @@ -1178,7 +1178,8 @@ struct block_device_operations { int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long); long (*unlocked_ioctl) (struct file *, unsigned, unsigned long); long (*compat_ioctl) (struct file *, unsigned, unsigned long); - int (*direct_access) (struct block_device *, sector_t, unsigned long *); + int (*direct_access) (struct block_device *, sector_t, + void **, unsigned long *); int (*media_changed) (struct gendisk *); int (*revalidate_disk) (struct gendisk *); int (*getgeo)(struct block_device *, struct hd_geometry *);