union {
u8 _stream_hash[SHA1_HASH_SIZE];
struct blob_descriptor *_stream_blob;
- };
+ } _packed_attribute; /* union is SHA1_HASH_SIZE bytes */
/* 'stream_resolved' determines whether 'stream_hash' or 'stream_blob'
* is valid as described above. */
/* List of dentries that are aliases for this inode. There will be
* i_nlink dentries in this list. */
- struct list_head i_dentry;
+ struct hlist_head i_dentry;
/* Field to place this inode into a list. While reading a WIM image or
* adding files to a WIM image this is owned by the inode table;
struct hlist_node i_hlist;
/* Number of dentries that are aliases for this inode. */
- u32 i_nlink;
+ u32 i_nlink : 30;
/* Flag used to mark this inode as visited; this is used when visiting
* all the inodes in a dentry tree exactly once. It will be 0 by
* default and must be cleared following the tree traversal, even in
* error paths. */
- u8 i_visited : 1;
+ u32 i_visited : 1;
/* Cached value */
- u8 i_can_externally_back : 1;
+ u32 i_can_externally_back : 1;
/* If not NULL, a pointer to the extra data that was read from the
* dentry. This should be a series of tagged items, each of which
/* Corresponds to 'security_id' in `struct wim_dentry_on_disk': The
* index of this inode's security descriptor in the WIM image's table of
- * security descriptors, or -1. Note: when a WIM image is loaded,
- * wimlib sets out-of-bounds indices and values less than -1 in this
- * field to -1. So the extraction code need not do an upper bound check
- * after checking for -1 (or equivalently < 0). */
+ * security descriptors, or -1 if this inode does not have a security
+ * descriptor. */
s32 i_security_id;
/* Unknown field that we only read into memory so we can re-write it
/* Fields used only during extraction */
struct {
- /* List of aliases of this dentry that are being
- * extracted in the current extraction operation. This
- * will be a (possibly nonproper) subset of the dentries
- * in the i_dentry list. This list will be constructed
+ /* A singly linked list of aliases of this dentry that
+ * are being extracted in the current extraction
+ * operation. This list may be shorter than the inode's
+ * full alias list. This list will be constructed
* regardless of whether the extraction backend supports
* hard links or not. */
- struct list_head i_extraction_aliases;
+ struct wim_dentry *i_first_extraction_alias;
#ifdef WITH_NTFS_3G
/* In NTFS-3g extraction mode, this is set to the Master
* WIMLIB_WRITE_FLAG_SEND_DONE_WITH_FILE_MESSAGES: the number
* of streams this inode has that have not yet been fully read.
* */
- u32 num_remaining_streams;
+ u32 i_num_remaining_streams;
#ifdef WITH_FUSE
struct {
/* Iterate through each alias of the specified inode. */
#define inode_for_each_dentry(dentry, inode) \
- list_for_each_entry((dentry), &(inode)->i_dentry, d_alias)
+ hlist_for_each_entry((dentry), &(inode)->i_dentry, d_alias)
/* Return an alias of the specified inode. */
#define inode_first_dentry(inode) \
- container_of(inode->i_dentry.next, struct wim_dentry, d_alias)
+ hlist_entry(inode->i_dentry.first, struct wim_dentry, d_alias)
/* Return the full path of an alias of the specified inode, or NULL if a full
* path could not be determined. */
return inode->i_children != NULL;
}
+/* Does the inode have a security descriptor? */
+static inline bool
+inode_has_security_descriptor(const struct wim_inode *inode)
+{
+ return inode->i_security_id >= 0;
+}
+
extern struct wim_inode_stream *
inode_get_stream(const struct wim_inode *inode, int stream_type,
const utf16lechar *stream_name);