diff options
-rw-r--r-- | fs/direct-io.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/fs/direct-io.c b/fs/direct-io.c index 9d1d2aa73e42..910a8ed74b5d 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c | |||
@@ -524,8 +524,6 @@ static int get_more_blocks(struct dio *dio) | |||
524 | */ | 524 | */ |
525 | ret = dio->page_errors; | 525 | ret = dio->page_errors; |
526 | if (ret == 0) { | 526 | if (ret == 0) { |
527 | map_bh->b_state = 0; | ||
528 | map_bh->b_size = 0; | ||
529 | BUG_ON(dio->block_in_file >= dio->final_block_in_request); | 527 | BUG_ON(dio->block_in_file >= dio->final_block_in_request); |
530 | fs_startblk = dio->block_in_file >> dio->blkfactor; | 528 | fs_startblk = dio->block_in_file >> dio->blkfactor; |
531 | dio_count = dio->final_block_in_request - dio->block_in_file; | 529 | dio_count = dio->final_block_in_request - dio->block_in_file; |
@@ -534,6 +532,9 @@ static int get_more_blocks(struct dio *dio) | |||
534 | if (dio_count & blkmask) | 532 | if (dio_count & blkmask) |
535 | fs_count++; | 533 | fs_count++; |
536 | 534 | ||
535 | map_bh->b_state = 0; | ||
536 | map_bh->b_size = fs_count << dio->inode->i_blkbits; | ||
537 | |||
537 | create = dio->rw == WRITE; | 538 | create = dio->rw == WRITE; |
538 | if (dio->lock_type == DIO_LOCKING) { | 539 | if (dio->lock_type == DIO_LOCKING) { |
539 | if (dio->block_in_file < (i_size_read(dio->inode) >> | 540 | if (dio->block_in_file < (i_size_read(dio->inode) >> |
@@ -542,13 +543,13 @@ static int get_more_blocks(struct dio *dio) | |||
542 | } else if (dio->lock_type == DIO_NO_LOCKING) { | 543 | } else if (dio->lock_type == DIO_NO_LOCKING) { |
543 | create = 0; | 544 | create = 0; |
544 | } | 545 | } |
546 | |||
545 | /* | 547 | /* |
546 | * For writes inside i_size we forbid block creations: only | 548 | * For writes inside i_size we forbid block creations: only |
547 | * overwrites are permitted. We fall back to buffered writes | 549 | * overwrites are permitted. We fall back to buffered writes |
548 | * at a higher level for inside-i_size block-instantiating | 550 | * at a higher level for inside-i_size block-instantiating |
549 | * writes. | 551 | * writes. |
550 | */ | 552 | */ |
551 | map_bh->b_size = fs_count << dio->blkbits; | ||
552 | ret = (*dio->get_block)(dio->inode, fs_startblk, | 553 | ret = (*dio->get_block)(dio->inode, fs_startblk, |
553 | map_bh, create); | 554 | map_bh, create); |
554 | } | 555 | } |