|
@@ -70,19 +70,6 @@ static void bdev_inode_switch_bdi(struct inode *inode,
|
|
|
spin_unlock(&dst->wb.list_lock);
|
|
|
}
|
|
|
|
|
|
-sector_t blkdev_max_block(struct block_device *bdev)
|
|
|
-{
|
|
|
- sector_t retval = ~((sector_t)0);
|
|
|
- loff_t sz = i_size_read(bdev->bd_inode);
|
|
|
-
|
|
|
- if (sz) {
|
|
|
- unsigned int size = block_size(bdev);
|
|
|
- unsigned int sizebits = blksize_bits(size);
|
|
|
- retval = (sz >> sizebits);
|
|
|
- }
|
|
|
- return retval;
|
|
|
-}
|
|
|
-
|
|
|
/* Kill _all_ buffers and pagecache , dirty or not.. */
|
|
|
void kill_bdev(struct block_device *bdev)
|
|
|
{
|
|
@@ -163,52 +150,12 @@ static int
|
|
|
blkdev_get_block(struct inode *inode, sector_t iblock,
|
|
|
struct buffer_head *bh, int create)
|
|
|
{
|
|
|
- if (iblock >= blkdev_max_block(I_BDEV(inode))) {
|
|
|
- if (create)
|
|
|
- return -EIO;
|
|
|
-
|
|
|
- /*
|
|
|
- * for reads, we're just trying to fill a partial page.
|
|
|
- * return a hole, they will have to call get_block again
|
|
|
- * before they can fill it, and they will get -EIO at that
|
|
|
- * time
|
|
|
- */
|
|
|
- return 0;
|
|
|
- }
|
|
|
bh->b_bdev = I_BDEV(inode);
|
|
|
bh->b_blocknr = iblock;
|
|
|
set_buffer_mapped(bh);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int
|
|
|
-blkdev_get_blocks(struct inode *inode, sector_t iblock,
|
|
|
- struct buffer_head *bh, int create)
|
|
|
-{
|
|
|
- sector_t end_block = blkdev_max_block(I_BDEV(inode));
|
|
|
- unsigned long max_blocks = bh->b_size >> inode->i_blkbits;
|
|
|
-
|
|
|
- if ((iblock + max_blocks) > end_block) {
|
|
|
- max_blocks = end_block - iblock;
|
|
|
- if ((long)max_blocks <= 0) {
|
|
|
- if (create)
|
|
|
- return -EIO; /* write fully beyond EOF */
|
|
|
- /*
|
|
|
- * It is a read which is fully beyond EOF. We return
|
|
|
- * a !buffer_mapped buffer
|
|
|
- */
|
|
|
- max_blocks = 0;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- bh->b_bdev = I_BDEV(inode);
|
|
|
- bh->b_blocknr = iblock;
|
|
|
- bh->b_size = max_blocks << inode->i_blkbits;
|
|
|
- if (max_blocks)
|
|
|
- set_buffer_mapped(bh);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static ssize_t
|
|
|
blkdev_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
|
|
|
loff_t offset, unsigned long nr_segs)
|
|
@@ -217,7 +164,7 @@ blkdev_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
|
|
|
struct inode *inode = file->f_mapping->host;
|
|
|
|
|
|
return __blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iov, offset,
|
|
|
- nr_segs, blkdev_get_blocks, NULL, NULL, 0);
|
|
|
+ nr_segs, blkdev_get_block, NULL, NULL, 0);
|
|
|
}
|
|
|
|
|
|
int __sync_blockdev(struct block_device *bdev, int wait)
|