From bde1c17816c7ed97c236158e2f1359bb34af08bf Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Mon, 12 May 2014 19:47:56 -0500 Subject: [PATCH] Factor out inode_unref_streams() --- include/wimlib/inode.h | 4 ++++ src/dentry.c | 21 ++++++++------------- src/inode.c | 14 ++++++++++++++ src/mount_image.c | 27 ++++++++------------------- 4 files changed, 34 insertions(+), 32 deletions(-) diff --git a/include/wimlib/inode.h b/include/wimlib/inode.h index e2bc46fe..04ec9682 100644 --- a/include/wimlib/inode.h +++ b/include/wimlib/inode.h @@ -508,6 +508,10 @@ verify_inode(struct wim_inode *inode, const struct wim_security_data *sd); extern void inode_ref_streams(struct wim_inode *inode); +extern void +inode_unref_streams(struct wim_inode *inode, + struct wim_lookup_table *lookup_table); + /* inode_fixup.c */ extern int dentry_tree_fix_inodes(struct wim_dentry *root, struct list_head *inode_list); diff --git a/src/dentry.c b/src/dentry.c index b371d31a..0e0bfd5d 100644 --- a/src/dentry.c +++ b/src/dentry.c @@ -998,10 +998,13 @@ dentry_tree_clear_inode_visited(struct wim_dentry *root) for_dentry_in_tree(root, dentry_clear_inode_visited, NULL); } -/* Frees a WIM dentry. +/* + * Free a WIM dentry. * - * The corresponding inode (if any) is freed only if its link count is - * decremented to 0. */ + * In addition to freeing the dentry itself, this decrements the link count of + * the corresponding inode (if any). If the inode's link count reaches 0, the + * inode is freed as well. + */ void free_dentry(struct wim_dentry *dentry) { @@ -1022,16 +1025,8 @@ do_free_dentry(struct wim_dentry *dentry, void *_lookup_table) { struct wim_lookup_table *lookup_table = _lookup_table; - if (lookup_table) { - struct wim_inode *inode = dentry->d_inode; - for (unsigned i = 0; i <= inode->i_num_ads; i++) { - struct wim_lookup_table_entry *lte; - - lte = inode_stream_lte(inode, i, lookup_table); - if (lte) - lte_decrement_refcnt(lte, lookup_table); - } - } + if (lookup_table) + inode_unref_streams(dentry->d_inode, lookup_table); free_dentry(dentry); return 0; } diff --git a/src/inode.c b/src/inode.c index 0a2c42b7..e2f29163 100644 --- a/src/inode.c +++ b/src/inode.c @@ -837,6 +837,20 @@ inode_ref_streams(struct wim_inode *inode) } } +void +inode_unref_streams(struct wim_inode *inode, + struct wim_lookup_table *lookup_table) +{ + struct wim_lookup_table_entry *lte; + unsigned i; + + for (i = 0; i <= inode->i_num_ads; i++) { + lte = inode_stream_lte(inode, i, lookup_table); + if (lte) + lte_decrement_refcnt(lte, lookup_table); + } +} + int init_inode_table(struct wim_inode_table *table, size_t capacity) { diff --git a/src/mount_image.c b/src/mount_image.c index 1fc4e1d6..1578353f 100644 --- a/src/mount_image.c +++ b/src/mount_image.c @@ -370,32 +370,21 @@ wim_pathname_to_inode(WIMStruct *wim, const tchar *path) return NULL; } -/* Remove a dentry from a mounted WIM image; i.e. remove an alias for the - * corresponding inode. - * - * If there are no remaining references to the inode either through dentries or - * open file descriptors, the inode is freed. Otherwise, the inode is not - * removed, but the dentry is unlinked and freed. - * - * Either way, all lookup table entries referenced by the inode have their - * reference count decremented. If a lookup table entry has no open file - * descriptors and no references remaining, it is freed, and the corresponding - * staging file is unlinked. +/* + * Remove a dentry from a mounted WIM image; i.e. remove an alias for an inode. */ static void remove_dentry(struct wim_dentry *dentry, struct wim_lookup_table *lookup_table) { - struct wim_inode *inode = dentry->d_inode; - struct wim_lookup_table_entry *lte; - unsigned i; + /* Put a reference to each stream the inode contains. */ + inode_unref_streams(dentry->d_inode, lookup_table); - for (i = 0; i <= inode->i_num_ads; i++) { - lte = inode_stream_lte(inode, i, lookup_table); - if (lte) - lte_decrement_refcnt(lte, lookup_table); - } + /* Unlink the dentry from the image's dentry tree. */ unlink_dentry(dentry); + + /* Delete the dentry. This will also decrement the link count of the + * corresponding inode. */ free_dentry(dentry); } -- 2.43.0