bug-hurd
[Top][All Lists]
Advanced

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

Re: [PATCH 08/11] libdiskfs: add diskfs_make_node_alloc to allocate fat


From: Samuel Thibault
Subject: Re: [PATCH 08/11] libdiskfs: add diskfs_make_node_alloc to allocate fat nodes
Date: Fri, 23 May 2014 00:28:41 +0200
User-agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)

Justus Winter, le Thu 22 May 2014 22:13:30 +0200, a écrit :
> libdiskfs has two kind of nodes, struct node and struct netnode.
> struct node is used to store libdiskfs specific data, while struct
> netnode contains user supplied data.  Previously, both objects were
> allocated separatly, and a pointer from the node to the netnode
> provided a mapping from the former to the latter.
> 
> Provide a function diskfs_make_node_alloc that allocates both nodes in
> a contiguous region.
> 
> This reduces the memory allocation overhead when creating nodes.  It
> also makes the relation between node and netnode a simple offset
> calculation.  Provide two functions to compute the netnode address
> from the node address and vice-versa.
> 
> Most notably, this makes implementing a cache on top of libdiskfs
> easier.  Auxiliary data for the cache can be stored in the
> user-defined netnode, and the fat node can be used as the value.

Ack!

> * libdiskfs/node-make.c (init_node): Move initialization here.
> (diskfs_make_node): Use init_node.
> (diskfs_make_node_alloc): New function to allocate fat nodes.
> * libdiskfs/diskfs.h (diskfs_make_node_alloc): New declaration.
> (diskfs_node_netnode): Compute netnode address from node address.
> (diskfs_netnode_node): And vice-versa.
> ---
>  libdiskfs/diskfs.h    | 22 ++++++++++++++++++++++
>  libdiskfs/node-make.c | 39 ++++++++++++++++++++++++++++++---------
>  2 files changed, 52 insertions(+), 9 deletions(-)
> 
> diff --git a/libdiskfs/diskfs.h b/libdiskfs/diskfs.h
> index 8151ddc..f710d10 100644
> --- a/libdiskfs/diskfs.h
> +++ b/libdiskfs/diskfs.h
> @@ -685,6 +685,28 @@ diskfs_notice_filechange (struct node *np, enum 
> file_changed_type type,
>     The new node will have one hard reference and no light references.  */
>  struct node *diskfs_make_node (struct disknode *dn);
>  
> +/* Create a new node structure.  Also allocate SIZE bytes for the
> +   disknode.  The address of the disknode can be obtained using
> +   diskfs_node_disknode.  The new node will have one hard reference
> +   and no light references.  */
> +struct node *diskfs_make_node_alloc (size_t size);
> +
> +/* Return the address of the disknode for NODE.  NODE must have been
> +   allocated using diskfs_make_node_alloc.  */
> +static inline struct disknode *
> +diskfs_node_disknode (struct node *node)
> +{
> +  return (struct disknode *) ((char *) node + sizeof (struct node));
> +}
> +
> +/* Return the address of the node for DISKNODE.  DISKNODE must have
> +   been allocated using diskfs_make_node_alloc.  */
> +static inline struct node *
> +diskfs_disknode_node (struct disknode *disknode)
> +{
> +  return (struct node *) ((char *) disknode - sizeof (struct node));
> +}
> +
>  
>  /* The library also exports the following functions; they are not generally
>     useful unless you are redefining other functions the library provides. */
> diff --git a/libdiskfs/node-make.c b/libdiskfs/node-make.c
> index 2b6ef2a..ff0cc0d 100644
> --- a/libdiskfs/node-make.c
> +++ b/libdiskfs/node-make.c
> @@ -19,16 +19,9 @@
>  #include <fcntl.h>
>  
>  
> -/* Create a and return new node structure with DN as its physical disknode.
> -   The node will have one hard reference and no light references.  */
> -struct node *
> -diskfs_make_node (struct disknode *dn)
> +static struct node *
> +init_node (struct node *np, struct disknode *dn)
>  {
> -  struct node *np = malloc (sizeof (struct node));
> -
> -  if (np == 0)
> -    return 0;
> -
>    np->dn = dn;
>    np->dn_set_ctime = 0;
>    np->dn_set_atime = 0;
> @@ -52,3 +45,31 @@ diskfs_make_node (struct disknode *dn)
>  
>    return np;
>  }
> +
> +/* Create a and return new node structure with DN as its physical disknode.
> +   The node will have one hard reference and no light references.  */
> +struct node *
> +diskfs_make_node (struct disknode *dn)
> +{
> +  struct node *np = malloc (sizeof (struct node));
> +
> +  if (np == 0)
> +    return 0;
> +
> +  return init_node (np, dn);
> +}
> +
> +/* Create a new node structure.  Also allocate SIZE bytes for the
> +   disknode.  The address of the disknode can be obtained using
> +   diskfs_node_disknode.  The new node will have one hard reference
> +   and no light references.  */
> +struct node *
> +diskfs_make_node_alloc (size_t size)
> +{
> +  struct node *np = malloc (sizeof (struct node) + size);
> +
> +  if (np == NULL)
> +    return NULL;
> +
> +  return init_node (np, diskfs_node_disknode (np));
> +}
> -- 
> 2.0.0.rc2
> 

-- 
Samuel
 Battery 1: charging, 90%, charging at zero rate - will never fully charge.
 -+- acpi - et pourtant, ca monte -+-



reply via email to

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