* resource is read again. */
u16 dont_check_metadata_hash : 1;
+ /* Only used during WIM write. Normal value is 0 (resource not
+ * filtered). */
+ u16 filtered : 2;
+#define FILTERED_SAME_WIM 0x1 /* Resource already in same WIM */
+#define FILTERED_EXTERNAL_WIM 0x2 /* Resource already in external WIM */
+
/* (On-disk field)
* Number of times this lookup table entry is referenced by dentries.
* Unfortunately, this field is not always set correctly in Microsoft's
return lte->resource_entry.original_size;
}
-static inline u64
-wim_resource_chunks(const struct wim_lookup_table_entry *lte)
+static inline u32
+wim_resource_chunk_size(const struct wim_lookup_table_entry * lte)
{
- return DIV_ROUND_UP(wim_resource_size(lte), WIM_CHUNK_SIZE);
+ if (lte->resource_location == RESOURCE_IN_WIM &&
+ lte->compression_type != WIMLIB_COMPRESSION_TYPE_NONE)
+ return lte->wim->chunk_size;
+ else
+ return 32768;
}
+
static inline u64
-wim_resource_compressed_size(const struct wim_lookup_table_entry *lte)
+wim_resource_chunks(const struct wim_lookup_table_entry *lte)
{
- return lte->resource_entry.size;
+ return DIV_ROUND_UP(wim_resource_size(lte), wim_resource_chunk_size(lte));
}
static inline int
wim_resource_compression_type(const struct wim_lookup_table_entry *lte)
{
- BUILD_BUG_ON(WIMLIB_COMPRESSION_TYPE_NONE != 0);
return lte->compression_type;
}
void *arg);
extern int
-cmp_streams_by_wim_position(const void *p1, const void *p2);
+sort_stream_list_by_sequential_order(struct list_head *stream_list,
+ size_t list_head_offset);
extern int
for_lookup_table_entry_pos_sorted(struct wim_lookup_table *table,
void *arg);
extern struct wim_lookup_table_entry *
-__lookup_resource(const struct wim_lookup_table *table, const u8 hash[]);
+lookup_resource(const struct wim_lookup_table *table, const u8 hash[]);
extern int
-lookup_resource(WIMStruct *wim, const tchar *path,
- int lookup_flags, struct wim_dentry **dentry_ret,
- struct wim_lookup_table_entry **lte_ret, u16 *stream_idx_ret);
+wim_pathname_to_stream(WIMStruct *wim, const tchar *path,
+ int lookup_flags,
+ struct wim_dentry **dentry_ret,
+ struct wim_lookup_table_entry **lte_ret,
+ u16 *stream_idx_ret);
extern void
lte_decrement_refcnt(struct wim_lookup_table_entry *lte,
inode_resolve_ltes(struct wim_inode *inode, struct wim_lookup_table *table,
bool force);
+extern int
+resource_not_found_error(const struct wim_inode *inode, const u8 *hash);
+
extern void
inode_unresolve_ltes(struct wim_inode *inode);
if (!table)
return NULL;
if (stream_idx == 0)
- return __lookup_resource(table, inode->i_hash);
+ return lookup_resource(table, inode->i_hash);
else
- return __lookup_resource(table,
+ return lookup_resource(table,
inode->i_ads_entries[
stream_idx - 1].hash);
}
return inode->i_ads_entries[stream_idx - 1].stream_name_nbytes;
}
+extern struct wim_lookup_table_entry *
+inode_unnamed_stream_resolved(const struct wim_inode *inode, u16 *stream_idx_ret);
+
extern struct wim_lookup_table_entry *
inode_unnamed_lte_resolved(const struct wim_inode *inode);
extern struct wim_lookup_table_entry *
inode_unnamed_lte(const struct wim_inode *inode, const struct wim_lookup_table *table);
+extern const u8 *
+inode_unnamed_stream_hash(const struct wim_inode *inode);
+
extern u64
lookup_table_total_stream_size(struct wim_lookup_table *table);