From ff9e97b120076b8707474b4580e1bab205f6dd62 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Wed, 30 Apr 2014 02:04:31 +0200 Subject: fatfs: improve diskfs_node_iterate Currently, diskfs_node_iterate iterates twice over all nodes in the cache. The first time only to determine the number of nodes currently in the cache. Simply count them instead. * fatfs/inode.c (nodehash_nr_items): New variable. (diskfs_cached_lookup): Increment nodehash_nr_items. (diskfs_cached_lookup_in_dirbuf): Likewise. (diskfs_node_norefs): Decrement nodehash_nr_items. (diskfs_node_iterate): Fix the type of num_nodes, use nodehash_nr_items. --- fatfs/inode.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'fatfs') diff --git a/fatfs/inode.c b/fatfs/inode.c index 4229806e..ed6f3f08 100644 --- a/fatfs/inode.c +++ b/fatfs/inode.c @@ -45,6 +45,7 @@ #endif static struct node *nodehash[INOHSZ]; +static size_t nodehash_nr_items; static error_t read_node (struct node *np, vm_address_t buf); @@ -106,6 +107,7 @@ diskfs_cached_lookup (ino64_t inum, struct node **npp) dn->hnext->dn->hprevp = &dn->hnext; dn->hprevp = &nodehash[INOHASH(inum)]; nodehash[INOHASH(inum)] = np; + nodehash_nr_items += 1; pthread_spin_unlock (&diskfs_node_refcnt_lock); @@ -171,6 +173,7 @@ diskfs_cached_lookup_in_dirbuf (int inum, struct node **npp, vm_address_t buf) dn->hnext->dn->hprevp = &dn->hnext; dn->hprevp = &nodehash[INOHASH(inum)]; nodehash[INOHASH(inum)] = np; + nodehash_nr_items += 1; pthread_spin_unlock (&diskfs_node_refcnt_lock); @@ -216,7 +219,8 @@ diskfs_node_norefs (struct node *np) *np->dn->hprevp = np->dn->hnext; if (np->dn->hnext) np->dn->hnext->dn->hprevp = np->dn->hprevp; - + nodehash_nr_items -= 1; + while (last) { struct cluster_chain *next = last->next; @@ -546,7 +550,8 @@ error_t diskfs_node_iterate (error_t (*fun)(struct node *)) { error_t err = 0; - int n, num_nodes = 0; + int n; + size_t num_nodes; struct node *node, **node_list, **p; pthread_spin_lock (&diskfs_node_refcnt_lock); @@ -557,9 +562,7 @@ diskfs_node_iterate (error_t (*fun)(struct node *)) diskfs_node_refcnt_lock, but we can't hold this while locking the individual node locks). */ - for (n = 0; n < INOHSZ; n++) - for (node = nodehash[n]; node; node = node->dn->hnext) - num_nodes++; + num_nodes = nodehash_nr_items; node_list = alloca (num_nodes * sizeof (struct node *)); p = node_list; -- cgit v1.2.3