From: Andrew Morton <akpm@linux-foundation.org>
To: David Woodhouse <dwmw2@infradead.org>
Cc: Ric Wheeler <ricwheeler@gmail.com>,
linux-fsdevel@vger.kernel.org, axboe@kernel.dk,
gilad@codefidence.com
Subject: Re: [RFC] 'discard sectors' block request.
Date: Mon, 4 Aug 2008 18:59:00 -0700 [thread overview]
Message-ID: <20080804185900.210d1630.akpm@linux-foundation.org> (raw)
In-Reply-To: <1217900716.3454.667.camel@pmac.infradead.org>
On Tue, 05 Aug 2008 02:45:16 +0100 David Woodhouse <dwmw2@infradead.org> wrote:
> On Sat, 2008-07-26 at 13:02 -0700, Andrew Morton wrote:
> > I seem to be hearing a lot of silence over support for SSD devices. I
> > have this vague worry that there will be a large rollout of SSD
> > hardware and Linux will be found to have pants-around-ankles.
> >
> > For example, support for the T13 Trim command. There will be others,
> > but I surely don't know what they are.
>
> Here's a first attempt at that. It implements basic support for
> 'discard' requests in the block layer, implements that in FTL (the flash
> translation layer used on PCMCIA flash cards), and in FAT.
Looks nice and simple.
>
> ...
>
> +int blkdev_issue_discard(struct block_device *bdev, sector_t sector,
> + unsigned nr_sects, sector_t *error_sector)
> +{
> + DECLARE_COMPLETION_ONSTACK(wait);
> + struct request_queue *q;
> + struct bio *bio;
> + int ret;
> +
> + if (bdev->bd_disk == NULL)
> + return -ENXIO;
> +
> + q = bdev_get_queue(bdev);
> + if (!q)
> + return -ENXIO;
> +
> + bio = bio_alloc(GFP_KERNEL, 0);
> + if (!bio)
> + return -ENOMEM;
> +
> + bio->bi_end_io = bio_end_empty_barrier;
> + bio->bi_private = &wait;
> + bio->bi_bdev = bdev;
> + bio->bi_sector = sector;
> + bio->bi_size = nr_sects << 9;
> + submit_bio(1 << BIO_RW_DISCARD, bio);
> +
> + wait_for_completion(&wait);
The synchronous nature might get pretty painful, even after merging is
working?
err, actually, it'll have to become async to be able to merge, won't it?
> + /*
> + * The driver must store the error location in ->bi_sector, if
> + * it supports it. For non-stacked drivers, this should be copied
> + * from rq->sector.
> + */
> + if (error_sector)
> + *error_sector = bio->bi_sector;
> +
> + ret = 0;
> + if (bio_flagged(bio, BIO_EOPNOTSUPP))
> + ret = -EOPNOTSUPP;
> + else if (!bio_flagged(bio, BIO_UPTODATE))
> + ret = -EIO;
> +
> + bio_put(bio);
> + return ret;
> +}
> +EXPORT_SYMBOL(blkdev_issue_discard);
>
> ...
>
> @@ -1411,6 +1421,10 @@ end_io:
> err = -EOPNOTSUPP;
> goto end_io;
> }
> + if (bio_discard(bio) && !q->discard_fn) {
> + err = -EOPNOTSUPP;
> + goto end_io;
> + }
>
> ret = q->make_request_fn(q, bio);
> } while (ret);
> @@ -1488,7 +1502,7 @@ void submit_bio(int rw, struct bio *bio)
> * If it's a regular read/write or a barrier with data attached,
> * go through the normal accounting stuff before submission.
> */
> - if (!bio_empty_barrier(bio)) {
> + if (!bio_empty_barrier(bio) && !bio_discard(bio)) {
Perhaps we should have a new bio_doesnt_have_any_data_in_it() helper,
rather than opn-coding it here? Assuming that new non-data-containing
bios will turn up in the future.
>
> BIO_BUG_ON(!bio->bi_size);
> BIO_BUG_ON(!bio->bi_io_vec);
> @@ -1562,13 +1576,12 @@ static int __end_that_request_first(struct request *req, int error,
> int nbytes;
>
> /*
> - * For an empty barrier request, the low level driver must
> - * store a potential error location in ->sector. We pass
> - * that back up in ->bi_sector.
> + * For an empty barrier request or sector discard request, the
> + * low level driver must store a potential error location in
> + * ->sector. We pass that back up in ->bi_sector.
> */
> - if (blk_empty_barrier(req))
> + if (blk_empty_barrier(req) || blk_discard_rq(req))
Maybe ditto.
> bio->bi_sector = req->sector;
> -
> if (nr_bytes >= bio->bi_size) {
> req->bio = bio->bi_next;
> nbytes = bio->bi_size;
>
> ...
>
>
> +static int ftl_discardsect(struct mtd_blktrans_dev *dev,
> + unsigned long sector, unsigned nr_sects)
> +{
> + partition_t *part = (void *)dev;
wuh? We're casting a `struct mtd_blktrans_ops *' into a partition_t?
next prev parent reply other threads:[~2008-08-05 1:59 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <488B7281.4020007@gmail.com>
[not found] ` <20080726130200.f541e604.akpm@linux-foundation.org>
2008-08-05 1:45 ` [RFC] 'discard sectors' block request David Woodhouse
2008-08-05 1:59 ` Andrew Morton [this message]
2008-08-05 9:01 ` David Woodhouse
2008-08-05 11:42 ` Jens Axboe
2008-08-05 13:32 ` David Woodhouse
2008-08-05 14:21 ` Ric Wheeler
2008-08-05 16:29 ` David Woodhouse
2008-08-05 17:25 ` David Woodhouse
2008-08-06 9:25 ` [PATCH 1/5] [BLOCK] Add 'discard' request handling David Woodhouse
2008-08-06 16:19 ` OGAWA Hirofumi
2008-08-06 18:18 ` David Woodhouse
2008-08-06 19:28 ` OGAWA Hirofumi
2008-08-07 16:32 ` [PATCH 1/5, v2] " David Woodhouse
2008-08-07 18:41 ` [PATCH 1/5] " Jens Axboe
2008-08-08 9:33 ` David Woodhouse
2008-08-08 10:30 ` Jens Axboe
2008-08-08 10:49 ` Jens Axboe
2008-08-08 11:04 ` David Woodhouse
2008-08-08 11:20 ` Jens Axboe
2008-08-08 10:52 ` David Woodhouse
2008-08-08 11:09 ` Jens Axboe
2008-08-08 11:18 ` Jens Axboe
2008-08-08 11:29 ` David Woodhouse
2008-08-08 11:44 ` Jens Axboe
2008-08-08 11:47 ` Jens Axboe
2008-08-08 12:05 ` David Woodhouse
2008-08-08 12:13 ` Jens Axboe
2008-08-08 12:32 ` David Woodhouse
2008-08-08 12:37 ` Jens Axboe
2008-08-08 12:49 ` David Woodhouse
2008-08-10 1:05 ` Jamie Lokier
2008-08-08 15:32 ` David Woodhouse
2008-08-08 14:22 ` Matthew Wilcox
2008-08-08 14:27 ` David Woodhouse
2008-08-08 14:34 ` Matthew Wilcox
2008-08-06 9:25 ` [PATCH 2/5] [FAT] Let the block device know when sectors can be discarded David Woodhouse
2008-08-06 16:40 ` OGAWA Hirofumi
2008-08-06 17:14 ` OGAWA Hirofumi
2008-08-06 18:11 ` David Woodhouse
2008-08-06 19:10 ` OGAWA Hirofumi
2008-08-06 19:50 ` OGAWA Hirofumi
2008-08-06 20:10 ` OGAWA Hirofumi
2008-08-06 21:37 ` David Woodhouse
2008-08-07 16:09 ` David Woodhouse
2008-08-07 16:33 ` [PATCH 2/5, v2] " David Woodhouse
2008-08-06 9:25 ` [PATCH 3/5] [MTD] Support 'discard sectors' operation in translation layer support core David Woodhouse
2008-08-06 9:25 ` [PATCH 4/5] [MTD] [FTL] Support 'discard sectors' operation David Woodhouse
2008-08-06 9:25 ` [PATCH 5/5] [BLOCK] Fix up comments about matching flags between bio and rq David Woodhouse
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080804185900.210d1630.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=axboe@kernel.dk \
--cc=dwmw2@infradead.org \
--cc=gilad@codefidence.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=ricwheeler@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).