Message ID | 20240525185622.3896616-1-linan666@huaweicloud.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | md: make md_flush_request() more readable | expand |
On Sun, May 26, 2024 at 02:56:22AM +0800, linan666@huaweicloud.com wrote: > - bio = NULL; > - } > - spin_unlock_irq(&mddev->lock); > - > - if (!bio) { > + spin_unlock_irq(&mddev->lock); > INIT_WORK(&mddev->flush_work, submit_flushes); > queue_work(md_wq, &mddev->flush_work); > } else { > /* flush was performed for some other bio while we waited. */ > + spin_unlock_irq(&mddev->lock); > if (bio->bi_iter.bi_size == 0) > /* an empty barrier - all done */ This stil looks like a somwwhat odd flow Why not go all the way and turn it into: ... queue_work(md_wq, &mddev->flush_work); return true; } /* flush was performed for some other bio while we waited. */ spin_unlock_irq(&mddev->lock); if (bio->bi_iter.bi_size == 0) { /* pure flush without data - all done */ bio_endio(bio); return true; } bio->bi_opf &= ~REQ_PREFLUSH; return false; }
在 2024/5/26 16:54, Christoph Hellwig 写道: > On Sun, May 26, 2024 at 02:56:22AM +0800, linan666@huaweicloud.com wrote: >> - bio = NULL; >> - } >> - spin_unlock_irq(&mddev->lock); >> - >> - if (!bio) { >> + spin_unlock_irq(&mddev->lock); >> INIT_WORK(&mddev->flush_work, submit_flushes); >> queue_work(md_wq, &mddev->flush_work); >> } else { >> /* flush was performed for some other bio while we waited. */ >> + spin_unlock_irq(&mddev->lock); >> if (bio->bi_iter.bi_size == 0) >> /* an empty barrier - all done */ > > This stil looks like a somwwhat odd flow Why not go all the way > and turn it into: > > > ... > queue_work(md_wq, &mddev->flush_work); > return true; > } > > /* flush was performed for some other bio while we waited. */ > spin_unlock_irq(&mddev->lock); > if (bio->bi_iter.bi_size == 0) { > /* pure flush without data - all done */ > bio_endio(bio); > return true; > } > bio->bi_opf &= ~REQ_PREFLUSH; > return false; > } Yeah, it looks better. I will changed it in v2. Thansk for your suggestion.
diff --git a/drivers/md/md.c b/drivers/md/md.c index aff9118ff697..509e5638cea1 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -654,15 +654,12 @@ bool md_flush_request(struct mddev *mddev, struct bio *bio) WARN_ON(percpu_ref_is_zero(&mddev->active_io)); percpu_ref_get(&mddev->active_io); mddev->flush_bio = bio; - bio = NULL; - } - spin_unlock_irq(&mddev->lock); - - if (!bio) { + spin_unlock_irq(&mddev->lock); INIT_WORK(&mddev->flush_work, submit_flushes); queue_work(md_wq, &mddev->flush_work); } else { /* flush was performed for some other bio while we waited. */ + spin_unlock_irq(&mddev->lock); if (bio->bi_iter.bi_size == 0) /* an empty barrier - all done */ bio_endio(bio);