mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-07 22:42:04 +00:00
mtd_blkdevs: handle highmem pages
Just kmap the single payload page before passing it on to the FTL. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
7c2d748e84
commit
34ab96e6c5
@ -82,7 +82,6 @@ static blk_status_t do_blktrans_request(struct mtd_blktrans_ops *tr,
|
||||
|
||||
block = blk_rq_pos(req) << 9 >> tr->blkshift;
|
||||
nsect = blk_rq_cur_bytes(req) >> tr->blkshift;
|
||||
buf = bio_data(req->bio);
|
||||
|
||||
if (req_op(req) == REQ_OP_FLUSH) {
|
||||
if (tr->flush(dev))
|
||||
@ -100,9 +99,14 @@ static blk_status_t do_blktrans_request(struct mtd_blktrans_ops *tr,
|
||||
return BLK_STS_IOERR;
|
||||
return BLK_STS_OK;
|
||||
case REQ_OP_READ:
|
||||
for (; nsect > 0; nsect--, block++, buf += tr->blksize)
|
||||
if (tr->readsect(dev, block, buf))
|
||||
buf = kmap(bio_page(req->bio)) + bio_offset(req->bio);
|
||||
for (; nsect > 0; nsect--, block++, buf += tr->blksize) {
|
||||
if (tr->readsect(dev, block, buf)) {
|
||||
kunmap(bio_page(req->bio));
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
}
|
||||
kunmap(bio_page(req->bio));
|
||||
rq_flush_dcache_pages(req);
|
||||
return BLK_STS_OK;
|
||||
case REQ_OP_WRITE:
|
||||
@ -110,9 +114,14 @@ static blk_status_t do_blktrans_request(struct mtd_blktrans_ops *tr,
|
||||
return BLK_STS_IOERR;
|
||||
|
||||
rq_flush_dcache_pages(req);
|
||||
for (; nsect > 0; nsect--, block++, buf += tr->blksize)
|
||||
if (tr->writesect(dev, block, buf))
|
||||
buf = kmap(bio_page(req->bio)) + bio_offset(req->bio);
|
||||
for (; nsect > 0; nsect--, block++, buf += tr->blksize) {
|
||||
if (tr->writesect(dev, block, buf)) {
|
||||
kunmap(bio_page(req->bio));
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
}
|
||||
kunmap(bio_page(req->bio));
|
||||
return BLK_STS_OK;
|
||||
default:
|
||||
return BLK_STS_IOERR;
|
||||
@ -418,7 +427,6 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
|
||||
new->rq->queuedata = new;
|
||||
blk_queue_logical_block_size(new->rq, tr->blksize);
|
||||
|
||||
blk_queue_bounce_limit(new->rq, BLK_BOUNCE_HIGH);
|
||||
blk_queue_flag_set(QUEUE_FLAG_NONROT, new->rq);
|
||||
blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, new->rq);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user