summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2016-01-21 10:04:44 -0900
committerKent Overstreet <kent.overstreet@gmail.com>2016-10-07 12:35:21 -0800
commitb654418b2eb907ad97578d9d21fa6f9db2724597 (patch)
tree73aa2af63f663d22308fd81ed094301a815bbf20
parent38ba3c88c89c4faba95454d8faa5ce681290b147 (diff)
bcache: simplify/fix bch_inode_blockdev
-rw-r--r--drivers/md/bcache/bkey.h9
-rw-r--r--drivers/md/bcache/blockdev.c25
-rw-r--r--drivers/md/bcache/inode.c5
-rw-r--r--drivers/md/bcache/sysfs.c6
-rw-r--r--drivers/md/bcache/writeback.c2
-rw-r--r--include/uapi/linux/bcache.h11
6 files changed, 29 insertions, 29 deletions
diff --git a/drivers/md/bcache/bkey.h b/drivers/md/bcache/bkey.h
index 3f9796287cbb..afe3fa930a20 100644
--- a/drivers/md/bcache/bkey.h
+++ b/drivers/md/bcache/bkey.h
@@ -497,14 +497,7 @@ static inline void __bch_extent_assert(u8 type, u8 nr)
__BKEY_VAL_ACCESSORS(extent, BCH_EXTENT, __bch_extent_assert);
BKEY_VAL_ACCESSORS(inode, BCH_INODE_FS);
-
-static inline void __bch_inode_blockdev_assert(u8 type, u8 nr)
-{
- EBUG_ON(type != BCH_INODE_BLOCKDEV && type != BCH_INODE_CACHED_DEV);
-}
-
-__BKEY_VAL_ACCESSORS(inode_blockdev, BCH_INODE_BLOCKDEV,
- __bch_inode_blockdev_assert);
+BKEY_VAL_ACCESSORS(inode_blockdev, BCH_INODE_BLOCKDEV);
BKEY_VAL_ACCESSORS(dirent, BCH_DIRENT);
diff --git a/drivers/md/bcache/blockdev.c b/drivers/md/bcache/blockdev.c
index 3cf6b15ce1fc..3bb7e642509d 100644
--- a/drivers/md/bcache/blockdev.c
+++ b/drivers/md/bcache/blockdev.c
@@ -361,8 +361,7 @@ void bch_cached_dev_detach(struct cached_dev *dc)
int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c)
{
- struct timespec ts = CURRENT_TIME;
- __le64 rtime = cpu_to_le64(timespec_to_ns(&ts));
+ __le64 rtime = cpu_to_le64(ktime_get_seconds());
char buf[BDEVNAME_SIZE];
bool found;
int ret;
@@ -420,12 +419,13 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c)
closure_init_stack(&cl);
bkey_inode_blockdev_init(&dc->disk.inode.k_i);
- dc->disk.inode.k.type = BCH_INODE_CACHED_DEV;
+ dc->disk.inode.k.type = BCH_INODE_BLOCKDEV;
+ 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.inode.v.i_inode.i_ctime = rtime;
- dc->disk.inode.v.i_inode.i_mtime = rtime;
+ dc->disk.inode.v.i_ctime = rtime;
+ dc->disk.inode.v.i_mtime = rtime;
ret = bch_inode_create(c, &dc->disk.inode.k_i,
0, BLOCKDEV_INODE_MAX,
@@ -443,7 +443,7 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c)
bch_write_bdev_super(dc, &cl);
closure_sync(&cl);
} else {
- dc->disk.inode.v.i_inode.i_mtime = rtime;
+ dc->disk.inode.v.i_mtime = rtime;
bch_inode_update(c, &dc->disk.inode.k_i, NULL);
}
@@ -706,7 +706,7 @@ static int blockdev_volume_run(struct cache_set *c,
kobject_init(&d->kobj, &bch_blockdev_volume_ktype);
ret = bcache_device_init(d, block_bytes(c),
- le64_to_cpu(inode.v->i_inode.i_size) >> 9);
+ le64_to_cpu(inode.v->i_size) >> 9);
if (ret)
goto err;
@@ -758,16 +758,15 @@ int bch_blockdev_volumes_start(struct cache_set *c)
int bch_blockdev_volume_create(struct cache_set *c, u64 size)
{
- struct timespec ts = CURRENT_TIME;
- __le64 rtime = cpu_to_le64(timespec_to_ns(&ts));
+ __le64 rtime = cpu_to_le64(ktime_get_seconds());
struct bkey_i_inode_blockdev inode;
int ret;
bkey_inode_blockdev_init(&inode.k_i);
get_random_bytes(&inode.v.i_uuid, sizeof(inode.v.i_uuid));
- inode.v.i_inode.i_ctime = rtime;
- inode.v.i_inode.i_mtime = rtime;
- inode.v.i_inode.i_size = cpu_to_le64(size);
+ inode.v.i_ctime = rtime;
+ inode.v.i_mtime = rtime;
+ inode.v.i_size = cpu_to_le64(size);
ret = bch_inode_create(c, &inode.k_i, 0, BLOCKDEV_INODE_MAX,
&c->unused_inode_hint);
@@ -792,7 +791,7 @@ void bch_blockdevs_stop(struct cache_set *c)
radix_tree_for_each_slot(slot, &c->devices, &iter, 0) {
d = radix_tree_deref_slot(slot);
- if (d->inode.k.type == BCH_INODE_CACHED_DEV &&
+ if (CACHED_DEV(&d->inode.v) &&
test_bit(CACHE_SET_UNREGISTERING, &c->flags)) {
dc = container_of(d, struct cached_dev, disk);
bch_cached_dev_detach(dc);
diff --git a/drivers/md/bcache/inode.c b/drivers/md/bcache/inode.c
index aa5bfa76e423..88ed75560560 100644
--- a/drivers/md/bcache/inode.c
+++ b/drivers/md/bcache/inode.c
@@ -244,7 +244,7 @@ int bch_cached_dev_inode_find_by_uuid(struct cache_set *c, uuid_le *uuid,
if (k.k->p.inode >= BLOCKDEV_INODE_MAX)
break;
- if (k.k->type == BCH_INODE_CACHED_DEV) {
+ if (k.k->type == BCH_INODE_BLOCKDEV) {
struct bkey_s_c_inode_blockdev inode =
bkey_s_c_to_inode_blockdev(k);
@@ -252,7 +252,8 @@ int bch_cached_dev_inode_find_by_uuid(struct cache_set *c, uuid_le *uuid,
inode.k->p.inode, inode.v->i_uuid.b,
inode.k->u64s);
- if (!memcmp(uuid, &inode.v->i_uuid, 16)) {
+ if (CACHED_DEV(inode.v) &&
+ !memcmp(uuid, &inode.v->i_uuid, 16)) {
bkey_reassemble(&ret->k_i, k);
bch_btree_iter_unlock(&iter);
return 0;
diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c
index b7a44c522ac1..b7b075eeca28 100644
--- a/drivers/md/bcache/sysfs.c
+++ b/drivers/md/bcache/sysfs.c
@@ -390,7 +390,7 @@ SHOW(bch_blockdev_volume)
struct bcache_device *d = container_of(kobj, struct bcache_device,
kobj);
- sysfs_hprint(size, le64_to_cpu(d->inode.v.i_inode.i_size));
+ sysfs_hprint(size, le64_to_cpu(d->inode.v.i_size));
if (attr == &sysfs_label) {
memcpy(buf, d->inode.v.i_label, SB_LABEL_SIZE);
@@ -414,7 +414,7 @@ STORE(__bch_blockdev_volume)
mutex_lock(&d->inode_lock);
- if (v < le64_to_cpu(d->inode.v.i_inode.i_size) ){
+ if (v < le64_to_cpu(d->inode.v.i_size) ){
ret = bch_inode_truncate(d->c, d->inode.k.p.inode,
v >> 9, NULL);
if (ret) {
@@ -422,7 +422,7 @@ STORE(__bch_blockdev_volume)
return ret;
}
}
- d->inode.v.i_inode.i_size = cpu_to_le64(v);
+ d->inode.v.i_size = cpu_to_le64(v);
ret = bch_inode_update(d->c, &d->inode.k_i, &journal_seq);
mutex_unlock(&d->inode_lock);
diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c
index 784c665060fc..e066c6df89e3 100644
--- a/drivers/md/bcache/writeback.c
+++ b/drivers/md/bcache/writeback.c
@@ -514,7 +514,7 @@ void bch_writeback_recalc_oldest_gens(struct cache_set *c)
d = radix_tree_deref_slot(slot);
- if (d->inode.k.type != BCH_INODE_CACHED_DEV)
+ if (!CACHED_DEV(&d->inode.v))
continue;
dc = container_of(d, struct cached_dev, disk);
diff --git a/include/uapi/linux/bcache.h b/include/uapi/linux/bcache.h
index f75edb1edf38..0cf12fcb38de 100644
--- a/include/uapi/linux/bcache.h
+++ b/include/uapi/linux/bcache.h
@@ -461,7 +461,6 @@ BKEY_VAL_TYPE(extent, BCH_EXTENT);
enum bch_inode_types {
BCH_INODE_FS = 128,
BCH_INODE_BLOCKDEV = 129,
- BCH_INODE_CACHED_DEV = 130,
};
enum {
@@ -513,13 +512,21 @@ BKEY_VAL_TYPE(inode, BCH_INODE_FS);
struct bch_inode_blockdev {
struct bch_val v;
- struct bch_inode i_inode;
+
+ __le64 i_size;
+ __le64 i_flags;
+
+ /* Seconds: */
+ __le64 i_ctime;
+ __le64 i_mtime;
uuid_le i_uuid;
__u8 i_label[32];
} __attribute__((packed, aligned(8)));
BKEY_VAL_TYPE(inode_blockdev, BCH_INODE_BLOCKDEV);
+/* Thin provisioned volume, or cache for another block device? */
+LE64_BITMASK(CACHED_DEV, struct bch_inode_blockdev, i_flags, 0, 1)
/* Dirents */
/*