aboutsummaryrefslogtreecommitdiffstats
path: root/block/bio.c
diff options
context:
space:
mode:
authorDennis Zhou <dennis@kernel.org>2018-10-20 14:56:12 -0400
committerJens Axboe <axboe@kernel.dk>2018-10-20 15:39:55 -0600
commitd459d853c2edc793135e4bfa4e345c758f1cc859 (patch)
treebef29425e5ddb78a788cca764e926b4f5601f473 /block/bio.c
parentblkcg: fix edge case for blk_get_rl() under memory pressure (diff)
downloadlinux-dev-d459d853c2edc793135e4bfa4e345c758f1cc859.tar.xz
linux-dev-d459d853c2edc793135e4bfa4e345c758f1cc859.zip
blkcg: reassociate bios when make_request() is called recursively
When submitting a bio, multiple recursive calls to make_request() may occur. This causes the initial associate done in blkcg_bio_issue_check() to be incorrect and reference the prior request_queue. This introduces a helper to do reassociation when make_request() is recursively called. Fixes: a7b39b4e961c ("blkcg: always associate a bio with a blkg") Reported-by: Valdis Kletnieks <valdis.kletnieks@vt.edu> Signed-off-by: Dennis Zhou <dennis@kernel.org> Tested-by: Valdis Kletnieks <valdis.kletnieks@vt.edu> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/bio.c')
-rw-r--r--block/bio.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/block/bio.c b/block/bio.c
index 17a8b0aa7050..bbfeb4ee2892 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -2084,6 +2084,26 @@ int bio_associate_create_blkg(struct request_queue *q, struct bio *bio)
}
/**
+ * bio_reassociate_blkg - reassociate a bio with a blkg from q
+ * @q: request_queue where bio is going
+ * @bio: target bio
+ *
+ * When submitting a bio, multiple recursive calls to make_request() may occur.
+ * This causes the initial associate done in blkcg_bio_issue_check() to be
+ * incorrect and reference the prior request_queue. This performs reassociation
+ * when this situation happens.
+ */
+int bio_reassociate_blkg(struct request_queue *q, struct bio *bio)
+{
+ if (bio->bi_blkg) {
+ blkg_put(bio->bi_blkg);
+ bio->bi_blkg = NULL;
+ }
+
+ return bio_associate_create_blkg(q, bio);
+}
+
+/**
* bio_disassociate_task - undo bio_associate_current()
* @bio: target bio
*/