aboutsummaryrefslogtreecommitdiff
path: root/block
diff options
context:
space:
mode:
authorSteven Rostedt (VMware) <rostedt@goodmis.org>2018-01-05 16:11:18 -0500
committerSteven Rostedt (VMware) <rostedt@goodmis.org>2018-01-05 16:11:18 -0500
commit8ade59cf632c5a2bdb75d2edd69158c6562df957 (patch)
tree25e4cd3b31a7e8aeae2b5503f5ad647a008807bf /block
parentc67d7eb7dc4b55ea9028810e31c9dffeba679242 (diff)
parent4231b6a98fceb1589f13e886c26130d2fd4e3901 (diff)
Merge tag 'v4.4.106' into v4.4-rt
This is the 4.4.106 stable release
Diffstat (limited to 'block')
-rw-r--r--block/bio.c14
-rw-r--r--block/blk-core.c4
2 files changed, 11 insertions, 7 deletions
diff --git a/block/bio.c b/block/bio.c
index 68bbc835bacc..63363a689922 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -1268,6 +1268,7 @@ struct bio *bio_map_user_iov(struct request_queue *q,
int ret, offset;
struct iov_iter i;
struct iovec iov;
+ struct bio_vec *bvec;
iov_for_each(iov, i, *iter) {
unsigned long uaddr = (unsigned long) iov.iov_base;
@@ -1312,7 +1313,12 @@ struct bio *bio_map_user_iov(struct request_queue *q,
ret = get_user_pages_fast(uaddr, local_nr_pages,
(iter->type & WRITE) != WRITE,
&pages[cur_page]);
- if (ret < local_nr_pages) {
+ if (unlikely(ret < local_nr_pages)) {
+ for (j = cur_page; j < page_limit; j++) {
+ if (!pages[j])
+ break;
+ put_page(pages[j]);
+ }
ret = -EFAULT;
goto out_unmap;
}
@@ -1374,10 +1380,8 @@ struct bio *bio_map_user_iov(struct request_queue *q,
return bio;
out_unmap:
- for (j = 0; j < nr_pages; j++) {
- if (!pages[j])
- break;
- page_cache_release(pages[j]);
+ bio_for_each_segment_all(bvec, bio, j) {
+ put_page(bvec->bv_page);
}
out:
kfree(pages);
diff --git a/block/blk-core.c b/block/blk-core.c
index a9395a02a564..75a76bcc7ac0 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -529,8 +529,8 @@ void blk_set_queue_dying(struct request_queue *q)
blk_queue_for_each_rl(rl, q) {
if (rl->rq_pool) {
- wake_up(&rl->wait[BLK_RW_SYNC]);
- wake_up(&rl->wait[BLK_RW_ASYNC]);
+ wake_up_all(&rl->wait[BLK_RW_SYNC]);
+ wake_up_all(&rl->wait[BLK_RW_ASYNC]);
}
}
}