diff options
author | Kent Overstreet <kmo@daterainc.com> | 2015-02-11 14:20:12 -0800 |
---|---|---|
committer | Kent Overstreet <kmo@daterainc.com> | 2015-02-12 23:44:11 -0800 |
commit | d49160a317281562f2c64f4c46455e222feb1e70 (patch) | |
tree | 7e0cf762ef026a29e643b335e00bc63b91dea945 /drivers/md/bcache/bkey.c | |
parent | b354cf6ccab5f9934e88b8c2f91b47e2152f84b2 (diff) |
bcache: Validate bkey formatbcache-dev-february
Change-Id: Ie30284518f55388925da92e7e0c4e13e77f54a90
Diffstat (limited to 'drivers/md/bcache/bkey.c')
-rw-r--r-- | drivers/md/bcache/bkey.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/md/bcache/bkey.c b/drivers/md/bcache/bkey.c index ab3a034f407a..b60a2481f92e 100644 --- a/drivers/md/bcache/bkey.c +++ b/drivers/md/bcache/bkey.c @@ -296,6 +296,26 @@ struct bkey_format bch_bkey_format_done(struct bkey_format_state *s) return ret; } +const char *bch_bkey_format_validate(struct bkey_format *f) +{ + unsigned i, bits = KEY_PACKED_BITS_START; + + if (f->nr_fields != BKEY_NR_FIELDS) + return "invalid format: incorrect number of fields"; + + for (i = 0; i < f->nr_fields; i++) { + if (f->bits_per_field[i] > 64) + return "invalid format: field too large"; + + bits += f->bits_per_field[i]; + } + + if (f->key_u64s != DIV_ROUND_UP(bits, 64)) + return "invalid format: incorrect key_u64s"; + + return NULL; +} + /* Most significant differing bit */ unsigned bkey_greatest_differing_bit(const struct bkey_format *format, const struct bkey_packed *l_k, |