|
@@ -400,19 +400,20 @@ static void d_shrink_add(struct dentry *dentry, struct list_head *list)
|
|
|
* LRU lists entirely, while shrink_move moves it to the indicated
|
|
|
* private list.
|
|
|
*/
|
|
|
-static void d_lru_isolate(struct dentry *dentry)
|
|
|
+static void d_lru_isolate(struct list_lru_one *lru, struct dentry *dentry)
|
|
|
{
|
|
|
D_FLAG_VERIFY(dentry, DCACHE_LRU_LIST);
|
|
|
dentry->d_flags &= ~DCACHE_LRU_LIST;
|
|
|
this_cpu_dec(nr_dentry_unused);
|
|
|
- list_del_init(&dentry->d_lru);
|
|
|
+ list_lru_isolate(lru, &dentry->d_lru);
|
|
|
}
|
|
|
|
|
|
-static void d_lru_shrink_move(struct dentry *dentry, struct list_head *list)
|
|
|
+static void d_lru_shrink_move(struct list_lru_one *lru, struct dentry *dentry,
|
|
|
+ struct list_head *list)
|
|
|
{
|
|
|
D_FLAG_VERIFY(dentry, DCACHE_LRU_LIST);
|
|
|
dentry->d_flags |= DCACHE_SHRINK_LIST;
|
|
|
- list_move_tail(&dentry->d_lru, list);
|
|
|
+ list_lru_isolate_move(lru, &dentry->d_lru, list);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -869,8 +870,8 @@ static void shrink_dentry_list(struct list_head *list)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static enum lru_status
|
|
|
-dentry_lru_isolate(struct list_head *item, spinlock_t *lru_lock, void *arg)
|
|
|
+static enum lru_status dentry_lru_isolate(struct list_head *item,
|
|
|
+ struct list_lru_one *lru, spinlock_t *lru_lock, void *arg)
|
|
|
{
|
|
|
struct list_head *freeable = arg;
|
|
|
struct dentry *dentry = container_of(item, struct dentry, d_lru);
|
|
@@ -890,7 +891,7 @@ dentry_lru_isolate(struct list_head *item, spinlock_t *lru_lock, void *arg)
|
|
|
* another pass through the LRU.
|
|
|
*/
|
|
|
if (dentry->d_lockref.count) {
|
|
|
- d_lru_isolate(dentry);
|
|
|
+ d_lru_isolate(lru, dentry);
|
|
|
spin_unlock(&dentry->d_lock);
|
|
|
return LRU_REMOVED;
|
|
|
}
|
|
@@ -921,7 +922,7 @@ dentry_lru_isolate(struct list_head *item, spinlock_t *lru_lock, void *arg)
|
|
|
return LRU_ROTATE;
|
|
|
}
|
|
|
|
|
|
- d_lru_shrink_move(dentry, freeable);
|
|
|
+ d_lru_shrink_move(lru, dentry, freeable);
|
|
|
spin_unlock(&dentry->d_lock);
|
|
|
|
|
|
return LRU_REMOVED;
|
|
@@ -951,7 +952,7 @@ long prune_dcache_sb(struct super_block *sb, struct shrink_control *sc)
|
|
|
}
|
|
|
|
|
|
static enum lru_status dentry_lru_isolate_shrink(struct list_head *item,
|
|
|
- spinlock_t *lru_lock, void *arg)
|
|
|
+ struct list_lru_one *lru, spinlock_t *lru_lock, void *arg)
|
|
|
{
|
|
|
struct list_head *freeable = arg;
|
|
|
struct dentry *dentry = container_of(item, struct dentry, d_lru);
|
|
@@ -964,7 +965,7 @@ static enum lru_status dentry_lru_isolate_shrink(struct list_head *item,
|
|
|
if (!spin_trylock(&dentry->d_lock))
|
|
|
return LRU_SKIP;
|
|
|
|
|
|
- d_lru_shrink_move(dentry, freeable);
|
|
|
+ d_lru_shrink_move(lru, dentry, freeable);
|
|
|
spin_unlock(&dentry->d_lock);
|
|
|
|
|
|
return LRU_REMOVED;
|