[Drbd-dev] DRBD-8 (My) first problem with new requests handling
code...
Graham, Simon
Simon.Graham at stratus.com
Mon Sep 11 00:58:32 CEST 2006
Got a pretty quick death running the latest trunk - I think it's this
code in the completed_ok case of _req_done:
bio_put(req->private_bio);
req->private_bio = NULL; <<=== Whoops!
dec_local(mdev);
if (bio_data_dir(req->private_bio) == WRITE) <<===
BANG!
mdev->writ_cnt += req->size>>9;
else
mdev->read_cnt += req->size>>9;
Presumably the bio_put and clear of req->private_bio should be after
testing the direction ;-)
BTW: It took me quite a while to find this from the panic -- it actually
crashed in drbd_endio_pri and the code generated for this is humungous
and unbelievably complicated (it's about 12KB!) -- I wonder if you are
trying to inline too much and it mightn't be better to have req_mod be a
non-inline function and also have each case be a separate real
function... I'd even suggest having _req_may_be_done() as a separate
function.
Simon
More information about the drbd-dev
mailing list