On Thu, Jan 20, 2011 at 5:10 PM, Kevin Wolf <kw...@redhat.com> wrote: > +int qcow2_cache_get(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset, > + void **table) [...] > +int qcow2_cache_put(BlockDriverState *bs, Qcow2Cache *c, void **table) > +{ > + int i; > + > + for (i = 0; i < c->size; i++) { > + if (c->entries[i].table == *table) { > + goto found; > + } > + } > + return -ENOENT; > + > +found:
Using void **table instead of a QCowCacheEntry struct has two disadvantages: 1. The fact that you're holding a reference is not explicit. It makes it unclear whether we're dealing with a cached table or not. In user code, uint64_t *l2_table doesn't tell me whether this table is in the cache or is being managed outside the cache. Therefore it's hard to check that the necessary qcow2_cache_put() calls are being made. 2. qcow2-cache.c needs to scan through the cache linearly looking for void *table on every call. If the user holds an explicit QCowCacheEntry then no lookup is necessary. Stefan