- WIMStruct *w = wim;
- struct list_head *stream_list = w->private;
- struct lookup_table_entry *lte;
- for (unsigned i = 0; i <= dentry->d_inode->num_ads; i++) {
- lte = inode_stream_lte(dentry->d_inode, i, w->lookup_table);
- if (lte && ++lte->out_refcnt == 1)
- list_add_tail(<e->staging_list, stream_list);
+ struct lte_overwrite_prepare_args *args = arg;
+
+ if (lte->resource_location == RESOURCE_IN_WIM &&
+ lte->wim == args->wim &&
+ lte->resource_entry.offset + lte->resource_entry.size > args->end_offset)
+ {
+ #ifdef ENABLE_ERROR_MESSAGES
+ ERROR("The following resource is after the XML data:");
+ print_lookup_table_entry(lte, stderr);
+ #endif
+ return WIMLIB_ERR_RESOURCE_ORDER;
+ }
+
+ lte->out_refcnt = lte->refcnt;
+ memcpy(<e->output_resource_entry, <e->resource_entry,
+ sizeof(struct resource_entry));
+ if (!(lte->resource_entry.flags & WIM_RESHDR_FLAG_METADATA))
+ if (lte->resource_location != RESOURCE_IN_WIM || lte->wim != args->wim)
+ list_add(<e->staging_list, args->stream_list);
+ return 0;
+}
+
+static int
+wim_prepare_streams(WIMStruct *wim, off_t end_offset,
+ struct list_head *stream_list)
+{
+ struct lte_overwrite_prepare_args args = {
+ .wim = wim,
+ .end_offset = end_offset,
+ .stream_list = stream_list,
+ };
+ int ret;
+
+ for (int i = 0; i < wim->hdr.image_count; i++) {
+ ret = lte_overwrite_prepare(wim->image_metadata[i].metadata_lte,
+ &args);
+ if (ret)
+ return ret;
+ }
+ return for_lookup_table_entry(wim->lookup_table,
+ lte_overwrite_prepare, &args);
+}
+
+static int
+inode_find_streams_to_write(struct wim_inode *inode,
+ struct wim_lookup_table *table,
+ struct list_head *stream_list)
+{
+ struct wim_lookup_table_entry *lte;
+ for (unsigned i = 0; i <= inode->i_num_ads; i++) {
+ lte = inode_stream_lte(inode, i, table);
+ if (lte) {
+ if (lte->out_refcnt == 0)
+ list_add_tail(<e->staging_list, stream_list);
+ lte->out_refcnt += inode->i_nlink;
+ }