diff options
author | Christoph Hellwig <hch@lst.de> | 2020-06-27 09:31:48 +0200 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-06-29 09:09:08 -0600 |
commit | d92c370a16cbe0276954c761b874bd024a7e4fac (patch) | |
tree | 2617a86f8d5aba36e3413b52dc7d932707840db2 /block/bio.c | |
parent | db9819c76c1fd48c30699381c94bba5c95dd467e (diff) | |
download | linux-d92c370a16cbe0276954c761b874bd024a7e4fac.tar.bz2 |
block: really clone the block cgroup in bio_clone_blkg_association
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>
Diffstat (limited to 'block/bio.c')
-rw-r--r-- | block/bio.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/block/bio.c b/block/bio.c index 8aef4460b32e..e1d01acce807 100644 --- a/block/bio.c +++ b/block/bio.c @@ -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 */ |