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 /mm | |
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 'mm')
-rw-r--r-- | mm/bounce.c | 44 | ||||
-rw-r--r-- | mm/page_io.c | 10 |
2 files changed, 26 insertions, 28 deletions
diff --git a/mm/bounce.c b/mm/bounce.c index 5a7d58fb883b..523918b8c6dc 100644 --- a/mm/bounce.c +++ b/mm/bounce.c | |||
@@ -98,27 +98,24 @@ int init_emergency_isa_pool(void) | |||
98 | static void copy_to_high_bio_irq(struct bio *to, struct bio *from) | 98 | static void copy_to_high_bio_irq(struct bio *to, struct bio *from) |
99 | { | 99 | { |
100 | unsigned char *vfrom; | 100 | unsigned char *vfrom; |
101 | struct bio_vec *tovec, *fromvec; | 101 | struct bio_vec tovec, *fromvec = from->bi_io_vec; |
102 | int i; | 102 | struct bvec_iter iter; |
103 | 103 | ||
104 | bio_for_each_segment(tovec, to, i) { | 104 | bio_for_each_segment(tovec, to, iter) { |
105 | fromvec = from->bi_io_vec + i; | 105 | if (tovec.bv_page != fromvec->bv_page) { |
106 | 106 | /* | |
107 | /* | 107 | * fromvec->bv_offset and fromvec->bv_len might have |
108 | * not bounced | 108 | * been modified by the block layer, so use the original |
109 | */ | 109 | * copy, bounce_copy_vec already uses tovec->bv_len |
110 | if (tovec->bv_page == fromvec->bv_page) | 110 | */ |
111 | continue; | 111 | vfrom = page_address(fromvec->bv_page) + |
112 | 112 | tovec.bv_offset; | |
113 | /* | 113 | |
114 | * fromvec->bv_offset and fromvec->bv_len might have been | 114 | bounce_copy_vec(&tovec, vfrom); |
115 | * modified by the block layer, so use the original copy, | 115 | flush_dcache_page(tovec.bv_page); |
116 | * bounce_copy_vec already uses tovec->bv_len | 116 | } |
117 | */ | ||
118 | vfrom = page_address(fromvec->bv_page) + tovec->bv_offset; | ||
119 | 117 | ||
120 | bounce_copy_vec(tovec, vfrom); | 118 | fromvec++; |
121 | flush_dcache_page(tovec->bv_page); | ||
122 | } | 119 | } |
123 | } | 120 | } |
124 | 121 | ||
@@ -201,13 +198,14 @@ static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig, | |||
201 | { | 198 | { |
202 | struct bio *bio; | 199 | struct bio *bio; |
203 | int rw = bio_data_dir(*bio_orig); | 200 | int rw = bio_data_dir(*bio_orig); |
204 | struct bio_vec *to, *from; | 201 | struct bio_vec *to, from; |
202 | struct bvec_iter iter; | ||
205 | unsigned i; | 203 | unsigned i; |
206 | 204 | ||
207 | if (force) | 205 | if (force) |
208 | goto bounce; | 206 | goto bounce; |
209 | bio_for_each_segment(from, *bio_orig, i) | 207 | bio_for_each_segment(from, *bio_orig, iter) |
210 | if (page_to_pfn(from->bv_page) > queue_bounce_pfn(q)) | 208 | if (page_to_pfn(from.bv_page) > queue_bounce_pfn(q)) |
211 | goto bounce; | 209 | goto bounce; |
212 | 210 | ||
213 | return; | 211 | return; |
diff --git a/mm/page_io.c b/mm/page_io.c index 7247be6114ac..7c59ef681381 100644 --- a/mm/page_io.c +++ b/mm/page_io.c | |||
@@ -31,13 +31,13 @@ static struct bio *get_swap_bio(gfp_t gfp_flags, | |||
31 | 31 | ||
32 | bio = bio_alloc(gfp_flags, 1); | 32 | bio = bio_alloc(gfp_flags, 1); |
33 | if (bio) { | 33 | if (bio) { |
34 | bio->bi_sector = map_swap_page(page, &bio->bi_bdev); | 34 | bio->bi_iter.bi_sector = map_swap_page(page, &bio->bi_bdev); |
35 | bio->bi_sector <<= PAGE_SHIFT - 9; | 35 | bio->bi_iter.bi_sector <<= PAGE_SHIFT - 9; |
36 | bio->bi_io_vec[0].bv_page = page; | 36 | bio->bi_io_vec[0].bv_page = page; |
37 | bio->bi_io_vec[0].bv_len = PAGE_SIZE; | 37 | bio->bi_io_vec[0].bv_len = PAGE_SIZE; |
38 | bio->bi_io_vec[0].bv_offset = 0; | 38 | bio->bi_io_vec[0].bv_offset = 0; |
39 | bio->bi_vcnt = 1; | 39 | bio->bi_vcnt = 1; |
40 | bio->bi_size = PAGE_SIZE; | 40 | bio->bi_iter.bi_size = PAGE_SIZE; |
41 | bio->bi_end_io = end_io; | 41 | bio->bi_end_io = end_io; |
42 | } | 42 | } |
43 | return bio; | 43 | return bio; |
@@ -62,7 +62,7 @@ void end_swap_bio_write(struct bio *bio, int err) | |||
62 | printk(KERN_ALERT "Write-error on swap-device (%u:%u:%Lu)\n", | 62 | printk(KERN_ALERT "Write-error on swap-device (%u:%u:%Lu)\n", |
63 | imajor(bio->bi_bdev->bd_inode), | 63 | imajor(bio->bi_bdev->bd_inode), |
64 | iminor(bio->bi_bdev->bd_inode), | 64 | iminor(bio->bi_bdev->bd_inode), |
65 | (unsigned long long)bio->bi_sector); | 65 | (unsigned long long)bio->bi_iter.bi_sector); |
66 | ClearPageReclaim(page); | 66 | ClearPageReclaim(page); |
67 | } | 67 | } |
68 | end_page_writeback(page); | 68 | end_page_writeback(page); |
@@ -80,7 +80,7 @@ void end_swap_bio_read(struct bio *bio, int err) | |||
80 | printk(KERN_ALERT "Read-error on swap-device (%u:%u:%Lu)\n", | 80 | printk(KERN_ALERT "Read-error on swap-device (%u:%u:%Lu)\n", |
81 | imajor(bio->bi_bdev->bd_inode), | 81 | imajor(bio->bi_bdev->bd_inode), |
82 | iminor(bio->bi_bdev->bd_inode), | 82 | iminor(bio->bi_bdev->bd_inode), |
83 | (unsigned long long)bio->bi_sector); | 83 | (unsigned long long)bio->bi_iter.bi_sector); |
84 | goto out; | 84 | goto out; |
85 | } | 85 | } |
86 | 86 | ||