diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2014-04-29 18:28:22 +0200 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2014-04-30 02:35:18 +0200 |
commit | 85f3757d3ce0e9700cd647420e0257b69b91b9e9 (patch) | |
tree | b88967f940fd66000e6c158620bc25ddb401590e | |
parent | c9fa217a8ed0c167c41800e892c913c1649463a8 (diff) |
ext2fs: 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.
* ext2fs/inode.c (nodehash_nr_items): New variable.
(diskfs_cached_lookup): Increment nodehash_nr_items.
(diskfs_node_norefs): Decrement nodehash_nr_items.
(diskfs_node_iterate): Fix the type of num_nodes, use nodehash_nr_items.
-rw-r--r-- | ext2fs/inode.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/ext2fs/inode.c b/ext2fs/inode.c index e75c63f9..ed782657 100644 --- a/ext2fs/inode.c +++ b/ext2fs/inode.c @@ -47,6 +47,7 @@ #endif static struct node *nodehash[INOHSZ]; +static size_t nodehash_nr_items; static error_t read_node (struct node *np); @@ -106,6 +107,7 @@ diskfs_cached_lookup (ino_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); @@ -159,6 +161,7 @@ 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; if (np->dn->dirents) free (np->dn->dirents); @@ -549,7 +552,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); @@ -559,10 +563,7 @@ diskfs_node_iterate (error_t (*fun)(struct node *)) during processing (normally we delegate access to hash-table with 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; /* TODO This method doesn't scale beyond a few dozen nodes and should be replaced. */ |