All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gabriel <g2p.code+bcache-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Kent Overstreet
	<koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>,
	linux-bcache-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: Gabriel <g2p.code+bcache-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Subject: [PATCH] bcache: Take data offset from the bdev superblock.
Date: Mon,  8 Apr 2013 10:51:51 +0200	[thread overview]
Message-ID: <1365411111-29262-1-git-send-email-g2p.code+bcache@gmail.com> (raw)
In-Reply-To: <516284B1.7060307-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

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

WARNING: multiple messages have this Message-ID (diff)
From: Gabriel <g2p.code+bcache@gmail.com>
To: Kent Overstreet <koverstreet@google.com>,
	linux-bcache@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Gabriel <g2p.code+bcache@gmail.com>
Subject: [PATCH] bcache: Take data offset from the bdev superblock.
Date: Mon,  8 Apr 2013 10:51:51 +0200	[thread overview]
Message-ID: <1365411111-29262-1-git-send-email-g2p.code+bcache@gmail.com> (raw)
In-Reply-To: <516284B1.7060307@gmail.com>

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


  parent reply	other threads:[~2013-04-08  8:51 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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   ` Gabriel [this message]
2013-04-08  8:51     ` [PATCH] bcache: Take data offset from the bdev superblock Gabriel
  -- strict thread matches above, loose matches on Subject: below --
2013-04-08 10:09 [Pull request] bcache data offset Gabriel de Perthuis
     [not found] ` <51629766.6030805-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-04-08 10:11   ` [PATCH] bcache: Take data offset from the bdev superblock Gabriel
2013-04-08 10:11     ` Gabriel
     [not found]     ` <1365415866-16344-1-git-send-email-g2p.code+bcache-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-04-08 20:49       ` Kent Overstreet
2013-04-08 20:49         ` Kent Overstreet
2013-04-08 21:23         ` Gabriel
     [not found]           ` <5163356F.50406-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-04-08 21:44             ` Gabriel de Perthuis
2013-04-08 21:44               ` Gabriel de Perthuis

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=1365411111-29262-1-git-send-email-g2p.code+bcache@gmail.com \
    --to=g2p.code+bcache-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
    --cc=linux-bcache-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    /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 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.