summaryrefslogtreecommitdiff
path: root/libbcache/blockdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcache/blockdev.c')
-rw-r--r--libbcache/blockdev.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/libbcache/blockdev.c b/libbcache/blockdev.c
index cd231f5..d3a373c 100644
--- a/libbcache/blockdev.c
+++ b/libbcache/blockdev.c
@@ -2,11 +2,12 @@
#include "bcache.h"
#include "blockdev.h"
#include "btree_iter.h"
+#include "btree_update.h"
#include "checksum.h"
#include "error.h"
#include "inode.h"
#include "request.h"
-#include "super.h"
+#include "super-io.h"
#include "writeback.h"
#include <linux/kthread.h>
@@ -42,15 +43,22 @@ void bch_write_bdev_super(struct cached_dev *dc, struct closure *parent)
down(&dc->sb_write_mutex);
closure_init(cl, parent);
+ sb->csum = csum_vstruct(NULL, BCH_CSUM_CRC64,
+ (struct nonce) { 0 }, sb).lo;
+
bio_reset(bio);
- bio->bi_end_io = write_bdev_super_endio;
- bio->bi_private = dc;
+ bio->bi_bdev = dc->disk_sb.bdev;
+ bio->bi_iter.bi_sector = le64_to_cpu(sb->offset);
+ bio->bi_iter.bi_size =
+ roundup(vstruct_bytes(sb),
+ bdev_logical_block_size(dc->disk_sb.bdev));
+ bio->bi_end_io = write_bdev_super_endio;
+ bio->bi_private = dc;
+ bio_set_op_attrs(bio, REQ_OP_WRITE, WRITE_FUA|REQ_META);
+ bch_bio_map(bio, sb);
closure_get(cl);
- sb->csum = cpu_to_le64(__csum_set(sb, 0, BCH_CSUM_CRC64));
- __write_super(dc->disk.c, (void *) &dc->disk_sb);
-
closure_return_with_destructor(cl, bch_write_bdev_super_unlock);
}
@@ -263,7 +271,7 @@ static void calc_cached_dev_sectors(struct cache_set *c)
void bch_cached_dev_run(struct cached_dev *dc)
{
struct bcache_device *d = &dc->disk;
- char buf[SB_LABEL_SIZE + 1];
+ char buf[BCH_SB_LABEL_SIZE + 1];
char *env[] = {
"DRIVER=bcache",
kasprintf(GFP_KERNEL, "CACHED_UUID=%pU",
@@ -272,8 +280,8 @@ void bch_cached_dev_run(struct cached_dev *dc)
NULL,
};
- memcpy(buf, dc->disk_sb.sb->label, SB_LABEL_SIZE);
- buf[SB_LABEL_SIZE] = '\0';
+ memcpy(buf, dc->disk_sb.sb->label, BCH_SB_LABEL_SIZE);
+ buf[BCH_SB_LABEL_SIZE] = '\0';
env[2] = kasprintf(GFP_KERNEL, "CACHED_LABEL=%s", buf);
if (atomic_xchg(&dc->running, 1)) {
@@ -370,8 +378,8 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c)
bdevname(dc->disk_sb.bdev, buf);
if (memcmp(&dc->disk_sb.sb->set_uuid,
- &c->disk_sb.set_uuid,
- sizeof(c->disk_sb.set_uuid)))
+ &c->sb.uuid,
+ sizeof(c->sb.uuid)))
return -ENOENT;
if (dc->disk.c) {
@@ -424,7 +432,7 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c)
SET_CACHED_DEV(&dc->disk.inode.v, true);
dc->disk.inode.v.i_uuid = dc->disk_sb.sb->disk_uuid;
memcpy(dc->disk.inode.v.i_label,
- dc->disk_sb.sb->label, SB_LABEL_SIZE);
+ dc->disk_sb.sb->label, BCH_SB_LABEL_SIZE);
dc->disk.inode.v.i_ctime = rtime;
dc->disk.inode.v.i_mtime = rtime;
@@ -438,14 +446,15 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c)
pr_info("attached inode %llu", bcache_dev_inum(&dc->disk));
- dc->disk_sb.sb->set_uuid = c->disk_sb.set_uuid;
+ dc->disk_sb.sb->set_uuid = c->sb.uuid;
SET_BDEV_STATE(dc->disk_sb.sb, BDEV_STATE_CLEAN);
bch_write_bdev_super(dc, &cl);
closure_sync(&cl);
} else {
dc->disk.inode.v.i_mtime = rtime;
- bch_inode_update(c, &dc->disk.inode.k_i, NULL);
+ bch_btree_update(c, BTREE_ID_INODES,
+ &dc->disk.inode.k_i, NULL);
}
/* Count dirty sectors before attaching */
@@ -479,7 +488,7 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c)
pr_info("Caching %s as %s on set %pU",
bdevname(dc->disk_sb.bdev, buf), dc->disk.disk->disk_name,
- dc->disk.c->disk_sb.set_uuid.b);
+ dc->disk.c->sb.uuid.b);
return 0;
}
@@ -517,7 +526,7 @@ static void cached_dev_free(struct closure *cl)
mutex_unlock(&bch_register_lock);
- free_super((void *) &dc->disk_sb);
+ bch_free_super((void *) &dc->disk_sb);
kobject_put(&dc->disk.kobj);
}