* [Pull request] bcache data offset
@ 2013-04-08 8:49 Gabriel de Perthuis
[not found] ` <516284B1.7060307-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
0 siblings, 1 reply; 5+ messages in thread
From: Gabriel de Perthuis @ 2013-04-08 8:49 UTC (permalink / raw)
To: Kent Overstreet, linux-bcache, linux-kernel
Hello,
These patches update the bcache superblock format so that backing device
data can be at an arbitrary offset from the start of the backing device;
this helps convert partitions or logical volumes to bcache in-place, and
<https://github.com/g2p/blocks> has been updated to use the new format.
The kernel half is on top of bcache-for-upstream, the bcache-tools half
is on top of the development version of bcache-tools.
They can be pulled from
- https://github.com/g2p/linux/tree/bcache-for-upstream
- https://github.com/g2p/bcache-tools/tree/enable-data-offset
^ permalink raw reply [flat|nested] 5+ messages in thread[parent not found: <516284B1.7060307-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* [PATCH] bcache: Take data offset from the bdev superblock. 2013-04-08 8:49 [Pull request] bcache data offset Gabriel de Perthuis @ 2013-04-08 8:51 ` Gabriel 0 siblings, 0 replies; 5+ messages in thread From: Gabriel @ 2013-04-08 8:51 UTC (permalink / raw) To: Kent Overstreet, linux-bcache-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA Cc: Gabriel Add a new superblock version, and consolidate related defines. Signed-off-by: Gabriel de Perthuis <g2p.code+bcache-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> --- drivers/md/bcache/bcache.h | 23 ++++++++++++++++++----- drivers/md/bcache/request.c | 2 +- drivers/md/bcache/super.c | 21 ++++++++++++++++----- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h index f057235..8a110e6 100644 --- a/drivers/md/bcache/bcache.h +++ b/drivers/md/bcache/bcache.h @@ -223,11 +223,17 @@ struct bkey { #define BKEY_PADDED(key) \ union { struct bkey key; uint64_t key ## _pad[BKEY_PAD]; } -/* Version 1: Backing device +/* Version 0: Cache device + * Version 1: Backing device * Version 2: Seed pointer into btree node checksum - * Version 3: New UUID format + * Version 3: Cache device with new UUID format + * Version 4: Backing device with data offset */ -#define BCACHE_SB_VERSION 3 +#define BCACHE_SB_VERSION_CDEV 0 +#define BCACHE_SB_VERSION_BDEV 1 +#define BCACHE_SB_VERSION_CDEV_WITH_UUID 3 +#define BCACHE_SB_VERSION_BDEV_WITH_OFFSET 4 +#define BCACHE_SB_MAX_VERSION 4 #define SB_SECTOR 8 #define SB_SIZE 4096 @@ -236,13 +242,12 @@ struct bkey { /* SB_JOURNAL_BUCKETS must be divisible by BITS_PER_LONG */ #define MAX_CACHES_PER_SET 8 -#define BDEV_DATA_START 16 /* sectors */ +#define BDEV_DATA_START_DEFAULT 16 /* sectors */ struct cache_sb { uint64_t csum; uint64_t offset; /* sector where this sb was written */ uint64_t version; -#define CACHE_BACKING_DEV 1 uint8_t magic[16]; @@ -485,6 +490,7 @@ struct cached_dev { * where it's at. */ sector_t last_read; + sector_t data_start_sector; /* Number of writeback bios in flight */ atomic_t in_flight; @@ -861,6 +867,13 @@ static inline bool key_merging_disabled(struct cache_set *c) #endif } + +static inline bool SB_IS_BDEV(const struct cache_sb *sb) { + return sb->version == BCACHE_SB_VERSION_BDEV + || sb->version == BCACHE_SB_VERSION_BDEV_WITH_OFFSET; +} + + struct bbio { unsigned submit_time_us; union { diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index 83731dc..9f74aff 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c @@ -1220,7 +1220,7 @@ static void cached_dev_make_request(struct request_queue *q, struct bio *bio) part_stat_unlock(); bio->bi_bdev = dc->bdev; - bio->bi_sector += BDEV_DATA_START; + bio->bi_sector += dc->data_start_sector; if (cached_dev_get(dc)) { s = search_alloc(bio, d); diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 5fa3cd2..a409bb5 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -148,7 +148,7 @@ static const char *read_super(struct cache_sb *sb, struct block_device *bdev, goto err; err = "Unsupported superblock version"; - if (sb->version > BCACHE_SB_VERSION) + if (sb->version > BCACHE_SB_MAX_VERSION) goto err; err = "Bad block/bucket size"; @@ -168,7 +168,7 @@ static const char *read_super(struct cache_sb *sb, struct block_device *bdev, if (get_capacity(bdev->bd_disk) < sb->bucket_size * sb->nbuckets) goto err; - if (sb->version == CACHE_BACKING_DEV) + if (SB_IS_BDEV(sb)) goto out; err = "Bad UUID"; @@ -286,7 +286,7 @@ void bcache_write_super(struct cache_set *c) for_each_cache(ca, c, i) { struct bio *bio = &ca->sb_bio; - ca->sb.version = BCACHE_SB_VERSION; + ca->sb.version = BCACHE_SB_VERSION_CDEV_WITH_UUID; ca->sb.seq = c->sb.seq; ca->sb.last_mount = c->sb.last_mount; @@ -1047,9 +1047,20 @@ static const char *register_bdev(struct cache_sb *sb, struct page *sb_page, dc->bdev = bdev; dc->bdev->bd_holder = dc; + err = "bad start sector"; + if (sb->version == BCACHE_SB_VERSION_BDEV) { + dc->data_start_sector = BDEV_DATA_START_DEFAULT; + } else { + if (sb->keys < 1) + goto err; + dc->data_start_sector = sb->d[0]; + if (dc->data_start_sector < BDEV_DATA_START_DEFAULT) + goto err; + } + g = dc->disk.disk; - set_capacity(g, dc->bdev->bd_part->nr_sects - 16); + set_capacity(g, dc->bdev->bd_part->nr_sects - dc->data_start_sector); bch_cached_dev_request_init(dc); @@ -1802,7 +1813,7 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, if (err) goto err_close; - if (sb->version == CACHE_BACKING_DEV) { + if (SB_IS_BDEV(sb)) { struct cached_dev *dc = kzalloc(sizeof(*dc), GFP_KERNEL); err = register_bdev(sb, sb_page, bdev, dc); -- 1.8.2.rc3.7.g35aca0e ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH] bcache: Take data offset from the bdev superblock. @ 2013-04-08 8:51 ` Gabriel 0 siblings, 0 replies; 5+ messages in thread From: Gabriel @ 2013-04-08 8:51 UTC (permalink / raw) To: Kent Overstreet, linux-bcache, linux-kernel; +Cc: Gabriel Add a new superblock version, and consolidate related defines. Signed-off-by: Gabriel de Perthuis <g2p.code+bcache@gmail.com> --- drivers/md/bcache/bcache.h | 23 ++++++++++++++++++----- drivers/md/bcache/request.c | 2 +- drivers/md/bcache/super.c | 21 ++++++++++++++++----- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h index f057235..8a110e6 100644 --- a/drivers/md/bcache/bcache.h +++ b/drivers/md/bcache/bcache.h @@ -223,11 +223,17 @@ struct bkey { #define BKEY_PADDED(key) \ union { struct bkey key; uint64_t key ## _pad[BKEY_PAD]; } -/* Version 1: Backing device +/* Version 0: Cache device + * Version 1: Backing device * Version 2: Seed pointer into btree node checksum - * Version 3: New UUID format + * Version 3: Cache device with new UUID format + * Version 4: Backing device with data offset */ -#define BCACHE_SB_VERSION 3 +#define BCACHE_SB_VERSION_CDEV 0 +#define BCACHE_SB_VERSION_BDEV 1 +#define BCACHE_SB_VERSION_CDEV_WITH_UUID 3 +#define BCACHE_SB_VERSION_BDEV_WITH_OFFSET 4 +#define BCACHE_SB_MAX_VERSION 4 #define SB_SECTOR 8 #define SB_SIZE 4096 @@ -236,13 +242,12 @@ struct bkey { /* SB_JOURNAL_BUCKETS must be divisible by BITS_PER_LONG */ #define MAX_CACHES_PER_SET 8 -#define BDEV_DATA_START 16 /* sectors */ +#define BDEV_DATA_START_DEFAULT 16 /* sectors */ struct cache_sb { uint64_t csum; uint64_t offset; /* sector where this sb was written */ uint64_t version; -#define CACHE_BACKING_DEV 1 uint8_t magic[16]; @@ -485,6 +490,7 @@ struct cached_dev { * where it's at. */ sector_t last_read; + sector_t data_start_sector; /* Number of writeback bios in flight */ atomic_t in_flight; @@ -861,6 +867,13 @@ static inline bool key_merging_disabled(struct cache_set *c) #endif } + +static inline bool SB_IS_BDEV(const struct cache_sb *sb) { + return sb->version == BCACHE_SB_VERSION_BDEV + || sb->version == BCACHE_SB_VERSION_BDEV_WITH_OFFSET; +} + + struct bbio { unsigned submit_time_us; union { diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index 83731dc..9f74aff 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c @@ -1220,7 +1220,7 @@ static void cached_dev_make_request(struct request_queue *q, struct bio *bio) part_stat_unlock(); bio->bi_bdev = dc->bdev; - bio->bi_sector += BDEV_DATA_START; + bio->bi_sector += dc->data_start_sector; if (cached_dev_get(dc)) { s = search_alloc(bio, d); diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 5fa3cd2..a409bb5 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -148,7 +148,7 @@ static const char *read_super(struct cache_sb *sb, struct block_device *bdev, goto err; err = "Unsupported superblock version"; - if (sb->version > BCACHE_SB_VERSION) + if (sb->version > BCACHE_SB_MAX_VERSION) goto err; err = "Bad block/bucket size"; @@ -168,7 +168,7 @@ static const char *read_super(struct cache_sb *sb, struct block_device *bdev, if (get_capacity(bdev->bd_disk) < sb->bucket_size * sb->nbuckets) goto err; - if (sb->version == CACHE_BACKING_DEV) + if (SB_IS_BDEV(sb)) goto out; err = "Bad UUID"; @@ -286,7 +286,7 @@ void bcache_write_super(struct cache_set *c) for_each_cache(ca, c, i) { struct bio *bio = &ca->sb_bio; - ca->sb.version = BCACHE_SB_VERSION; + ca->sb.version = BCACHE_SB_VERSION_CDEV_WITH_UUID; ca->sb.seq = c->sb.seq; ca->sb.last_mount = c->sb.last_mount; @@ -1047,9 +1047,20 @@ static const char *register_bdev(struct cache_sb *sb, struct page *sb_page, dc->bdev = bdev; dc->bdev->bd_holder = dc; + err = "bad start sector"; + if (sb->version == BCACHE_SB_VERSION_BDEV) { + dc->data_start_sector = BDEV_DATA_START_DEFAULT; + } else { + if (sb->keys < 1) + goto err; + dc->data_start_sector = sb->d[0]; + if (dc->data_start_sector < BDEV_DATA_START_DEFAULT) + goto err; + } + g = dc->disk.disk; - set_capacity(g, dc->bdev->bd_part->nr_sects - 16); + set_capacity(g, dc->bdev->bd_part->nr_sects - dc->data_start_sector); bch_cached_dev_request_init(dc); @@ -1802,7 +1813,7 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, if (err) goto err_close; - if (sb->version == CACHE_BACKING_DEV) { + if (SB_IS_BDEV(sb)) { struct cached_dev *dc = kzalloc(sizeof(*dc), GFP_KERNEL); err = register_bdev(sb, sb_page, bdev, dc); -- 1.8.2.rc3.7.g35aca0e ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Pull request] bcache data offset @ 2013-04-08 10:09 ` Gabriel de Perthuis 0 siblings, 0 replies; 5+ messages in thread From: Gabriel de Perthuis @ 2013-04-08 10:09 UTC (permalink / raw) To: Kent Overstreet, linux-bcache-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA Hello, These patches update the bcache superblock format so that backing device data can be at an arbitrary offset from the start of the backing device; this helps convert partitions or logical volumes to bcache in-place, and <https://github.com/g2p/blocks> has been updated to use the new format. The kernel half is on top of bcache-for-upstream, the bcache-tools half is on top of the development version of bcache-tools. They can be pulled from - https://github.com/g2p/linux/tree/bcache-for-upstream - https://github.com/g2p/bcache-tools/tree/enable-data-offset ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Pull request] bcache data offset @ 2013-04-08 10:09 ` Gabriel de Perthuis 0 siblings, 0 replies; 5+ messages in thread From: Gabriel de Perthuis @ 2013-04-08 10:09 UTC (permalink / raw) To: Kent Overstreet, linux-bcache, linux-kernel Hello, These patches update the bcache superblock format so that backing device data can be at an arbitrary offset from the start of the backing device; this helps convert partitions or logical volumes to bcache in-place, and <https://github.com/g2p/blocks> has been updated to use the new format. The kernel half is on top of bcache-for-upstream, the bcache-tools half is on top of the development version of bcache-tools. They can be pulled from - https://github.com/g2p/linux/tree/bcache-for-upstream - https://github.com/g2p/bcache-tools/tree/enable-data-offset ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-04-08 10:09 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-08 8:49 [Pull request] bcache data offset Gabriel de Perthuis
[not found] ` <516284B1.7060307-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-04-08 8:51 ` [PATCH] bcache: Take data offset from the bdev superblock Gabriel
2013-04-08 8:51 ` Gabriel
-- strict thread matches above, loose matches on Subject: below --
2013-04-08 10:09 [Pull request] bcache data offset Gabriel de Perthuis
2013-04-08 10:09 ` Gabriel de Perthuis
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.