diff options
Diffstat (limited to 'fs/quota')
-rw-r--r-- | fs/quota/dquot.c | 29 |
1 files changed, 11 insertions, 18 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 13eee847605c..831d49a4111f 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
@@ -687,44 +687,37 @@ int dquot_quota_sync(struct super_block *sb, int type) | |||
687 | } | 687 | } |
688 | EXPORT_SYMBOL(dquot_quota_sync); | 688 | EXPORT_SYMBOL(dquot_quota_sync); |
689 | 689 | ||
690 | /* Free unused dquots from cache */ | 690 | static unsigned long |
691 | static void prune_dqcache(int count) | 691 | dqcache_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) |
692 | { | 692 | { |
693 | struct list_head *head; | 693 | struct list_head *head; |
694 | struct dquot *dquot; | 694 | struct dquot *dquot; |
695 | unsigned long freed = 0; | ||
695 | 696 | ||
696 | head = free_dquots.prev; | 697 | head = free_dquots.prev; |
697 | while (head != &free_dquots && count) { | 698 | while (head != &free_dquots && sc->nr_to_scan) { |
698 | dquot = list_entry(head, struct dquot, dq_free); | 699 | dquot = list_entry(head, struct dquot, dq_free); |
699 | remove_dquot_hash(dquot); | 700 | remove_dquot_hash(dquot); |
700 | remove_free_dquot(dquot); | 701 | remove_free_dquot(dquot); |
701 | remove_inuse(dquot); | 702 | remove_inuse(dquot); |
702 | do_destroy_dquot(dquot); | 703 | do_destroy_dquot(dquot); |
703 | count--; | 704 | sc->nr_to_scan--; |
705 | freed++; | ||
704 | head = free_dquots.prev; | 706 | head = free_dquots.prev; |
705 | } | 707 | } |
708 | return freed; | ||
706 | } | 709 | } |
707 | 710 | ||
708 | /* | 711 | static unsigned long |
709 | * This is called from kswapd when we think we need some | 712 | dqcache_shrink_count(struct shrinker *shrink, struct shrink_control *sc) |
710 | * more memory | ||
711 | */ | ||
712 | static int shrink_dqcache_memory(struct shrinker *shrink, | ||
713 | struct shrink_control *sc) | ||
714 | { | 713 | { |
715 | int nr = sc->nr_to_scan; | ||
716 | |||
717 | if (nr) { | ||
718 | spin_lock(&dq_list_lock); | ||
719 | prune_dqcache(nr); | ||
720 | spin_unlock(&dq_list_lock); | ||
721 | } | ||
722 | return vfs_pressure_ratio( | 714 | return vfs_pressure_ratio( |
723 | percpu_counter_read_positive(&dqstats.counter[DQST_FREE_DQUOTS])); | 715 | percpu_counter_read_positive(&dqstats.counter[DQST_FREE_DQUOTS])); |
724 | } | 716 | } |
725 | 717 | ||
726 | static struct shrinker dqcache_shrinker = { | 718 | static struct shrinker dqcache_shrinker = { |
727 | .shrink = shrink_dqcache_memory, | 719 | .count_objects = dqcache_shrink_count, |
720 | .scan_objects = dqcache_shrink_scan, | ||
728 | .seeks = DEFAULT_SEEKS, | 721 | .seeks = DEFAULT_SEEKS, |
729 | }; | 722 | }; |
730 | 723 | ||