[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 -+-
- [PATCH 09/11] libnetfs: add netfs_make_node_alloc to allocate fat nodes, (continued)
- [PATCH 08/11] libdiskfs: add diskfs_make_node_alloc to allocate fat nodes, Justus Winter, 2014/05/22
- Re: [PATCH 08/11] libdiskfs: add diskfs_make_node_alloc to allocate fat nodes,
Samuel Thibault <=
- [PATCH 04/11] term: fix memory leak, Justus Winter, 2014/05/22
- [PATCH 10/11] trans/fakeroot: use fat nodes to simplify the node cache, Justus Winter, 2014/05/22
- [PATCH 11/11] trans/fakeroot: use netfs_node_netnode instead of np->nn, Justus Winter, 2014/05/22
- Re: [PATCH 01/11] include: install refcount.h, Samuel Thibault, 2014/05/22