This allows callers to change the buffer pointer, because it can be reinitialized to the default value in cache_alloc() before returning the cache entry. Signed-off-by: Petr Tesarik <ptesarik at suse.cz> --- cache.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/cache.c b/cache.c index 344b4f6..ccd67ca 100644 --- a/cache.c +++ b/cache.c @@ -32,23 +32,23 @@ static int avail = CACHE_SIZE; static struct cache used, pending; +static void *cachebuf; + int cache_init(void) { - void *bufptr; int i; - for (i = 0; i < CACHE_SIZE; ++i) { - bufptr = malloc(info->page_size); - if (bufptr == NULL) { - ERRMSG("Can't allocate memory for cache. %s\n", - strerror(errno)); - return FALSE; - } - entries[i].bufptr = bufptr; - pool[i] = &entries[i]; + cachebuf = malloc(info->page_size * CACHE_SIZE); + if (cachebuf == NULL) { + ERRMSG("Can't allocate memory for cache. %s\n", + strerror(errno)); + return FALSE; } + for (i = 0; i < CACHE_SIZE; ++i) + pool[i] = &entries[i]; + return TRUE; } @@ -98,6 +98,7 @@ struct cache_entry * cache_alloc(unsigned long long paddr) { struct cache_entry *entry = NULL; + int idx; if (avail) { entry = pool[--avail]; @@ -107,8 +108,11 @@ cache_alloc(unsigned long long paddr) } else return NULL; - add_entry(&pending, entry); + idx = entry - entries; entry->paddr = paddr; + entry->bufptr = cachebuf + idx * info->page_size; + add_entry(&pending, entry); + return entry; } -- 1.8.4.5