[dm-devel] [RFC PATCH 2/2] dm: add support for splitting discard requests
Christoph Hellwig
hch at lst.de
Sun Jun 27 09:47:00 UTC 2010
On Sat, Jun 26, 2010 at 04:31:25PM -0400, Mike Snitzer wrote:
> Enable the striped target to support discard requests by splitting a
> single discard into N discards on a stripe chunk size boundary.
>
> Follow on core block layer work to merge discards would be helpful.
>
> This work relies on DM's clone_bio() always having BIO_RW_BARRIER set
> for discard requests. Without BIO_RW_BARRIER the block layer will spew
> "blk: request botched" warnings for discards that were split by DM.
> - this clearly needs further investigation!
Btw, you can get discard requests from the upper layer that do not
have BIO_RW_BARRIER set, currently from the BLKDISCARD ioctl used by
various mkfs tools, and also from the not yet merged xfs discard
support.
Can I assume it works fine with those?
> - clone->bi_rw &= ~(1 << BIO_RW_BARRIER);
> + if (!bio_rw_flagged(bio, BIO_RW_DISCARD))
> + clone->bi_rw &= ~(1 << BIO_RW_BARRIER);
> + else if (!bio_rw_flagged(bio, BIO_RW_BARRIER)) {
> + /* discard w/o barrier results in "blk: request botched" */
> + clone->bi_rw |= (1 << BIO_RW_BARRIER);
> + }
So previously we unconditionally cleared the BIO_RW_BARRIER bit in the clone.
Maybe to make it cleared reorder the if a bit and also just set the
barrier bit unconditionally for discards, similar to how we
unconditionally clear it otherwise:
if (bio_rw_flagged(bio, BIO_RW_DISCARD)) {
/* discard w/o barrier results in "blk: request botched" */
clone->bi_rw |= (1 << BIO_RW_BARRIER);
} else {
clone->bi_rw &= ~(1 << BIO_RW_BARRIER);
}
maybe even with a slightly longer comment explaining what's actually
going on here, and a FIXME.
More information about the dm-devel
mailing list