summaryrefslogtreecommitdiff
path: root/debian/patches/0010-ext2fs-use-libihash-for-node-hash.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/0010-ext2fs-use-libihash-for-node-hash.patch')
-rw-r--r--debian/patches/0010-ext2fs-use-libihash-for-node-hash.patch185
1 files changed, 185 insertions, 0 deletions
diff --git a/debian/patches/0010-ext2fs-use-libihash-for-node-hash.patch b/debian/patches/0010-ext2fs-use-libihash-for-node-hash.patch
new file mode 100644
index 00000000..fa4de2b4
--- /dev/null
+++ b/debian/patches/0010-ext2fs-use-libihash-for-node-hash.patch
@@ -0,0 +1,185 @@
+From bb7185a63157cd1f419c972abb20123ca7ad1749 Mon Sep 17 00:00:00 2001
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Wed, 15 Apr 2015 02:17:11 +0200
+Subject: [PATCH hurd 10/10] ext2fs: use libihash for node hash
+
+---
+ ext2fs/ext2fs.c | 2 --
+ ext2fs/ext2fs.h | 5 -----
+ ext2fs/inode.c | 61 +++++++++++++++++----------------------------------------
+ 3 files changed, 18 insertions(+), 50 deletions(-)
+
+diff --git a/ext2fs/ext2fs.c b/ext2fs/ext2fs.c
+index beb7cad..d0fdfe7 100644
+--- a/ext2fs/ext2fs.c
++++ b/ext2fs/ext2fs.c
+@@ -185,8 +185,6 @@ main (int argc, char **argv)
+
+ map_hypermetadata ();
+
+- inode_init ();
+-
+ /* Set diskfs_root_node to the root inode. */
+ err = diskfs_cached_lookup (EXT2_ROOT_INO, &diskfs_root_node);
+ if (err)
+diff --git a/ext2fs/ext2fs.h b/ext2fs/ext2fs.h
+index 9667b6f..69b7c02 100644
+--- a/ext2fs/ext2fs.h
++++ b/ext2fs/ext2fs.h
+@@ -159,9 +159,6 @@ struct disknode
+ each DIRBLKSIZE piece of the directory. */
+ int *dirents;
+
+- /* Links on hash list. */
+- struct node *hnext, **hprevp;
+-
+ /* Lock to lock while fiddling with this inode's block allocation info. */
+ pthread_rwlock_t alloc_lock;
+
+@@ -423,8 +420,6 @@ void write_all_disknodes ();
+ /* Lookup node INUM (which must have a reference already) and return it
+ without allocating any new references. */
+ struct node *ifind (ino_t inum);
+-
+-void inode_init (void);
+
+ /* ---------------------------------------------------------------- */
+
+diff --git a/ext2fs/inode.c b/ext2fs/inode.c
+index 7af617c..0071a2b 100644
+--- a/ext2fs/inode.c
++++ b/ext2fs/inode.c
+@@ -20,6 +20,7 @@
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+ #include "ext2fs.h"
++#include <hurd/ihash.h>
+ #include <string.h>
+ #include <unistd.h>
+ #include <stdio.h>
+@@ -39,49 +40,28 @@
+ #define UF_IMMUTABLE 0
+ #endif
+
+-#define INOHSZ 8192
+-#if ((INOHSZ&(INOHSZ-1)) == 0)
+-#define INOHASH(ino) ((ino)&(INOHSZ-1))
+-#else
+-#define INOHASH(ino) (((unsigned)(ino))%INOHSZ)
+-#endif
+-
+ /* The nodehash is a cache of nodes.
+
+- Access to nodehash and nodehash_nr_items is protected by
+- nodecache_lock.
++ Access to nodehash is protected by nodecache_lock.
+
+ Every node in the nodehash carries a light reference. When we are
+ asked to give up that light reference, we reacquire our lock
+ momentarily to check whether someone else reacquired a reference
+ through the nodehash. */
+-static struct node *nodehash[INOHSZ];
+-static size_t nodehash_nr_items;
++static struct hurd_ihash nodehash =
++ HURD_IHASH_INITIALIZER (HURD_IHASH_NO_LOCP);
+ static pthread_rwlock_t nodecache_lock = PTHREAD_RWLOCK_INITIALIZER;
+
+ static error_t read_node (struct node *np);
+
+ pthread_spinlock_t generation_lock = PTHREAD_SPINLOCK_INITIALIZER;
+
+-/* Initialize the inode hash table. */
+-void
+-inode_init ()
+-{
+- int n;
+- for (n = 0; n < INOHSZ; n++)
+- nodehash[n] = 0;
+-}
+-
+ /* Lookup node with inode number INUM. Returns NULL if the node is
+ not found in the node cache. */
+ static struct node *
+ lookup (ino_t inum)
+ {
+- struct node *np;
+- for (np = nodehash[INOHASH(inum)]; np; np = diskfs_node_disknode (np)->hnext)
+- if (np->cache_id == inum)
+- return np;
+- return NULL;
++ return hurd_ihash_find (&nodehash, inum);
+ }
+
+ /* Fetch inode INUM, set *NPP to the node structure;
+@@ -124,14 +104,15 @@ diskfs_cached_lookup (ino_t inum, struct node **npp)
+ goto gotit;
+ }
+
+- dn->hnext = nodehash[INOHASH(inum)];
+- if (dn->hnext)
+- diskfs_node_disknode (dn->hnext)->hprevp = &dn->hnext;
+- dn->hprevp = &nodehash[INOHASH(inum)];
+- nodehash[INOHASH(inum)] = np;
+ diskfs_nref_light (np);
+- nodehash_nr_items += 1;
++ err = hurd_ihash_add (&nodehash, inum, np);
+ pthread_rwlock_unlock (&nodecache_lock);
++ if (err)
++ {
++ diskfs_nrele_light (np);
++ diskfs_nput (np);
++ return err;
++ }
+
+ /* Get the contents of NP off disk. */
+ err = read_node (np);
+@@ -199,7 +180,7 @@ void
+ diskfs_try_dropping_softrefs (struct node *np)
+ {
+ pthread_rwlock_wrlock (&nodecache_lock);
+- if (diskfs_node_disknode (np)->hprevp != NULL)
++ if (hurd_ihash_find (&nodehash, np->cache_id) != NULL)
+ {
+ /* Check if someone reacquired a reference through the
+ nodehash. */
+@@ -214,13 +195,7 @@ diskfs_try_dropping_softrefs (struct node *np)
+ return;
+ }
+
+- *diskfs_node_disknode (np)->hprevp = diskfs_node_disknode (np)->hnext;
+- if (diskfs_node_disknode (np)->hnext)
+- diskfs_node_disknode (diskfs_node_disknode (np)->hnext)->hprevp =
+- diskfs_node_disknode (np)->hprevp;
+- diskfs_node_disknode (np)->hnext = NULL;
+- diskfs_node_disknode (np)->hprevp = NULL;
+- nodehash_nr_items -= 1;
++ hurd_ihash_remove (&nodehash, np->cache_id);
+ diskfs_nrele_light (np);
+ }
+ pthread_rwlock_unlock (&nodecache_lock);
+@@ -608,7 +583,8 @@ diskfs_node_iterate (error_t (*fun)(struct node *))
+ during processing (normally we delegate access to hash-table with
+ nodecache_lock, but we can't hold this while locking the
+ individual node locks). */
+- num_nodes = nodehash_nr_items;
++ /* XXX: Can we? */
++ num_nodes = nodehash.nr_items;
+
+ /* TODO This method doesn't scale beyond a few dozen nodes and should be
+ replaced. */
+@@ -621,10 +597,9 @@ diskfs_node_iterate (error_t (*fun)(struct node *))
+ }
+
+ p = node_list;
+- for (n = 0; n < INOHSZ; n++)
+- for (node = nodehash[n]; node; node = diskfs_node_disknode (node)->hnext)
++ HURD_IHASH_ITERATE (&nodehash, value)
+ {
+- *p++ = node;
++ *p++ = node = (struct node *) value;
+
+ /* We acquire a hard reference for node, but without using
+ diskfs_nref. We do this so that diskfs_new_hardrefs will not
+--
+2.1.4
+