From dac6a0d559271be959ba2fbf10693e1fce36a7c6 Mon Sep 17 00:00:00 2001 From: Bruce Evans Date: Sun, 9 Dec 2018 15:34:20 +0000 Subject: [PATCH] Fix devstat on md devices. devstat_end_transaction() was called before the i/o was actually ended (by delivering it to GEOM), so at least the i/o length was messed up. It was always recorded as 0, so the average transaction size and the average transfer rate was always displayed as 0. devstat_end_transaction() was not called at all for the error case, so there were sometimes multiple starts per end. I didn't observe this in practice and don't know if it did much damage. I think it extended the length of the i/o to the next transaction. Reviewed by: kib --- sys/dev/md/md.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c index 2209c6680be..de5cde68a7d 100644 --- a/sys/dev/md/md.c +++ b/sys/dev/md/md.c @@ -1241,10 +1241,10 @@ md_kthread(void *arg) if (error != -1) { bp->bio_completed = bp->bio_length; - if ((bp->bio_cmd == BIO_READ) || (bp->bio_cmd == BIO_WRITE)) - devstat_end_transaction_bio(sc->devstat, bp); g_io_deliver(bp, error); } + if (bp->bio_cmd == BIO_READ || bp->bio_cmd == BIO_WRITE) + devstat_end_transaction_bio(sc->devstat, bp); } }