diff options
author | Jens Axboe <axboe@kernel.dk> | 2011-10-19 08:30:42 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2011-10-19 08:30:42 -0400 |
commit | 5c04b426f2e8b46cfc7969a35b2631063a3c646c (patch) | |
tree | 2d27d9f5d2fe5d5e8fbc01a467ec58bcb50235c1 /fs/ext4/inode.c | |
parent | 499337bb6511e665a236a6a947f819d98ea340c6 (diff) | |
parent | 899e3ee404961a90b828ad527573aaaac39f0ab1 (diff) |
Merge branch 'v3.1-rc10' into for-3.2/core
Conflicts:
block/blk-core.c
include/linux/blkdev.h
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r-- | fs/ext4/inode.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index d47264cafee0..986e2388f031 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -120,6 +120,9 @@ void ext4_evict_inode(struct inode *inode) | |||
120 | int err; | 120 | int err; |
121 | 121 | ||
122 | trace_ext4_evict_inode(inode); | 122 | trace_ext4_evict_inode(inode); |
123 | |||
124 | ext4_ioend_wait(inode); | ||
125 | |||
123 | if (inode->i_nlink) { | 126 | if (inode->i_nlink) { |
124 | /* | 127 | /* |
125 | * When journalling data dirty buffers are tracked only in the | 128 | * When journalling data dirty buffers are tracked only in the |
@@ -644,7 +647,7 @@ struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode, | |||
644 | return bh; | 647 | return bh; |
645 | if (buffer_uptodate(bh)) | 648 | if (buffer_uptodate(bh)) |
646 | return bh; | 649 | return bh; |
647 | ll_rw_block(READ_META, 1, &bh); | 650 | ll_rw_block(READ | REQ_META | REQ_PRIO, 1, &bh); |
648 | wait_on_buffer(bh); | 651 | wait_on_buffer(bh); |
649 | if (buffer_uptodate(bh)) | 652 | if (buffer_uptodate(bh)) |
650 | return bh; | 653 | return bh; |
@@ -983,6 +986,8 @@ static int ext4_journalled_write_end(struct file *file, | |||
983 | from = pos & (PAGE_CACHE_SIZE - 1); | 986 | from = pos & (PAGE_CACHE_SIZE - 1); |
984 | to = from + len; | 987 | to = from + len; |
985 | 988 | ||
989 | BUG_ON(!ext4_handle_valid(handle)); | ||
990 | |||
986 | if (copied < len) { | 991 | if (copied < len) { |
987 | if (!PageUptodate(page)) | 992 | if (!PageUptodate(page)) |
988 | copied = 0; | 993 | copied = 0; |
@@ -1283,7 +1288,12 @@ static int mpage_da_submit_io(struct mpage_da_data *mpd, | |||
1283 | else if (test_opt(inode->i_sb, MBLK_IO_SUBMIT)) | 1288 | else if (test_opt(inode->i_sb, MBLK_IO_SUBMIT)) |
1284 | err = ext4_bio_write_page(&io_submit, page, | 1289 | err = ext4_bio_write_page(&io_submit, page, |
1285 | len, mpd->wbc); | 1290 | len, mpd->wbc); |
1286 | else | 1291 | else if (buffer_uninit(page_bufs)) { |
1292 | ext4_set_bh_endio(page_bufs, inode); | ||
1293 | err = block_write_full_page_endio(page, | ||
1294 | noalloc_get_block_write, | ||
1295 | mpd->wbc, ext4_end_io_buffer_write); | ||
1296 | } else | ||
1287 | err = block_write_full_page(page, | 1297 | err = block_write_full_page(page, |
1288 | noalloc_get_block_write, mpd->wbc); | 1298 | noalloc_get_block_write, mpd->wbc); |
1289 | 1299 | ||
@@ -1699,6 +1709,8 @@ static int __ext4_journalled_writepage(struct page *page, | |||
1699 | goto out; | 1709 | goto out; |
1700 | } | 1710 | } |
1701 | 1711 | ||
1712 | BUG_ON(!ext4_handle_valid(handle)); | ||
1713 | |||
1702 | ret = walk_page_buffers(handle, page_bufs, 0, len, NULL, | 1714 | ret = walk_page_buffers(handle, page_bufs, 0, len, NULL, |
1703 | do_journal_get_write_access); | 1715 | do_journal_get_write_access); |
1704 | 1716 | ||
@@ -2668,8 +2680,15 @@ static void ext4_end_io_buffer_write(struct buffer_head *bh, int uptodate) | |||
2668 | goto out; | 2680 | goto out; |
2669 | } | 2681 | } |
2670 | 2682 | ||
2671 | io_end->flag = EXT4_IO_END_UNWRITTEN; | 2683 | /* |
2684 | * It may be over-defensive here to check EXT4_IO_END_UNWRITTEN now, | ||
2685 | * but being more careful is always safe for the future change. | ||
2686 | */ | ||
2672 | inode = io_end->inode; | 2687 | inode = io_end->inode; |
2688 | if (!(io_end->flag & EXT4_IO_END_UNWRITTEN)) { | ||
2689 | io_end->flag |= EXT4_IO_END_UNWRITTEN; | ||
2690 | atomic_inc(&EXT4_I(inode)->i_aiodio_unwritten); | ||
2691 | } | ||
2673 | 2692 | ||
2674 | /* Add the io_end to per-inode completed io list*/ | 2693 | /* Add the io_end to per-inode completed io list*/ |
2675 | spin_lock_irqsave(&EXT4_I(inode)->i_completed_io_lock, flags); | 2694 | spin_lock_irqsave(&EXT4_I(inode)->i_completed_io_lock, flags); |
@@ -3279,7 +3298,7 @@ make_io: | |||
3279 | trace_ext4_load_inode(inode); | 3298 | trace_ext4_load_inode(inode); |
3280 | get_bh(bh); | 3299 | get_bh(bh); |
3281 | bh->b_end_io = end_buffer_read_sync; | 3300 | bh->b_end_io = end_buffer_read_sync; |
3282 | submit_bh(READ_META, bh); | 3301 | submit_bh(READ | REQ_META | REQ_PRIO, bh); |
3283 | wait_on_buffer(bh); | 3302 | wait_on_buffer(bh); |
3284 | if (!buffer_uptodate(bh)) { | 3303 | if (!buffer_uptodate(bh)) { |
3285 | EXT4_ERROR_INODE_BLOCK(inode, block, | 3304 | EXT4_ERROR_INODE_BLOCK(inode, block, |