]> git.baikalelectronics.ru Git - kernel.git/commit
dm: don't reuse bio for flushes
authorJens Axboe <axboe@kernel.dk>
Wed, 19 Dec 2018 16:13:34 +0000 (09:13 -0700)
committerJens Axboe <axboe@kernel.dk>
Wed, 19 Dec 2018 16:13:34 +0000 (09:13 -0700)
commit370ef6fe95489ebcb9ba52bc2e02d134608bc4fe
tree380a25d45315b9d1d6fbf2695f09010b34013975
parent3706a19fe658f40939915a9938a62bb4cdb118ca
dm: don't reuse bio for flushes

DM currently has a statically allocated bio that it uses to issue empty
flushes. It doesn't submit this bio, it just uses it for maintaining
state while setting up clones. Multiple users can access this bio at the
same time. This wasn't previously an issue, even if it was a bit iffy,
but with the blkg associations it can become one.

We setup the blkg association, then clone bio's and submit, then remove
the blkg assocation again. But since we can have multiple tasks doing
this at the same time, against multiple blkg's, then we can either lose
references to a blkg, or put it twice. The latter causes complaints on
the percpu ref being <= 0 when released, and can cause use-after-free as
well. Ming reports that xfstest generic/475 triggers this:

------------[ cut here ]------------
percpu ref (blkg_release) <= 0 (0) after switching to atomic
WARNING: CPU: 13 PID: 0 at lib/percpu-refcount.c:155 percpu_ref_switch_to_atomic_rcu+0x2c9/0x4a0

Switch to just using an on-stack bio for this, and get rid of the
embedded bio.

Fixes: b35e2b714b3c ("blkcg: associate blkg when associating a device")
Reported-by: Ming Lei <ming.lei@redhat.com>
Tested-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/md/dm-core.h
drivers/md/dm.c