diff options
author | Kent Overstreet <kmo@daterainc.com> | 2013-11-11 21:20:51 -0500 |
---|---|---|
committer | Kent Overstreet <kmo@daterainc.com> | 2014-01-08 16:05:11 -0500 |
commit | 085d2a3dd4d65b7bce1dead987c647dbbc014281 (patch) | |
tree | 89cfb6a71e0c4ea7ae4ff8eb4c148b75a9f14128 /drivers/md/bcache/request.c | |
parent | 9a02b7eeeb446a0418ec83afc80eb38bc188f5c8 (diff) |
bcache: Make bch_keylist_realloc() take u64s, not nptrs
Getting away from KEY_PTRS and moving toward KEY_U64s - and getting rid of magic
2s
Also - split out the part that checks against journal entry size so as to avoid
a dependancy on struct cache_set in bset.c
Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Diffstat (limited to 'drivers/md/bcache/request.c')
-rw-r--r-- | drivers/md/bcache/request.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index cce02f19e6c7..fcdb59f9ca91 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c | |||
@@ -255,6 +255,24 @@ static void bch_data_insert_keys(struct closure *cl) | |||
255 | closure_return(cl); | 255 | closure_return(cl); |
256 | } | 256 | } |
257 | 257 | ||
258 | static int bch_keylist_realloc(struct keylist *l, unsigned u64s, | ||
259 | struct cache_set *c) | ||
260 | { | ||
261 | size_t oldsize = bch_keylist_nkeys(l); | ||
262 | size_t newsize = oldsize + u64s; | ||
263 | |||
264 | /* | ||
265 | * The journalling code doesn't handle the case where the keys to insert | ||
266 | * is bigger than an empty write: If we just return -ENOMEM here, | ||
267 | * bio_insert() and bio_invalidate() will insert the keys created so far | ||
268 | * and finish the rest when the keylist is empty. | ||
269 | */ | ||
270 | if (newsize * sizeof(uint64_t) > block_bytes(c) - sizeof(struct jset)) | ||
271 | return -ENOMEM; | ||
272 | |||
273 | return __bch_keylist_realloc(l, u64s); | ||
274 | } | ||
275 | |||
258 | static void bch_data_invalidate(struct closure *cl) | 276 | static void bch_data_invalidate(struct closure *cl) |
259 | { | 277 | { |
260 | struct data_insert_op *op = container_of(cl, struct data_insert_op, cl); | 278 | struct data_insert_op *op = container_of(cl, struct data_insert_op, cl); |
@@ -267,7 +285,7 @@ static void bch_data_invalidate(struct closure *cl) | |||
267 | unsigned sectors = min(bio_sectors(bio), | 285 | unsigned sectors = min(bio_sectors(bio), |
268 | 1U << (KEY_SIZE_BITS - 1)); | 286 | 1U << (KEY_SIZE_BITS - 1)); |
269 | 287 | ||
270 | if (bch_keylist_realloc(&op->insert_keys, 0, op->c)) | 288 | if (bch_keylist_realloc(&op->insert_keys, 2, op->c)) |
271 | goto out; | 289 | goto out; |
272 | 290 | ||
273 | bio->bi_iter.bi_sector += sectors; | 291 | bio->bi_iter.bi_sector += sectors; |
@@ -357,7 +375,7 @@ static void bch_data_insert_start(struct closure *cl) | |||
357 | 375 | ||
358 | /* 1 for the device pointer and 1 for the chksum */ | 376 | /* 1 for the device pointer and 1 for the chksum */ |
359 | if (bch_keylist_realloc(&op->insert_keys, | 377 | if (bch_keylist_realloc(&op->insert_keys, |
360 | 1 + (op->csum ? 1 : 0), | 378 | 3 + (op->csum ? 1 : 0), |
361 | op->c)) | 379 | op->c)) |
362 | continue_at(cl, bch_data_insert_keys, bcache_wq); | 380 | continue_at(cl, bch_data_insert_keys, bcache_wq); |
363 | 381 | ||