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>
This commit is contained in:

committed by
Jens Axboe

parent
c761d96b07
commit
dd22f551ac
@@ -13,18 +13,12 @@
|
||||
#include "ext2.h"
|
||||
#include "xip.h"
|
||||
|
||||
static inline int
|
||||
__inode_direct_access(struct inode *inode, sector_t block,
|
||||
void **kaddr, unsigned long *pfn)
|
||||
static inline long __inode_direct_access(struct inode *inode, sector_t block,
|
||||
void **kaddr, unsigned long *pfn, long size)
|
||||
{
|
||||
struct block_device *bdev = inode->i_sb->s_bdev;
|
||||
const struct block_device_operations *ops = bdev->bd_disk->fops;
|
||||
sector_t sector;
|
||||
|
||||
sector = block * (PAGE_SIZE / 512); /* ext2 block to bdev sector */
|
||||
|
||||
BUG_ON(!ops->direct_access);
|
||||
return ops->direct_access(bdev, sector, kaddr, pfn);
|
||||
sector_t sector = block * (PAGE_SIZE / 512);
|
||||
return bdev_direct_access(bdev, sector, kaddr, pfn, size);
|
||||
}
|
||||
|
||||
static inline int
|
||||
@@ -53,12 +47,13 @@ ext2_clear_xip_target(struct inode *inode, sector_t block)
|
||||
{
|
||||
void *kaddr;
|
||||
unsigned long pfn;
|
||||
int rc;
|
||||
long size;
|
||||
|
||||
rc = __inode_direct_access(inode, block, &kaddr, &pfn);
|
||||
if (!rc)
|
||||
clear_page(kaddr);
|
||||
return rc;
|
||||
size = __inode_direct_access(inode, block, &kaddr, &pfn, PAGE_SIZE);
|
||||
if (size < 0)
|
||||
return size;
|
||||
clear_page(kaddr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ext2_xip_verify_sb(struct super_block *sb)
|
||||
@@ -77,7 +72,7 @@ void ext2_xip_verify_sb(struct super_block *sb)
|
||||
int ext2_get_xip_mem(struct address_space *mapping, pgoff_t pgoff, int create,
|
||||
void **kmem, unsigned long *pfn)
|
||||
{
|
||||
int rc;
|
||||
long rc;
|
||||
sector_t block;
|
||||
|
||||
/* first, retrieve the sector number */
|
||||
@@ -86,6 +81,6 @@ int ext2_get_xip_mem(struct address_space *mapping, pgoff_t pgoff, int create,
|
||||
return rc;
|
||||
|
||||
/* retrieve address of the target data */
|
||||
rc = __inode_direct_access(mapping->host, block, kmem, pfn);
|
||||
return rc;
|
||||
rc = __inode_direct_access(mapping->host, block, kmem, pfn, PAGE_SIZE);
|
||||
return (rc < 0) ? rc : 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user