bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 3/4] fatfs: improve diskfs_node_iterate


From: Samuel Thibault
Subject: Re: [PATCH 3/4] fatfs: improve diskfs_node_iterate
Date: Wed, 30 Apr 2014 11:09:51 +0200
User-agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)

Justus Winter, le Wed 30 Apr 2014 11:06:01 +0200, a écrit :
> 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.

Ack.

> * 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(-)
> 
> diff --git a/fatfs/inode.c b/fatfs/inode.c
> index 4229806..ed6f3f0 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;
> -- 
> 1.9.2
> 

-- 
Samuel
<v> je viens d'inventer mutt version magritte :D
<y> ?
<v> dans mutt
<v> tape "cceci" return



reply via email to

[Prev in Thread] Current Thread [Next in Thread]