* Freed and set to NULL after the extraction is done (either
* success or failure). */
tchar *i_extracted_file;
+
+#ifdef WITH_FUSE
+ /* Used only during image mount: Table of file descriptors that
+ * have been opened to this inode. The table is automatically
+ * freed when the last file descriptor is closed. */
+ struct {
+ struct wimfs_fd **i_fds;
+ u16 i_num_opened_fds;
+ u16 i_num_allocated_fds;
+ };
+#endif
};
/* Next alternate data stream ID to be assigned */
u32 i_next_stream_id;
-
-#ifdef WITH_FUSE
- /* wimfs file descriptors table for the inode */
- u16 i_num_opened_fds;
- u16 i_num_allocated_fds;
- struct wimfs_fd **i_fds;
-#endif
};
#define inode_for_each_dentry(dentry, inode) \
destroy_ads_entry(&inode->i_ads_entries[i]);
FREE(inode->i_ads_entries);
}
- #ifdef WITH_FUSE
- wimlib_assert(inode->i_num_opened_fds == 0);
- FREE(inode->i_fds);
- #endif
/* HACK: This may instead delete the inode from i_list, but the
* hlist_del() behaves the same as list_del(). */
if (!hlist_unhashed(&inode->i_hlist))
inode->i_fds[fd->idx] = NULL;
FREE(fd);
- if (--inode->i_num_opened_fds == 0 && inode->i_nlink == 0)
- free_inode(inode);
+ if (--inode->i_num_opened_fds == 0) {
+ FREE(inode->i_fds);
+ inode->i_fds = NULL;
+ inode->i_num_allocated_fds = 0;
+ if (inode->i_nlink == 0)
+ free_inode(inode);
+ }
}
static int