Fixes a regression from the recent "remove ->get_blocks() support"

change.  inode->i_blkbits should be used when making a get_block_t
request of a filesystem instead of dio->blkbits, as that does not
indicate the filesystem block size all the time (depends on request
alignment - see start of __blockdev_direct_IO).

Signed-off-by: Nathan Scott <nathans@sgi.com>
Acked-by: Badari Pulavarty <pbadari@us.ibm.com>
This commit is contained in:
Nathan Scott 2006-03-29 09:26:15 +10:00
parent e0edd5962b
commit 3c674e7423

View File

@ -524,8 +524,6 @@ static int get_more_blocks(struct dio *dio)
*/ */
ret = dio->page_errors; ret = dio->page_errors;
if (ret == 0) { if (ret == 0) {
map_bh->b_state = 0;
map_bh->b_size = 0;
BUG_ON(dio->block_in_file >= dio->final_block_in_request); BUG_ON(dio->block_in_file >= dio->final_block_in_request);
fs_startblk = dio->block_in_file >> dio->blkfactor; fs_startblk = dio->block_in_file >> dio->blkfactor;
dio_count = dio->final_block_in_request - dio->block_in_file; dio_count = dio->final_block_in_request - dio->block_in_file;
@ -534,6 +532,9 @@ static int get_more_blocks(struct dio *dio)
if (dio_count & blkmask) if (dio_count & blkmask)
fs_count++; fs_count++;
map_bh->b_state = 0;
map_bh->b_size = fs_count << dio->inode->i_blkbits;
create = dio->rw == WRITE; create = dio->rw == WRITE;
if (dio->lock_type == DIO_LOCKING) { if (dio->lock_type == DIO_LOCKING) {
if (dio->block_in_file < (i_size_read(dio->inode) >> if (dio->block_in_file < (i_size_read(dio->inode) >>
@ -542,13 +543,13 @@ static int get_more_blocks(struct dio *dio)
} else if (dio->lock_type == DIO_NO_LOCKING) { } else if (dio->lock_type == DIO_NO_LOCKING) {
create = 0; create = 0;
} }
/* /*
* For writes inside i_size we forbid block creations: only * For writes inside i_size we forbid block creations: only
* overwrites are permitted. We fall back to buffered writes * overwrites are permitted. We fall back to buffered writes
* at a higher level for inside-i_size block-instantiating * at a higher level for inside-i_size block-instantiating
* writes. * writes.
*/ */
map_bh->b_size = fs_count << dio->blkbits;
ret = (*dio->get_block)(dio->inode, fs_startblk, ret = (*dio->get_block)(dio->inode, fs_startblk,
map_bh, create); map_bh, create);
} }