public inbox for linux-bcache@vger.kernel.org
 help / color / mirror / Atom feed
From: Gabriel <g2p.code-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 12:11:06 +0200	[thread overview]
Message-ID: <1365415866-16344-1-git-send-email-g2p.code+bcache@gmail.com> (raw)
In-Reply-To: <51629766.6030805-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

  parent reply	other threads:[~2013-04-08 10:11 UTC|newest]

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

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=1365415866-16344-1-git-send-email-g2p.code+bcache@gmail.com \
    --to=g2p.code-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox