diff options
Diffstat (limited to 'fs/ubifs/shrinker.c')
| -rw-r--r-- | fs/ubifs/shrinker.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/fs/ubifs/shrinker.c b/fs/ubifs/shrinker.c index 9e1d05666fed..f35135e28e96 100644 --- a/fs/ubifs/shrinker.c +++ b/fs/ubifs/shrinker.c | |||
| @@ -277,18 +277,25 @@ static int kick_a_thread(void) | |||
| 277 | return 0; | 277 | return 0; |
| 278 | } | 278 | } |
| 279 | 279 | ||
| 280 | int ubifs_shrinker(struct shrinker *shrink, struct shrink_control *sc) | 280 | unsigned long ubifs_shrink_count(struct shrinker *shrink, |
| 281 | struct shrink_control *sc) | ||
| 281 | { | 282 | { |
| 282 | int nr = sc->nr_to_scan; | ||
| 283 | int freed, contention = 0; | ||
| 284 | long clean_zn_cnt = atomic_long_read(&ubifs_clean_zn_cnt); | 283 | long clean_zn_cnt = atomic_long_read(&ubifs_clean_zn_cnt); |
| 285 | 284 | ||
| 286 | if (nr == 0) | 285 | /* |
| 287 | /* | 286 | * Due to the way UBIFS updates the clean znode counter it may |
| 288 | * Due to the way UBIFS updates the clean znode counter it may | 287 | * temporarily be negative. |
| 289 | * temporarily be negative. | 288 | */ |
| 290 | */ | 289 | return clean_zn_cnt >= 0 ? clean_zn_cnt : 1; |
| 291 | return clean_zn_cnt >= 0 ? clean_zn_cnt : 1; | 290 | } |
| 291 | |||
| 292 | unsigned long ubifs_shrink_scan(struct shrinker *shrink, | ||
| 293 | struct shrink_control *sc) | ||
| 294 | { | ||
| 295 | unsigned long nr = sc->nr_to_scan; | ||
| 296 | int contention = 0; | ||
| 297 | unsigned long freed; | ||
| 298 | long clean_zn_cnt = atomic_long_read(&ubifs_clean_zn_cnt); | ||
| 292 | 299 | ||
| 293 | if (!clean_zn_cnt) { | 300 | if (!clean_zn_cnt) { |
| 294 | /* | 301 | /* |
| @@ -316,10 +323,10 @@ int ubifs_shrinker(struct shrinker *shrink, struct shrink_control *sc) | |||
| 316 | 323 | ||
| 317 | if (!freed && contention) { | 324 | if (!freed && contention) { |
| 318 | dbg_tnc("freed nothing, but contention"); | 325 | dbg_tnc("freed nothing, but contention"); |
| 319 | return -1; | 326 | return SHRINK_STOP; |
| 320 | } | 327 | } |
| 321 | 328 | ||
| 322 | out: | 329 | out: |
| 323 | dbg_tnc("%d znodes were freed, requested %d", freed, nr); | 330 | dbg_tnc("%lu znodes were freed, requested %lu", freed, nr); |
| 324 | return freed; | 331 | return freed; |
| 325 | } | 332 | } |
