inode->i_security_id = -1;
/*inode->i_nlink = 0;*/
inode->i_not_rpfixed = 1;
- INIT_LIST_HEAD(&inode->i_list);
INIT_LIST_HEAD(&inode->i_dentry);
inode->i_streams = inode->i_embedded_streams;
if (set_timestamps) {
FREE(inode->i_streams);
if (inode->i_extra)
FREE(inode->i_extra);
- /* HACK: This may instead delete the inode from i_list, but hlist_del()
- * behaves the same as list_del(). */
if (!hlist_unhashed(&inode->i_hlist))
hlist_del(&inode->i_hlist);
FREE(inode);
const void *data, size_t size,
struct blob_table *blob_table)
{
- struct blob_descriptor *new_blob;
+ struct blob_descriptor *new_blob = NULL;
- new_blob = new_blob_from_data_buffer(data, size, blob_table);
- if (!new_blob)
- return false;
+ if (size) {
+ new_blob = new_blob_from_data_buffer(data, size, blob_table);
+ if (!new_blob)
+ return false;
+ }
inode_replace_stream_blob(inode, strm, new_blob, blob_table);
return true;
struct blob_table *blob_table)
{
struct wim_inode_stream *strm;
- struct blob_descriptor *blob;
+ struct blob_descriptor *blob = NULL;
strm = inode_add_stream(inode, stream_type, stream_name, NULL);
if (!strm)
return false;
- blob = new_blob_from_data_buffer(data, size, blob_table);
- if (!blob) {
- inode_remove_stream(inode, strm, blob_table);
- return false;
+ if (size) {
+ blob = new_blob_from_data_buffer(data, size, blob_table);
+ if (unlikely(!blob)) {
+ inode_remove_stream(inode, strm, blob_table);
+ return false;
+ }
}
inode_set_stream_blob(inode, strm, blob);
*
* If @force is %false:
* If any of the needed blobs do not exist in @table, return
- * WIMLIB_ERR_RESOURCE_NOT_FOUND and leave the inode unmodified.
+ * WIMLIB_ERR_RESOURCE_NOT_FOUND.
* If @force is %true:
* If any of the needed blobs do not exist in @table, allocate new blob
* descriptors for them and insert them into @table. This does not, of
inode_resolve_streams(struct wim_inode *inode, struct blob_table *table,
bool force)
{
- struct blob_descriptor *blobs[inode->i_num_streams];
-
for (unsigned i = 0; i < inode->i_num_streams; i++) {
+ struct wim_inode_stream *strm = &inode->i_streams[i];
- if (inode->i_streams[i].stream_resolved)
+ if (strm->stream_resolved)
continue;
- const u8 *hash = stream_hash(&inode->i_streams[i]);
+ const u8 *hash = stream_hash(strm);
struct blob_descriptor *blob = NULL;
if (!is_zero_hash(hash)) {
blob_table_insert(table, blob);
}
}
- blobs[i] = blob;
- }
-
- for (unsigned i = 0; i < inode->i_num_streams; i++) {
- if (!inode->i_streams[i].stream_resolved) {
- inode->i_streams[i]._stream_blob = blobs[i];
- inode->i_streams[i].stream_resolved = 1;
- }
+ strm->_stream_blob = blob;
+ strm->stream_resolved = 1;
}
return 0;
}
-/* Undo the effects of inode_resolve_streams(). */
-void
-inode_unresolve_streams(struct wim_inode *inode)
-{
- for (unsigned i = 0; i < inode->i_num_streams; i++) {
-
- if (!inode->i_streams[i].stream_resolved)
- continue;
-
- copy_hash(inode->i_streams[i]._stream_hash,
- stream_hash(&inode->i_streams[i]));
- inode->i_streams[i].stream_resolved = 0;
- }
-}
-
int
blob_not_found_error(const struct wim_inode *inode, const u8 *hash)
{
{
const struct wim_inode_stream *strm;
- strm = inode_get_unnamed_stream(inode, STREAM_TYPE_DATA);
+ strm = inode_get_unnamed_data_stream(inode);
if (!strm)
return NULL;
{
const struct wim_inode_stream *strm;
- strm = inode_get_unnamed_stream(inode, STREAM_TYPE_DATA);
+ strm = inode_get_unnamed_data_stream(inode);
if (!strm)
return NULL;
{
const struct wim_inode_stream *strm;
- strm = inode_get_unnamed_stream(inode, STREAM_TYPE_DATA);
+ strm = inode_get_unnamed_data_stream(inode);
if (!strm)
return zero_hash;