aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-01-30 14:19:05 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-01-30 14:19:05 -0500
commitf568849edac8611d603e00bd6cbbcfea09395ae6 (patch)
treeb9472d640fe5d87426d38c9d81d946cf197ad3fb /fs/btrfs/inode.c
parentd9894c228b11273e720bb63ba120d1d326fe9d94 (diff)
parent675675ada486dde5bf9aa51665e90706bff11a35 (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.c37
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:
6783static void btrfs_endio_direct_read(struct bio *bio, int err) 6783static 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;