mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-23 07:01:23 +00:00
block: move bio_alloc_pages() to bcache
bcache is the only user of bio_alloc_pages(), so move this function into bcache, and avoid it being misused in the future. Also rename it to bch_bio_allo_pages() since it is bcache only. Signed-off-by: Ming Lei <ming.lei@redhat.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
c2421edf5f
commit
25d8be77e1
9 changed files with 33 additions and 34 deletions
28
block/bio.c
28
block/bio.c
|
@ -968,34 +968,6 @@ void bio_advance(struct bio *bio, unsigned bytes)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(bio_advance);
|
EXPORT_SYMBOL(bio_advance);
|
||||||
|
|
||||||
/**
|
|
||||||
* bio_alloc_pages - allocates a single page for each bvec in a bio
|
|
||||||
* @bio: bio to allocate pages for
|
|
||||||
* @gfp_mask: flags for allocation
|
|
||||||
*
|
|
||||||
* Allocates pages up to @bio->bi_vcnt.
|
|
||||||
*
|
|
||||||
* Returns 0 on success, -ENOMEM on failure. On failure, any allocated pages are
|
|
||||||
* freed.
|
|
||||||
*/
|
|
||||||
int bio_alloc_pages(struct bio *bio, gfp_t gfp_mask)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
struct bio_vec *bv;
|
|
||||||
|
|
||||||
bio_for_each_segment_all(bv, bio, i) {
|
|
||||||
bv->bv_page = alloc_page(gfp_mask);
|
|
||||||
if (!bv->bv_page) {
|
|
||||||
while (--bv >= bio->bi_io_vec)
|
|
||||||
__free_page(bv->bv_page);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(bio_alloc_pages);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bio_copy_data - copy contents of data buffers from one chain of bios to
|
* bio_copy_data - copy contents of data buffers from one chain of bios to
|
||||||
* another
|
* another
|
||||||
|
|
|
@ -419,7 +419,7 @@ static void do_btree_node_write(struct btree *b)
|
||||||
SET_PTR_OFFSET(&k.key, 0, PTR_OFFSET(&k.key, 0) +
|
SET_PTR_OFFSET(&k.key, 0, PTR_OFFSET(&k.key, 0) +
|
||||||
bset_sector_offset(&b->keys, i));
|
bset_sector_offset(&b->keys, i));
|
||||||
|
|
||||||
if (!bio_alloc_pages(b->bio, __GFP_NOWARN|GFP_NOWAIT)) {
|
if (!bch_bio_alloc_pages(b->bio, __GFP_NOWARN|GFP_NOWAIT)) {
|
||||||
int j;
|
int j;
|
||||||
struct bio_vec *bv;
|
struct bio_vec *bv;
|
||||||
void *base = (void *) ((unsigned long) i & ~(PAGE_SIZE - 1));
|
void *base = (void *) ((unsigned long) i & ~(PAGE_SIZE - 1));
|
||||||
|
|
|
@ -116,7 +116,7 @@ void bch_data_verify(struct cached_dev *dc, struct bio *bio)
|
||||||
return;
|
return;
|
||||||
check->bi_opf = REQ_OP_READ;
|
check->bi_opf = REQ_OP_READ;
|
||||||
|
|
||||||
if (bio_alloc_pages(check, GFP_NOIO))
|
if (bch_bio_alloc_pages(check, GFP_NOIO))
|
||||||
goto out_put;
|
goto out_put;
|
||||||
|
|
||||||
submit_bio_wait(check);
|
submit_bio_wait(check);
|
||||||
|
|
|
@ -162,7 +162,7 @@ static void read_moving(struct cache_set *c)
|
||||||
bio_set_op_attrs(bio, REQ_OP_READ, 0);
|
bio_set_op_attrs(bio, REQ_OP_READ, 0);
|
||||||
bio->bi_end_io = read_moving_endio;
|
bio->bi_end_io = read_moving_endio;
|
||||||
|
|
||||||
if (bio_alloc_pages(bio, GFP_KERNEL))
|
if (bch_bio_alloc_pages(bio, GFP_KERNEL))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
trace_bcache_gc_copy(&w->key);
|
trace_bcache_gc_copy(&w->key);
|
||||||
|
|
|
@ -841,7 +841,7 @@ static int cached_dev_cache_miss(struct btree *b, struct search *s,
|
||||||
cache_bio->bi_private = &s->cl;
|
cache_bio->bi_private = &s->cl;
|
||||||
|
|
||||||
bch_bio_map(cache_bio, NULL);
|
bch_bio_map(cache_bio, NULL);
|
||||||
if (bio_alloc_pages(cache_bio, __GFP_NOWARN|GFP_NOIO))
|
if (bch_bio_alloc_pages(cache_bio, __GFP_NOWARN|GFP_NOIO))
|
||||||
goto out_put;
|
goto out_put;
|
||||||
|
|
||||||
if (reada)
|
if (reada)
|
||||||
|
|
|
@ -283,6 +283,33 @@ start: bv->bv_len = min_t(size_t, PAGE_SIZE - bv->bv_offset,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bch_bio_alloc_pages - allocates a single page for each bvec in a bio
|
||||||
|
* @bio: bio to allocate pages for
|
||||||
|
* @gfp_mask: flags for allocation
|
||||||
|
*
|
||||||
|
* Allocates pages up to @bio->bi_vcnt.
|
||||||
|
*
|
||||||
|
* Returns 0 on success, -ENOMEM on failure. On failure, any allocated pages are
|
||||||
|
* freed.
|
||||||
|
*/
|
||||||
|
int bch_bio_alloc_pages(struct bio *bio, gfp_t gfp_mask)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct bio_vec *bv;
|
||||||
|
|
||||||
|
bio_for_each_segment_all(bv, bio, i) {
|
||||||
|
bv->bv_page = alloc_page(gfp_mask);
|
||||||
|
if (!bv->bv_page) {
|
||||||
|
while (--bv >= bio->bi_io_vec)
|
||||||
|
__free_page(bv->bv_page);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group (Any
|
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group (Any
|
||||||
* use permitted, subject to terms of PostgreSQL license; see.)
|
* use permitted, subject to terms of PostgreSQL license; see.)
|
||||||
|
|
|
@ -558,6 +558,7 @@ static inline unsigned fract_exp_two(unsigned x, unsigned fract_bits)
|
||||||
}
|
}
|
||||||
|
|
||||||
void bch_bio_map(struct bio *bio, void *base);
|
void bch_bio_map(struct bio *bio, void *base);
|
||||||
|
int bch_bio_alloc_pages(struct bio *bio, gfp_t gfp_mask);
|
||||||
|
|
||||||
static inline sector_t bdev_sectors(struct block_device *bdev)
|
static inline sector_t bdev_sectors(struct block_device *bdev)
|
||||||
{
|
{
|
||||||
|
|
|
@ -278,7 +278,7 @@ static void read_dirty(struct cached_dev *dc)
|
||||||
bio_set_dev(&io->bio, PTR_CACHE(dc->disk.c, &w->key, 0)->bdev);
|
bio_set_dev(&io->bio, PTR_CACHE(dc->disk.c, &w->key, 0)->bdev);
|
||||||
io->bio.bi_end_io = read_dirty_endio;
|
io->bio.bi_end_io = read_dirty_endio;
|
||||||
|
|
||||||
if (bio_alloc_pages(&io->bio, GFP_KERNEL))
|
if (bch_bio_alloc_pages(&io->bio, GFP_KERNEL))
|
||||||
goto err_free;
|
goto err_free;
|
||||||
|
|
||||||
trace_bcache_writeback(&w->key);
|
trace_bcache_writeback(&w->key);
|
||||||
|
|
|
@ -500,7 +500,6 @@ static inline void bio_flush_dcache_pages(struct bio *bi)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void bio_copy_data(struct bio *dst, struct bio *src);
|
extern void bio_copy_data(struct bio *dst, struct bio *src);
|
||||||
extern int bio_alloc_pages(struct bio *bio, gfp_t gfp);
|
|
||||||
extern void bio_free_pages(struct bio *bio);
|
extern void bio_free_pages(struct bio *bio);
|
||||||
|
|
||||||
extern struct bio *bio_copy_user_iov(struct request_queue *,
|
extern struct bio *bio_copy_user_iov(struct request_queue *,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue