bfq: Update cgroup information before merging bio
commitea591cd4eb
upstream. When the process is migrated to a different cgroup (or in case of writeback just starts submitting bios associated with a different cgroup) bfq_merge_bio() can operate with stale cgroup information in bic. Thus the bio can be merged to a request from a different cgroup or it can result in merging of bfqqs for different cgroups or bfqqs of already dead cgroups and causing possible use-after-free issues. Fix the problem by updating cgroup information in bfq_merge_bio(). CC: stable@vger.kernel.org Fixes:e21b7a0b98
("block, bfq: add full hierarchical scheduling and cgroups support") Tested-by: "yukuai (C)" <yukuai3@huawei.com> Signed-off-by: Jan Kara <jack@suse.cz> Reviewed-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20220401102752.8599-4-jack@suse.cz Signed-off-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
81b7d0c717
Коммит
e8821f4561
|
@ -2335,10 +2335,17 @@ static bool bfq_bio_merge(struct request_queue *q, struct bio *bio,
|
|||
|
||||
spin_lock_irq(&bfqd->lock);
|
||||
|
||||
if (bic)
|
||||
if (bic) {
|
||||
/*
|
||||
* Make sure cgroup info is uptodate for current process before
|
||||
* considering the merge.
|
||||
*/
|
||||
bfq_bic_update_cgroup(bic, bio);
|
||||
|
||||
bfqd->bio_bfqq = bic_to_bfqq(bic, op_is_sync(bio->bi_opf));
|
||||
else
|
||||
} else {
|
||||
bfqd->bio_bfqq = NULL;
|
||||
}
|
||||
bfqd->bio_bic = bic;
|
||||
|
||||
ret = blk_mq_sched_try_merge(q, bio, nr_segs, &free);
|
||||
|
|
Загрузка…
Ссылка в новой задаче