summaryrefslogtreecommitdiff
path: root/debian/patches/tmpfs-improve-diskfs_node_iterate.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/tmpfs-improve-diskfs_node_iterate.patch')
-rw-r--r--debian/patches/tmpfs-improve-diskfs_node_iterate.patch53
1 files changed, 53 insertions, 0 deletions
diff --git a/debian/patches/tmpfs-improve-diskfs_node_iterate.patch b/debian/patches/tmpfs-improve-diskfs_node_iterate.patch
new file mode 100644
index 00000000..fbb013bd
--- /dev/null
+++ b/debian/patches/tmpfs-improve-diskfs_node_iterate.patch
@@ -0,0 +1,53 @@
+commit 328d69406ec81b4b8248f46fafa205c6745ef083
+Author: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Wed Apr 30 02:08:41 2014 +0200
+
+ tmpfs: improve diskfs_node_iterate
+
+ Currently, diskfs_node_iterate iterates twice over all nodes. The
+ first time only to determine the number of nodes currently in the
+ cache. Simply count them instead.
+
+ * tmpfs/node.c (all_nodes_nr_items): New variable.
+ (diskfs_node_norefs): Decrement all_nodes_nr_items.
+ (diskfs_cached_lookup): Increment all_nodes_nr_items.
+ (diskfs_node_iterate): Fix the type of num_nodes, use all_nodes_nr_items.
+
+diff --git a/tmpfs/node.c b/tmpfs/node.c
+index bc0ad64..3925d00 100644
+--- a/tmpfs/node.c
++++ b/tmpfs/node.c
+@@ -30,6 +30,7 @@ unsigned int num_files;
+ static unsigned int gen;
+
+ struct node *all_nodes;
++static size_t all_nodes_nr_items;
+
+ error_t
+ diskfs_alloc_node (struct node *dp, mode_t mode, struct node **npp)
+@@ -122,6 +123,7 @@ diskfs_node_norefs (struct node *np)
+ np->dn->hnext->dn->hprevp = np->dn->hprevp;
+ np->dn->hnext = 0;
+ np->dn->hprevp = 0;
++ all_nodes_nr_items -= 1;
+ }
+
+ free (np);
+@@ -186,6 +188,7 @@ diskfs_cached_lookup (ino_t inum, struct node **npp)
+ dn->hnext->dn->hprevp = &dn->hnext;
+ dn->hprevp = &all_nodes;
+ all_nodes = np;
++ all_nodes_nr_items += 1;
+ pthread_spin_unlock (&diskfs_node_refcnt_lock);
+
+ st = &np->dn_stat;
+@@ -233,8 +236,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 (node = all_nodes; node != 0; node = node->dn->hnext)
+- num_nodes++;
++ num_nodes = all_nodes_nr_items;
+
+ p = node_list = alloca (num_nodes * sizeof (struct node *));
+ for (node = all_nodes; node != 0; node = node->dn->hnext)