quota.c (55f841ce9395a72c6285fbcc4c403c0c786e1c74) | quota.c (1ab6c4997e04a00c50c6d786c2f046adc0d1f5de) |
---|---|
1/* 2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. 3 * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. 4 * 5 * This copyrighted material is made available to anyone wishing to use, 6 * modify, copy, or redistribute it subject to the terms and conditions 7 * of the GNU General Public License version 2. 8 */ --- 61 unchanged lines hidden (view full) --- 70 u32 qc_flags; /* GFS2_QCF_... */ 71 struct kqid qc_id; 72}; 73 74static LIST_HEAD(qd_lru_list); 75static atomic_t qd_lru_count = ATOMIC_INIT(0); 76static DEFINE_SPINLOCK(qd_lru_lock); 77 | 1/* 2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. 3 * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. 4 * 5 * This copyrighted material is made available to anyone wishing to use, 6 * modify, copy, or redistribute it subject to the terms and conditions 7 * of the GNU General Public License version 2. 8 */ --- 61 unchanged lines hidden (view full) --- 70 u32 qc_flags; /* GFS2_QCF_... */ 71 struct kqid qc_id; 72}; 73 74static LIST_HEAD(qd_lru_list); 75static atomic_t qd_lru_count = ATOMIC_INIT(0); 76static DEFINE_SPINLOCK(qd_lru_lock); 77 |
78int gfs2_shrink_qd_memory(struct shrinker *shrink, struct shrink_control *sc) | 78unsigned long gfs2_qd_shrink_scan(struct shrinker *shrink, 79 struct shrink_control *sc) |
79{ 80 struct gfs2_quota_data *qd; 81 struct gfs2_sbd *sdp; 82 int nr_to_scan = sc->nr_to_scan; | 80{ 81 struct gfs2_quota_data *qd; 82 struct gfs2_sbd *sdp; 83 int nr_to_scan = sc->nr_to_scan; |
84 long freed = 0; |
|
83 | 85 |
84 if (nr_to_scan == 0) 85 goto out; 86 | |
87 if (!(sc->gfp_mask & __GFP_FS)) | 86 if (!(sc->gfp_mask & __GFP_FS)) |
88 return -1; | 87 return SHRINK_STOP; |
89 90 spin_lock(&qd_lru_lock); 91 while (nr_to_scan && !list_empty(&qd_lru_list)) { 92 qd = list_entry(qd_lru_list.next, 93 struct gfs2_quota_data, qd_reclaim); 94 sdp = qd->qd_gl->gl_sbd; 95 96 /* Free from the filesystem-specific list */ --- 8 unchanged lines hidden (view full) --- 105 106 /* Delete it from the common reclaim list */ 107 list_del_init(&qd->qd_reclaim); 108 atomic_dec(&qd_lru_count); 109 spin_unlock(&qd_lru_lock); 110 kmem_cache_free(gfs2_quotad_cachep, qd); 111 spin_lock(&qd_lru_lock); 112 nr_to_scan--; | 88 89 spin_lock(&qd_lru_lock); 90 while (nr_to_scan && !list_empty(&qd_lru_list)) { 91 qd = list_entry(qd_lru_list.next, 92 struct gfs2_quota_data, qd_reclaim); 93 sdp = qd->qd_gl->gl_sbd; 94 95 /* Free from the filesystem-specific list */ --- 8 unchanged lines hidden (view full) --- 104 105 /* Delete it from the common reclaim list */ 106 list_del_init(&qd->qd_reclaim); 107 atomic_dec(&qd_lru_count); 108 spin_unlock(&qd_lru_lock); 109 kmem_cache_free(gfs2_quotad_cachep, qd); 110 spin_lock(&qd_lru_lock); 111 nr_to_scan--; |
112 freed++; |
|
113 } 114 spin_unlock(&qd_lru_lock); | 113 } 114 spin_unlock(&qd_lru_lock); |
115 return freed; 116} |
|
115 | 117 |
116out: | 118unsigned long gfs2_qd_shrink_count(struct shrinker *shrink, 119 struct shrink_control *sc) 120{ |
117 return vfs_pressure_ratio(atomic_read(&qd_lru_count)); 118} 119 120static u64 qd2index(struct gfs2_quota_data *qd) 121{ 122 struct kqid qid = qd->qd_id; 123 return (2 * (u64)from_kqid(&init_user_ns, qid)) + 124 ((qid.type == USRQUOTA) ? 0 : 1); --- 1486 unchanged lines hidden --- | 121 return vfs_pressure_ratio(atomic_read(&qd_lru_count)); 122} 123 124static u64 qd2index(struct gfs2_quota_data *qd) 125{ 126 struct kqid qid = qd->qd_id; 127 return (2 * (u64)from_kqid(&init_user_ns, qid)) + 128 ((qid.type == USRQUOTA) ? 0 : 1); --- 1486 unchanged lines hidden --- |