Skip to content

Commit

Permalink
bcache: store a pointer to the on-disk sb in the cache and cached_dev…
Browse files Browse the repository at this point in the history
… structures

This allows to properly build the superblock bio including the offset in
the page using the normal bio helpers.  This fixes writing the superblock
for page sizes larger than 4k where the sb write bio would need an offset
in the bio_vec.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Coly Li <colyli@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
Christoph Hellwig authored and Jens Axboe committed Jan 23, 2020
1 parent cfa0c56 commit 475389a
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 19 deletions.
2 changes: 2 additions & 0 deletions drivers/md/bcache/bcache.h
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,7 @@ struct cached_dev {
struct block_device *bdev;

struct cache_sb sb;
struct cache_sb_disk *sb_disk;
struct bio sb_bio;
struct bio_vec sb_bv[1];
struct closure sb_write;
Expand Down Expand Up @@ -403,6 +404,7 @@ enum alloc_reserve {
struct cache {
struct cache_set *set;
struct cache_sb sb;
struct cache_sb_disk *sb_disk;
struct bio sb_bio;
struct bio_vec sb_bv[1];

Expand Down
34 changes: 15 additions & 19 deletions drivers/md/bcache/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -207,15 +207,15 @@ static void write_bdev_super_endio(struct bio *bio)
closure_put(&dc->sb_write);
}

static void __write_super(struct cache_sb *sb, struct bio *bio)
static void __write_super(struct cache_sb *sb, struct cache_sb_disk *out,
struct bio *bio)
{
struct cache_sb_disk *out = page_address(bio_first_page_all(bio));
unsigned int i;

bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_META;
bio->bi_iter.bi_sector = SB_SECTOR;
bio->bi_iter.bi_size = SB_SIZE;
bio_set_op_attrs(bio, REQ_OP_WRITE, REQ_SYNC|REQ_META);
bch_bio_map(bio, NULL);
__bio_add_page(bio, virt_to_page(out), SB_SIZE,
offset_in_page(out));

out->offset = cpu_to_le64(sb->offset);
out->version = cpu_to_le64(sb->version);
Expand Down Expand Up @@ -257,14 +257,14 @@ void bch_write_bdev_super(struct cached_dev *dc, struct closure *parent)
down(&dc->sb_write_mutex);
closure_init(cl, parent);

bio_reset(bio);
bio_init(bio, dc->sb_bv, 1);
bio_set_dev(bio, dc->bdev);
bio->bi_end_io = write_bdev_super_endio;
bio->bi_private = dc;

closure_get(cl);
/* I/O request sent to backing device */
__write_super(&dc->sb, bio);
__write_super(&dc->sb, dc->sb_disk, bio);

closure_return_with_destructor(cl, bch_write_bdev_super_unlock);
}
Expand Down Expand Up @@ -306,13 +306,13 @@ void bcache_write_super(struct cache_set *c)

SET_CACHE_SYNC(&ca->sb, CACHE_SYNC(&c->sb));

bio_reset(bio);
bio_init(bio, ca->sb_bv, 1);
bio_set_dev(bio, ca->bdev);
bio->bi_end_io = write_super_endio;
bio->bi_private = ca;

closure_get(cl);
__write_super(&ca->sb, bio);
__write_super(&ca->sb, ca->sb_disk, bio);
}

closure_return_with_destructor(cl, bcache_write_super_unlock);
Expand Down Expand Up @@ -1275,8 +1275,8 @@ static void cached_dev_free(struct closure *cl)

mutex_unlock(&bch_register_lock);

if (dc->sb_bio.bi_inline_vecs[0].bv_page)
put_page(bio_first_page_all(&dc->sb_bio));
if (dc->sb_disk)
put_page(virt_to_page(dc->sb_disk));

if (!IS_ERR_OR_NULL(dc->bdev))
blkdev_put(dc->bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);
Expand Down Expand Up @@ -1365,9 +1365,7 @@ static int register_bdev(struct cache_sb *sb, struct cache_sb_disk *sb_disk,
memcpy(&dc->sb, sb, sizeof(struct cache_sb));
dc->bdev = bdev;
dc->bdev->bd_holder = dc;

bio_init(&dc->sb_bio, dc->sb_bio.bi_inline_vecs, 1);
bio_first_bvec_all(&dc->sb_bio)->bv_page = virt_to_page(sb_disk);
dc->sb_disk = sb_disk;

if (cached_dev_init(dc, sb->block_size << 9))
goto err;
Expand Down Expand Up @@ -2137,8 +2135,8 @@ void bch_cache_release(struct kobject *kobj)
for (i = 0; i < RESERVE_NR; i++)
free_fifo(&ca->free[i]);

if (ca->sb_bio.bi_inline_vecs[0].bv_page)
put_page(bio_first_page_all(&ca->sb_bio));
if (ca->sb_disk)
put_page(virt_to_page(ca->sb_disk));

if (!IS_ERR_OR_NULL(ca->bdev))
blkdev_put(ca->bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);
Expand Down Expand Up @@ -2270,9 +2268,7 @@ static int register_cache(struct cache_sb *sb, struct cache_sb_disk *sb_disk,
memcpy(&ca->sb, sb, sizeof(struct cache_sb));
ca->bdev = bdev;
ca->bdev->bd_holder = ca;

bio_init(&ca->sb_bio, ca->sb_bio.bi_inline_vecs, 1);
bio_first_bvec_all(&ca->sb_bio)->bv_page = virt_to_page(sb_disk);
ca->sb_disk = sb_disk;

if (blk_queue_discard(bdev_get_queue(bdev)))
ca->discard = CACHE_DISCARD(&ca->sb);
Expand Down

0 comments on commit 475389a

Please sign in to comment.