gfs2: Fix wrong quota shrinker return value
authorAndreas Gruenbacher <agruenba@redhat.com>
Tue, 22 Aug 2023 20:59:27 +0000 (22:59 +0200)
committerAndreas Gruenbacher <agruenba@redhat.com>
Tue, 5 Sep 2023 13:58:16 +0000 (15:58 +0200)
Function gfs2_qd_isolate must only return LRU_REMOVED when removing the
item from the lru list; otherwise, the number of items on the list will
go wrong.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/quota.c

index 48b9fbffe2605d94e26a3e1b9290e862db595434..f58072efafc943c2e5ee6582e51ec0451a376cc7 100644 (file)
@@ -149,18 +149,22 @@ static enum lru_status gfs2_qd_isolate(struct list_head *item,
                struct list_lru_one *lru, spinlock_t *lru_lock, void *arg)
 {
        struct list_head *dispose = arg;
-       struct gfs2_quota_data *qd = list_entry(item, struct gfs2_quota_data, qd_lru);
+       struct gfs2_quota_data *qd =
+               list_entry(item, struct gfs2_quota_data, qd_lru);
+       enum lru_status status;
 
        if (!spin_trylock(&qd->qd_lockref.lock))
                return LRU_SKIP;
 
+       status = LRU_SKIP;
        if (qd->qd_lockref.count == 0) {
                lockref_mark_dead(&qd->qd_lockref);
                list_lru_isolate_move(lru, &qd->qd_lru, dispose);
+               status = LRU_REMOVED;
        }
 
        spin_unlock(&qd->qd_lockref.lock);
-       return LRU_REMOVED;
+       return status;
 }
 
 static unsigned long gfs2_qd_shrink_scan(struct shrinker *shrink,