X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fmount_image.c;h=1578353fe9ea21c560568b2e146dda78861b8767;hb=067245fb775d108fd06b0628935ece5dd94b58ce;hp=a7dc82a17effae690f2da278dd51dc71f3d3198d;hpb=00ae9e9cf11e1f7a108b63db0fc538180a81880a;p=wimlib diff --git a/src/mount_image.c b/src/mount_image.c index a7dc82a1..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); } @@ -1193,9 +1182,11 @@ release_extra_refcnts(struct wimfs_context *ctx) struct wim_lookup_table *lookup_table = ctx->wim->lookup_table; struct wim_lookup_table_entry *lte, *tmp; - list_for_each_entry_safe(lte, tmp, list, orig_stream_list) - while (lte->out_refcnt--) + list_for_each_entry_safe(lte, tmp, list, orig_stream_list) { + u32 n = lte->out_refcnt; + while (n--) lte_decrement_refcnt(lte, lookup_table); + } } /* Moves the currently selected image, which may have been modified, to a new @@ -2161,7 +2152,7 @@ static int wimfs_rename(const char *from, const char *to) { return rename_wim_path(wimfs_get_WIMStruct(), from, to, - WIMLIB_CASE_SENSITIVE); + WIMLIB_CASE_SENSITIVE, NULL); } /* Remove a directory */