block: really clone the block cgroup in bio_clone_blkg_association
authorChristoph Hellwig <hch@lst.de>
Sat, 27 Jun 2020 07:31:48 +0000 (09:31 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 29 Jun 2020 15:09:08 +0000 (09:09 -0600)
bio_clone_blkg_association is supposed to clone the associatation, but
actually ends up doing a search with a tryget.  As we know we have a
reference on the source cgroup just get an unconditional additional
reference to it and call it a day.  That also removes the need for
a RCU critical section.

Acked-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bio.c

index 8aef446..e1d01ac 100644 (file)
@@ -1737,12 +1737,12 @@ EXPORT_SYMBOL_GPL(bio_associate_blkg);
  */
 void bio_clone_blkg_association(struct bio *dst, struct bio *src)
 {
-       rcu_read_lock();
-
-       if (src->bi_blkg)
-               __bio_associate_blkg(dst, src->bi_blkg);
-
-       rcu_read_unlock();
+       if (src->bi_blkg) {
+               if (dst->bi_blkg)
+                       blkg_put(dst->bi_blkg);
+               blkg_get(src->bi_blkg);
+               dst->bi_blkg = src->bi_blkg;
+       }
 }
 EXPORT_SYMBOL_GPL(bio_clone_blkg_association);
 #endif /* CONFIG_BLK_CGROUP */