diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-30 14:19:05 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-30 14:19:05 -0500 |
commit | f568849edac8611d603e00bd6cbbcfea09395ae6 (patch) | |
tree | b9472d640fe5d87426d38c9d81d946cf197ad3fb /fs/btrfs/inode.c | |
parent | d9894c228b11273e720bb63ba120d1d326fe9d94 (diff) | |
parent | 675675ada486dde5bf9aa51665e90706bff11a35 (diff) |
Merge branch 'for-3.14/core' of git://git.kernel.dk/linux-block
Pull core block IO changes from Jens Axboe:
"The major piece in here is the immutable bio_ve series from Kent, the
rest is fairly minor. It was supposed to go in last round, but
various issues pushed it to this release instead. The pull request
contains:
- Various smaller blk-mq fixes from different folks. Nothing major
here, just minor fixes and cleanups.
- Fix for a memory leak in the error path in the block ioctl code
from Christian Engelmayer.
- Header export fix from CaiZhiyong.
- Finally the immutable biovec changes from Kent Overstreet. This
enables some nice future work on making arbitrarily sized bios
possible, and splitting more efficient. Related fixes to immutable
bio_vecs:
- dm-cache immutable fixup from Mike Snitzer.
- btrfs immutable fixup from Muthu Kumar.
- bio-integrity fix from Nic Bellinger, which is also going to stable"
* 'for-3.14/core' of git://git.kernel.dk/linux-block: (44 commits)
xtensa: fixup simdisk driver to work with immutable bio_vecs
block/blk-mq-cpu.c: use hotcpu_notifier()
blk-mq: for_each_* macro correctness
block: Fix memory leak in rw_copy_check_uvector() handling
bio-integrity: Fix bio_integrity_verify segment start bug
block: remove unrelated header files and export symbol
blk-mq: uses page->list incorrectly
blk-mq: use __smp_call_function_single directly
btrfs: fix missing increment of bi_remaining
Revert "block: Warn and free bio if bi_end_io is not set"
block: Warn and free bio if bi_end_io is not set
blk-mq: fix initializing request's start time
block: blk-mq: don't export blk_mq_free_queue()
block: blk-mq: make blk_sync_queue support mq
block: blk-mq: support draining mq queue
dm cache: increment bi_remaining when bi_end_io is restored
block: fixup for generic bio chaining
block: Really silence spurious compiler warnings
block: Silence spurious compiler warnings
block: Kill bio_pair_split()
...
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 514b291b1354..d546d8c3038b 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -1577,7 +1577,7 @@ int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, | |||
1577 | unsigned long bio_flags) | 1577 | unsigned long bio_flags) |
1578 | { | 1578 | { |
1579 | struct btrfs_root *root = BTRFS_I(page->mapping->host)->root; | 1579 | struct btrfs_root *root = BTRFS_I(page->mapping->host)->root; |
1580 | u64 logical = (u64)bio->bi_sector << 9; | 1580 | u64 logical = (u64)bio->bi_iter.bi_sector << 9; |
1581 | u64 length = 0; | 1581 | u64 length = 0; |
1582 | u64 map_length; | 1582 | u64 map_length; |
1583 | int ret; | 1583 | int ret; |
@@ -1585,7 +1585,7 @@ int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, | |||
1585 | if (bio_flags & EXTENT_BIO_COMPRESSED) | 1585 | if (bio_flags & EXTENT_BIO_COMPRESSED) |
1586 | return 0; | 1586 | return 0; |
1587 | 1587 | ||
1588 | length = bio->bi_size; | 1588 | length = bio->bi_iter.bi_size; |
1589 | map_length = length; | 1589 | map_length = length; |
1590 | ret = btrfs_map_block(root->fs_info, rw, logical, | 1590 | ret = btrfs_map_block(root->fs_info, rw, logical, |
1591 | &map_length, NULL, 0); | 1591 | &map_length, NULL, 0); |
@@ -6783,17 +6783,16 @@ unlock_err: | |||
6783 | static void btrfs_endio_direct_read(struct bio *bio, int err) | 6783 | static void btrfs_endio_direct_read(struct bio *bio, int err) |
6784 | { | 6784 | { |
6785 | struct btrfs_dio_private *dip = bio->bi_private; | 6785 | struct btrfs_dio_private *dip = bio->bi_private; |
6786 | struct bio_vec *bvec_end = bio->bi_io_vec + bio->bi_vcnt - 1; | 6786 | struct bio_vec *bvec; |
6787 | struct bio_vec *bvec = bio->bi_io_vec; | ||
6788 | struct inode *inode = dip->inode; | 6787 | struct inode *inode = dip->inode; |
6789 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6788 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6790 | struct bio *dio_bio; | 6789 | struct bio *dio_bio; |
6791 | u32 *csums = (u32 *)dip->csum; | 6790 | u32 *csums = (u32 *)dip->csum; |
6792 | int index = 0; | ||
6793 | u64 start; | 6791 | u64 start; |
6792 | int i; | ||
6794 | 6793 | ||
6795 | start = dip->logical_offset; | 6794 | start = dip->logical_offset; |
6796 | do { | 6795 | bio_for_each_segment_all(bvec, bio, i) { |
6797 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) { | 6796 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) { |
6798 | struct page *page = bvec->bv_page; | 6797 | struct page *page = bvec->bv_page; |
6799 | char *kaddr; | 6798 | char *kaddr; |
@@ -6809,18 +6808,16 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) | |||
6809 | local_irq_restore(flags); | 6808 | local_irq_restore(flags); |
6810 | 6809 | ||
6811 | flush_dcache_page(bvec->bv_page); | 6810 | flush_dcache_page(bvec->bv_page); |
6812 | if (csum != csums[index]) { | 6811 | if (csum != csums[i]) { |
6813 | btrfs_err(root->fs_info, "csum failed ino %llu off %llu csum %u expected csum %u", | 6812 | btrfs_err(root->fs_info, "csum failed ino %llu off %llu csum %u expected csum %u", |
6814 | btrfs_ino(inode), start, csum, | 6813 | btrfs_ino(inode), start, csum, |
6815 | csums[index]); | 6814 | csums[i]); |
6816 | err = -EIO; | 6815 | err = -EIO; |
6817 | } | 6816 | } |
6818 | } | 6817 | } |
6819 | 6818 | ||
6820 | start += bvec->bv_len; | 6819 | start += bvec->bv_len; |
6821 | bvec++; | 6820 | } |
6822 | index++; | ||
6823 | } while (bvec <= bvec_end); | ||
6824 | 6821 | ||
6825 | unlock_extent(&BTRFS_I(inode)->io_tree, dip->logical_offset, | 6822 | unlock_extent(&BTRFS_I(inode)->io_tree, dip->logical_offset, |
6826 | dip->logical_offset + dip->bytes - 1); | 6823 | dip->logical_offset + dip->bytes - 1); |
@@ -6901,7 +6898,8 @@ static void btrfs_end_dio_bio(struct bio *bio, int err) | |||
6901 | printk(KERN_ERR "btrfs direct IO failed ino %llu rw %lu " | 6898 | printk(KERN_ERR "btrfs direct IO failed ino %llu rw %lu " |
6902 | "sector %#Lx len %u err no %d\n", | 6899 | "sector %#Lx len %u err no %d\n", |
6903 | btrfs_ino(dip->inode), bio->bi_rw, | 6900 | btrfs_ino(dip->inode), bio->bi_rw, |
6904 | (unsigned long long)bio->bi_sector, bio->bi_size, err); | 6901 | (unsigned long long)bio->bi_iter.bi_sector, |
6902 | bio->bi_iter.bi_size, err); | ||
6905 | dip->errors = 1; | 6903 | dip->errors = 1; |
6906 | 6904 | ||
6907 | /* | 6905 | /* |
@@ -6992,7 +6990,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
6992 | struct bio *bio; | 6990 | struct bio *bio; |
6993 | struct bio *orig_bio = dip->orig_bio; | 6991 | struct bio *orig_bio = dip->orig_bio; |
6994 | struct bio_vec *bvec = orig_bio->bi_io_vec; | 6992 | struct bio_vec *bvec = orig_bio->bi_io_vec; |
6995 | u64 start_sector = orig_bio->bi_sector; | 6993 | u64 start_sector = orig_bio->bi_iter.bi_sector; |
6996 | u64 file_offset = dip->logical_offset; | 6994 | u64 file_offset = dip->logical_offset; |
6997 | u64 submit_len = 0; | 6995 | u64 submit_len = 0; |
6998 | u64 map_length; | 6996 | u64 map_length; |
@@ -7000,7 +6998,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
7000 | int ret = 0; | 6998 | int ret = 0; |
7001 | int async_submit = 0; | 6999 | int async_submit = 0; |
7002 | 7000 | ||
7003 | map_length = orig_bio->bi_size; | 7001 | map_length = orig_bio->bi_iter.bi_size; |
7004 | ret = btrfs_map_block(root->fs_info, rw, start_sector << 9, | 7002 | ret = btrfs_map_block(root->fs_info, rw, start_sector << 9, |
7005 | &map_length, NULL, 0); | 7003 | &map_length, NULL, 0); |
7006 | if (ret) { | 7004 | if (ret) { |
@@ -7008,7 +7006,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
7008 | return -EIO; | 7006 | return -EIO; |
7009 | } | 7007 | } |
7010 | 7008 | ||
7011 | if (map_length >= orig_bio->bi_size) { | 7009 | if (map_length >= orig_bio->bi_iter.bi_size) { |
7012 | bio = orig_bio; | 7010 | bio = orig_bio; |
7013 | goto submit; | 7011 | goto submit; |
7014 | } | 7012 | } |
@@ -7060,7 +7058,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
7060 | bio->bi_private = dip; | 7058 | bio->bi_private = dip; |
7061 | bio->bi_end_io = btrfs_end_dio_bio; | 7059 | bio->bi_end_io = btrfs_end_dio_bio; |
7062 | 7060 | ||
7063 | map_length = orig_bio->bi_size; | 7061 | map_length = orig_bio->bi_iter.bi_size; |
7064 | ret = btrfs_map_block(root->fs_info, rw, | 7062 | ret = btrfs_map_block(root->fs_info, rw, |
7065 | start_sector << 9, | 7063 | start_sector << 9, |
7066 | &map_length, NULL, 0); | 7064 | &map_length, NULL, 0); |
@@ -7118,7 +7116,8 @@ static void btrfs_submit_direct(int rw, struct bio *dio_bio, | |||
7118 | 7116 | ||
7119 | if (!skip_sum && !write) { | 7117 | if (!skip_sum && !write) { |
7120 | csum_size = btrfs_super_csum_size(root->fs_info->super_copy); | 7118 | csum_size = btrfs_super_csum_size(root->fs_info->super_copy); |
7121 | sum_len = dio_bio->bi_size >> inode->i_sb->s_blocksize_bits; | 7119 | sum_len = dio_bio->bi_iter.bi_size >> |
7120 | inode->i_sb->s_blocksize_bits; | ||
7122 | sum_len *= csum_size; | 7121 | sum_len *= csum_size; |
7123 | } else { | 7122 | } else { |
7124 | sum_len = 0; | 7123 | sum_len = 0; |
@@ -7133,8 +7132,8 @@ static void btrfs_submit_direct(int rw, struct bio *dio_bio, | |||
7133 | dip->private = dio_bio->bi_private; | 7132 | dip->private = dio_bio->bi_private; |
7134 | dip->inode = inode; | 7133 | dip->inode = inode; |
7135 | dip->logical_offset = file_offset; | 7134 | dip->logical_offset = file_offset; |
7136 | dip->bytes = dio_bio->bi_size; | 7135 | dip->bytes = dio_bio->bi_iter.bi_size; |
7137 | dip->disk_bytenr = (u64)dio_bio->bi_sector << 9; | 7136 | dip->disk_bytenr = (u64)dio_bio->bi_iter.bi_sector << 9; |
7138 | io_bio->bi_private = dip; | 7137 | io_bio->bi_private = dip; |
7139 | dip->errors = 0; | 7138 | dip->errors = 0; |
7140 | dip->orig_bio = io_bio; | 7139 | dip->orig_bio = io_bio; |