diff options
Diffstat (limited to 'fs/buffer.c')
| -rw-r--r-- | fs/buffer.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index 2066e4cb700c..35fa34977e81 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
| @@ -1478,8 +1478,10 @@ EXPORT_SYMBOL(__getblk); | |||
| 1478 | void __breadahead(struct block_device *bdev, sector_t block, int size) | 1478 | void __breadahead(struct block_device *bdev, sector_t block, int size) |
| 1479 | { | 1479 | { |
| 1480 | struct buffer_head *bh = __getblk(bdev, block, size); | 1480 | struct buffer_head *bh = __getblk(bdev, block, size); |
| 1481 | ll_rw_block(READA, 1, &bh); | 1481 | if (likely(bh)) { |
| 1482 | brelse(bh); | 1482 | ll_rw_block(READA, 1, &bh); |
| 1483 | brelse(bh); | ||
| 1484 | } | ||
| 1483 | } | 1485 | } |
| 1484 | EXPORT_SYMBOL(__breadahead); | 1486 | EXPORT_SYMBOL(__breadahead); |
| 1485 | 1487 | ||
| @@ -1497,7 +1499,7 @@ __bread(struct block_device *bdev, sector_t block, int size) | |||
| 1497 | { | 1499 | { |
| 1498 | struct buffer_head *bh = __getblk(bdev, block, size); | 1500 | struct buffer_head *bh = __getblk(bdev, block, size); |
| 1499 | 1501 | ||
| 1500 | if (!buffer_uptodate(bh)) | 1502 | if (likely(bh) && !buffer_uptodate(bh)) |
| 1501 | bh = __bread_slow(bh); | 1503 | bh = __bread_slow(bh); |
| 1502 | return bh; | 1504 | return bh; |
| 1503 | } | 1505 | } |
| @@ -1637,6 +1639,15 @@ out: | |||
| 1637 | } | 1639 | } |
| 1638 | EXPORT_SYMBOL(block_invalidatepage); | 1640 | EXPORT_SYMBOL(block_invalidatepage); |
| 1639 | 1641 | ||
| 1642 | int do_invalidatepage(struct page *page, unsigned long offset) | ||
| 1643 | { | ||
| 1644 | int (*invalidatepage)(struct page *, unsigned long); | ||
| 1645 | invalidatepage = page->mapping->a_ops->invalidatepage; | ||
| 1646 | if (invalidatepage == NULL) | ||
| 1647 | invalidatepage = block_invalidatepage; | ||
| 1648 | return (*invalidatepage)(page, offset); | ||
| 1649 | } | ||
| 1650 | |||
| 1640 | /* | 1651 | /* |
| 1641 | * We attach and possibly dirty the buffers atomically wrt | 1652 | * We attach and possibly dirty the buffers atomically wrt |
| 1642 | * __set_page_dirty_buffers() via private_lock. try_to_free_buffers | 1653 | * __set_page_dirty_buffers() via private_lock. try_to_free_buffers |
| @@ -2696,7 +2707,7 @@ int block_write_full_page(struct page *page, get_block_t *get_block, | |||
| 2696 | * they may have been added in ext3_writepage(). Make them | 2707 | * they may have been added in ext3_writepage(). Make them |
| 2697 | * freeable here, so the page does not leak. | 2708 | * freeable here, so the page does not leak. |
| 2698 | */ | 2709 | */ |
| 2699 | block_invalidatepage(page, 0); | 2710 | do_invalidatepage(page, 0); |
| 2700 | unlock_page(page); | 2711 | unlock_page(page); |
| 2701 | return 0; /* don't care */ | 2712 | return 0; /* don't care */ |
| 2702 | } | 2713 | } |
