[dm-devel] About function bio_detain in file dm-cache-target.c
majianpeng
majianpeng at gmail.com
Tue Mar 12 07:47:28 UTC 2013
Hi all,
I think bio_detain(in dm-cache-target.c) may cause some bug.
>static int bio_detain(struct cache *cache, dm_oblock_t oblock,
> struct bio *bio, struct dm_bio_prison_cell *cell_prealloc,
> cell_free_fn free_fn, void *free_context,
> struct dm_bio_prison_cell **cell_result)
>{
> int r;
> struct dm_cell_key key;
> build_key(oblock, &key);
> r = dm_bio_detain(cache->prison, &key, bio, cell_prealloc, cell_result);
> if (r)
> free_fn(free_context, cell_prealloc);
> return r;
>}
If the returned value of dm_bio_detain is not zero, it indicated cell existing.So it should defer bio.
But in dm_bio_detain-->bio_detain--->__bio->detain
> cell = __search_bucket(prison->cells + hash, key);
> if (cell) {
> if (inmate)
> bio_list_add(&cell->bios, inmate);
> *cell_result = cell;
> return 1;
> }
If found the cell, it will add bio to ->bios of cell.
Maybe bio_detain(in dm-cache) is like:
r=dm_get_cell();
if (!r)
dm_bio_detain
Thanks!
Jianpeng Ma
More information about the dm-devel
mailing list