+ imd->metadata_lte = NULL;
+ }
+ if (!table) {
+ struct wim_lookup_table_entry *lte, *tmp;
+ list_for_each_entry_safe(lte, tmp, &imd->unhashed_streams, unhashed_list)
+ free_lookup_table_entry(lte);
+ }
+ INIT_LIST_HEAD(&imd->unhashed_streams);
+ INIT_LIST_HEAD(&imd->inode_list);
+#ifdef WITH_NTFS_3G
+ if (imd->ntfs_vol) {
+ do_ntfs_umount(imd->ntfs_vol);
+ imd->ntfs_vol = NULL;
+ }
+#endif
+}
+
+void
+put_image_metadata(struct wim_image_metadata *imd,
+ struct wim_lookup_table *table)
+{
+ if (imd && --imd->refcnt == 0) {
+ destroy_image_metadata(imd, table, true);
+ FREE(imd);
+ }
+}
+
+/* Appends the specified image metadata structure to the array of image metadata
+ * for a WIM, and increments the image count. */
+int
+append_image_metadata(WIMStruct *w, struct wim_image_metadata *imd)
+{
+ struct wim_image_metadata **imd_array;
+
+ DEBUG("Reallocating image metadata array for image_count = %u",
+ w->hdr.image_count + 1);
+ imd_array = REALLOC(w->image_metadata,
+ sizeof(w->image_metadata[0]) * (w->hdr.image_count + 1));
+
+ if (!imd_array)
+ return WIMLIB_ERR_NOMEM;
+ w->image_metadata = imd_array;
+ imd_array[w->hdr.image_count++] = imd;
+ return 0;
+}
+
+
+struct wim_image_metadata *
+new_image_metadata()
+{
+ struct wim_image_metadata *imd;
+
+ imd = CALLOC(1, sizeof(*imd));
+ if (imd) {
+ imd->refcnt = 1;
+ INIT_LIST_HEAD(&imd->inode_list);
+ INIT_LIST_HEAD(&imd->unhashed_streams);
+ DEBUG("Created new image metadata (refcnt=1)");
+ } else {
+ ERROR_WITH_ERRNO("Failed to allocate new image metadata structure");