diff options
Diffstat (limited to 'debian/patches/0001-libdiskfs-add-diskfs_make_node_alloc-to-allocate-fat.patch')
-rw-r--r-- | debian/patches/0001-libdiskfs-add-diskfs_make_node_alloc-to-allocate-fat.patch | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/debian/patches/0001-libdiskfs-add-diskfs_make_node_alloc-to-allocate-fat.patch b/debian/patches/0001-libdiskfs-add-diskfs_make_node_alloc-to-allocate-fat.patch new file mode 100644 index 00000000..6a873cdf --- /dev/null +++ b/debian/patches/0001-libdiskfs-add-diskfs_make_node_alloc-to-allocate-fat.patch @@ -0,0 +1,149 @@ +From 80485401a9a5e9df03bd3a1503bc5e59d1f2e5c1 Mon Sep 17 00:00:00 2001 +From: Justus Winter <4winter@informatik.uni-hamburg.de> +Date: Fri, 16 May 2014 23:06:33 +0200 +Subject: [PATCH 01/14] libdiskfs: add diskfs_make_node_alloc to allocate fat + nodes + +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. + +* 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_sizeof_struct_node): Likewise. +(diskfs_node_disknode): Compute disknode address from node address. +(diskfs_disknode_node): And vice-versa. +* libdiskfs/init-init.c (_diskfs_sizeof_struct_node): New variable. +--- + libdiskfs/diskfs.h | 27 +++++++++++++++++++++++++++ + libdiskfs/init-init.c | 4 ++++ + libdiskfs/node-make.c | 39 ++++++++++++++++++++++++++++++--------- + 3 files changed, 61 insertions(+), 9 deletions(-) + +diff --git a/libdiskfs/diskfs.h b/libdiskfs/diskfs.h +index ae1a150..2c68aa3 100644 +--- a/libdiskfs/diskfs.h ++++ b/libdiskfs/diskfs.h +@@ -686,6 +686,33 @@ 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); ++ ++/* To avoid breaking the ABI whenever sizeof (struct node) changes, we ++ explicitly provide the size. The following two functions will use ++ this value for offset calculations. */ ++extern const size_t _diskfs_sizeof_struct_node; ++ ++/* 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 + _diskfs_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 - _diskfs_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/init-init.c b/libdiskfs/init-init.c +index 35be7ed..7a7f248 100644 +--- a/libdiskfs/init-init.c ++++ b/libdiskfs/init-init.c +@@ -25,6 +25,10 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + #include <stdio.h> + #include <maptime.h> + ++/* For safe inlining of diskfs_node_disknode and ++ diskfs_disknode_node. */ ++size_t const _diskfs_sizeof_struct_node = sizeof (struct node); ++ + mach_port_t diskfs_default_pager; + mach_port_t diskfs_auth_server_port; + volatile struct mapped_time_value *diskfs_mtime; +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 + |