#endif
};
+struct stream_owner {
+ struct wim_inode *inode;
+ const utf16lechar *stream_name;
+};
+
/* Specification for a stream, which may be the contents of a file (unnamed data
* stream), a named data stream, reparse point data, or a WIM metadata resource.
*
* need this.) */
u32 dont_check_metadata_hash : 1;
+ u32 may_send_done_with_file : 1;
+
+ /* Only used by wimlib_export_image() */
+ u32 was_exported : 1;
+
union {
/* (On-disk field) SHA1 message digest of the stream referenced
* by this lookup table entry. */
/* Number of times this lookup table entry is referenced by dentries in
* the WIM. When a WIM's lookup table is read, this field is
- * initialized from a corresponding entry; while it should be correct,
- * in general it may not be. wim_recalculate_refcnts() recalculates the
- * reference counts for all streams and is run before doing any
- * deletions. */
+ * initialized from a corresponding entry.
+ *
+ * However, see lte_decrement_refcnt() for information about the
+ * limitations of this field. */
u32 refcnt;
/* When a WIM file is written, this is set to the number of references
* (by dentries) to this stream in the output WIM file.
*
- * During extraction, this is set to the number of times the stream must
- * be extracted.
+ * During extraction, this is the number of slots in stream_owners (or
+ * inline_stream_owners) that have been filled.
*
* During image export, this is set to the number of references of this
* stream that originated from the source WIM.
struct wim_resource_spec *rspec;
u64 offset_in_res;
};
- tchar *file_on_disk;
+ struct {
+ tchar *file_on_disk;
+ struct wim_inode *file_inode;
+ };
void *attached_buffer;
#ifdef WITH_FUSE
- tchar *staging_file_name;
+ struct {
+ char *staging_file_name;
+ int staging_dir_fd;
+ };
#endif
#ifdef WITH_NTFS_3G
struct ntfs_location *ntfs_loc;
*/
struct list_head rspec_node;
- /* This field is used during the hardlink and symlink image extraction
- * modes. In these modes, all identical files are linked together, and
- * @extracted_file will be set to the filename of the first extracted
- * file containing this stream. */
- tchar *extracted_file;
-
/* Temporary fields */
union {
/* Fields used temporarily during WIM file writing. */
struct wim_reshdr out_reshdr;
};
- /* Used temporarily during extraction */
+ /* Used temporarily during extraction. This is an array of
+ * pointers to the inodes being extracted that use this stream.
+ */
union {
- /* Dentries to extract that reference this stream.
+ /* Inodes to extract that reference this stream.
* out_refcnt tracks the number of slots filled. */
- struct wim_dentry *inline_lte_dentries[7];
+ struct stream_owner inline_stream_owners[3];
struct {
- struct wim_dentry **lte_dentries;
- size_t alloc_lte_dentries;
+ struct stream_owner *stream_owners;
+ u32 alloc_stream_owners;
};
};
-
- /* Actual reference count to this stream (only used while
- * verifying an image). */
- u32 real_refcnt;
};
/* Temporary list fields. */
extern int
lte_zero_out_refcnt(struct wim_lookup_table_entry *lte, void *ignore);
-extern int
-lte_zero_real_refcnt(struct wim_lookup_table_entry *lte, void *ignore);
-
-extern int
-lte_free_extracted_file(struct wim_lookup_table_entry *lte, void *ignore);
-
static inline bool
lte_is_partial(const struct wim_lookup_table_entry * lte)
{
lte->size != lte->rspec->uncompressed_size;
}
-static inline bool
-lte_filename_valid(const struct wim_lookup_table_entry *lte)
+static inline const struct stream_owner *
+stream_owners(struct wim_lookup_table_entry *stream)
{
- return lte->resource_location == RESOURCE_IN_FILE_ON_DISK
- #ifdef __WIN32__
- || lte->resource_location == RESOURCE_WIN32_ENCRYPTED
- #endif
- #ifdef WITH_FUSE
- || lte->resource_location == RESOURCE_IN_STAGING_FILE
- #endif
- ;
+ if (stream->out_refcnt <= ARRAY_LEN(stream->inline_stream_owners))
+ return stream->inline_stream_owners;
+ else
+ return stream->stream_owners;
}
static inline void