From 65cbb13fdf81832b36694a73530d346cd55a3e2c Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Tue, 16 Feb 2010 12:20:36 -0800 Subject: cache: fix _get_cache_block() return, add lock_cache_block() Correct the return value from _get_cache_block(), and add a method for locking a block permanently in the cache. Signed-off-by: H. Peter Anvin --- core/fs/cache.c | 29 ++++++++++++++++++++++------- core/include/cache.h | 1 + 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/core/fs/cache.c b/core/fs/cache.c index 128a1248..1dc4c300 100644 --- a/core/fs/cache.c +++ b/core/fs/cache.c @@ -57,6 +57,17 @@ void cache_init(struct device *dev, int block_size_shift) } } +/* + * Lock a block permanently in the cache + */ +void cache_lock_block(struct cache *cs) +{ + cs->prev->next = cs->next; + cs->next->prev = cs->prev; + + cs->next = cs->prev = NULL; +} + /* * Check for a particular BLOCK in the block cache, * and if it is already there, just do nothing and return; @@ -79,15 +90,19 @@ struct cache *_get_cache_block(struct device *dev, block_t block) /* Not found, pick a victim */ cs = head->next; - /* Add to just before head node */ found: - cs->prev->next = cs->next; - cs->next->prev = cs->prev; + /* Move to the end of the LRU chain, unless the block is already locked */ + if (cs->next) { + cs->prev->next = cs->next; + cs->next->prev = cs->prev; + + cs->prev = head->prev; + head->prev->next = cs; + cs->next = head; + head->prev = cs; + } - cs->prev = head->prev; - head->prev->next = cs; - cs->next = head; - head->prev = cs; + return cs; } /* diff --git a/core/include/cache.h b/core/include/cache.h index 0cf399af..1f451afd 100644 --- a/core/include/cache.h +++ b/core/include/cache.h @@ -18,5 +18,6 @@ struct cache { void cache_init(struct device *, int); const void *get_cache(struct device *, block_t); struct cache *_get_cache_block(struct device *, block_t); +void cache_lock_block(struct cache *); #endif /* cache.h */ -- cgit v1.2.1