David Woodhouse <dwmw2@xxxxxxxxxxxxx> writes: > Some block devices benefit from a hint that they can forget the contents > of certain sectors. Add basic support for this to the block core, along > with a 'blkdev_issue_discard()' helper function which issues such > requests. > > Although blkdev_issue_discard() can take an end_io function, it's > acceptable to leave that as NULL and in that case the allocated bio will > be automatically freed. Most of the time, it's expected that callers > won't care about when, or even _if_, the request completes. It's only a > hint to the device anyway. By definition, the file system doesn't _care_ > about these sectors any more. Looks like good start. Thanks. Although I'm not quite sure it helps, is there any plan to merge bios? > +int blkdev_issue_discard(struct block_device *bdev, sector_t sector, > + unsigned nr_sects, bio_end_io_t end_io) > +{ > + struct request_queue *q; [...] > + > + bio->bi_end_io = end_io; > + bio->bi_bdev = bdev; > + bio->bi_sector = sector; > + bio->bi_size = nr_sects << 9; > + submit_bio(1 << BIO_RW_DISCARD, bio); > + return 0; > +} If fs merges contiguous blocks to one bio, bi_size will overflow. Will we have to limit (of the device?) and separate for the device? Or how about to have #define for discard bio for BIO_RW_DISCARD users? > @@ -185,10 +188,16 @@ struct bio { > #define bio_failfast(bio) ((bio)->bi_rw & (1 << BIO_RW_FAILFAST)) > #define bio_rw_ahead(bio) ((bio)->bi_rw & (1 << BIO_RW_AHEAD)) > #define bio_rw_meta(bio) ((bio)->bi_rw & (1 << BIO_RW_META)) > +#define bio_discard(bio) ((bio)->bi_rw & (1 << BIO_RW_DISCARD)) > #define bio_empty_barrier(bio) (bio_barrier(bio) && !(bio)->bi_size) > > +#define bio_dataless(bio) (!(bio)->bi_io_vec) The following seems good to convert to bio_dataless? Signed-off-by: OGAWA Hirofumi <hirofumi@xxxxxxxxxxxxxxxxxx> --- mm/bounce.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff -puN mm/bounce.c~test mm/bounce.c --- linux-2.6/mm/bounce.c~test 2008-08-07 00:04:26.000000000 +0900 +++ linux-2.6-hirofumi/mm/bounce.c 2008-08-07 00:04:57.000000000 +0900 @@ -267,7 +267,7 @@ void blk_queue_bounce(struct request_que /* * Data-less bio, nothing to bounce */ - if (bio_empty_barrier(*bio_orig)) + if (bio_dataless(*bio_orig)) { return; /* _ -- OGAWA Hirofumi <hirofumi@xxxxxxxxxxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html