X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fmount_image.c;h=1578353fe9ea21c560568b2e146dda78861b8767;hb=a0bee8fd4aed91f2ec4da35077dad47582a12a72;hp=ac993e17b2f7f54cc366780832c84b30ee5a865a;hpb=668b627e9c3400a579d7057038e03e6977369c4b;p=wimlib diff --git a/src/mount_image.c b/src/mount_image.c index ac993e17..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); } @@ -2163,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 */