]> wimlib.net Git - wimlib/commitdiff
Factor out inode_unref_streams()
authorEric Biggers <ebiggers3@gmail.com>
Tue, 13 May 2014 00:47:56 +0000 (19:47 -0500)
committerEric Biggers <ebiggers3@gmail.com>
Tue, 13 May 2014 00:47:56 +0000 (19:47 -0500)
include/wimlib/inode.h
src/dentry.c
src/inode.c
src/mount_image.c

index e2bc46fe7f6163531847af9c1ae8bc91c500142c..04ec9682ad5886da5a55532401ba614e0e393b69 100644 (file)
@@ -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);
index b371d31adc9b305231189c8ece6d715f12c563f1..0e0bfd5df73832c17a39cabd13f9a50d440cf985 100644 (file)
@@ -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;
 }
index 0a2c42b79e701a040dad57368d3e8828ae5e61cc..e2f291631a043048273daf47fd1a958dc4209a2e 100644 (file)
@@ -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)
 {
index 1fc4e1d618d39aa3064f1e2e3b3a57332263c93e..1578353fe9ea21c560568b2e146dda78861b8767 100644 (file)
@@ -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);
 }