}
}
- new_lte->refcnt = inode->i_nlink;
- new_lte->resource_location = RESOURCE_IN_STAGING_FILE;
- new_lte->staging_file_name = staging_file_name;
- new_lte->lte_inode = inode;
+ new_lte->refcnt = inode->i_nlink;
+ new_lte->resource_location = RESOURCE_IN_STAGING_FILE;
+ new_lte->staging_file_name = staging_file_name;
+ new_lte->resource_entry.original_size = size;
- struct wim_lookup_table_entry **back_ptr;
-
- if (stream_id == 0) {
- back_ptr = &inode->i_lte;
- } else {
- for (u16 i = 0; ; i++) {
- wimlib_assert(i < inode->i_num_ads);
- if (inode->i_ads_entries[i].stream_id == stream_id) {
- back_ptr = &inode->i_ads_entries[i].lte;
- break;
- }
- }
- }
-
- lookup_table_insert_unhashed(ctx->wim->lookup_table, new_lte, back_ptr);
+ lookup_table_insert_unhashed(ctx->wim->lookup_table, new_lte,
+ inode, stream_id);
*lte = new_lte;
return 0;
out_revert_fd_changes:
wimlib_progress_func_t progress_func)
{
int ret;
- struct wim_lookup_table_entry *lte;
+ struct wim_lookup_table_entry *lte, *tmp;
WIMStruct *w = ctx->wim;
struct wim_image_metadata *imd = wim_get_current_image_metadata(ctx->wim);
DEBUG("Closing all staging file descriptors.");
- image_for_each_unhashed_stream(lte, imd) {
- ret = inode_close_fds(lte->lte_inode);
+ image_for_each_unhashed_stream_safe(lte, tmp, imd) {
+ ret = inode_close_fds(lte->back_inode);
if (ret)
return ret;
}
DEBUG("Freeing entries for zero-length streams");
- image_for_each_unhashed_stream(lte, imd) {
+ image_for_each_unhashed_stream_safe(lte, tmp, imd) {
+ wimlib_assert(lte->unhashed);
if (wim_resource_size(lte) == 0) {
- *lte->back_ptr = NULL;
+ print_lookup_table_entry(lte, stderr);
+ struct wim_lookup_table_entry **back_ptr;
+ back_ptr = retrieve_lte_pointer(lte);
+ *back_ptr = NULL;
+ list_del(<e->unhashed_list);
free_lookup_table_entry(lte);
}
}
u16 stream_idx;
u32 stream_id;
struct wimfs_context *ctx = wimfs_get_context();
+ struct wim_lookup_table_entry **back_ptr;
ret = lookup_resource(ctx->wim, path, get_lookup_flags(ctx),
&dentry, <e, &stream_idx);
inode = dentry->d_inode;
- if (stream_idx == 0)
+ if (stream_idx == 0) {
stream_id = 0;
- else
+ back_ptr = &inode->i_lte;
+ } else {
stream_id = inode->i_ads_entries[stream_idx - 1].stream_id;
+ back_ptr = &inode->i_ads_entries[stream_idx - 1].lte;
+ }
/* The file resource may be in the staging directory (read-write mounts
* only) or in the WIM. If it's in the staging directory, we need to
<e, size, ctx);
if (ret != 0)
return ret;
+ *back_ptr = lte;
}
+ print_lookup_table_entry(lte, stderr);
ret = alloc_wimfs_fd(inode, stream_id, lte, &fd,
wimfs_ctx_readonly(ctx));
if (lte == NULL && size == 0)
return 0;
- inode = dentry->d_inode;
- if (stream_idx == 0)
- stream_id = 0;
- else
- stream_id = inode->i_ads_entries[stream_idx - 1].stream_id;
-
if (lte->resource_location == RESOURCE_IN_STAGING_FILE) {
ret = truncate(lte->staging_file_name, size);
- if (ret != 0)
+ if (ret)
ret = -errno;
+ else
+ lte->resource_entry.original_size = size;
} else {
/* File in WIM. Extract it to the staging directory, but only
* the first @size bytes of it. */
+ inode = dentry->d_inode;
+ if (stream_idx == 0)
+ stream_id = 0;
+ else
+ stream_id = inode->i_ads_entries[stream_idx - 1].stream_id;
ret = extract_resource_to_staging_dir(inode, stream_id,
<e, size, ctx);
}
- if (ret == 0)
- lte->resource_entry.original_size = size;
return ret;
}
return -errno;
/* Update file size */
- if (offset + size > fd->f_lte->resource_entry.original_size)
+ if (offset + size > fd->f_lte->resource_entry.original_size) {
+ DEBUG("Update file size %"PRIu64 " => %"PRIu64"",
+ fd->f_lte->resource_entry.original_size,
+ offset + size);
fd->f_lte->resource_entry.original_size = offset + size;
+ }
/* Update timestamps */
touch_inode(fd->f_inode);
goto out;
}
+ ret = wim_checksum_unhashed_streams(wim);
+ if (ret)
+ goto out;
+
ret = select_wim_image(wim, image);
if (ret)
goto out;
WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_WINDOWS)))
mount_flags |= WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_XATTR;
-
DEBUG("Initializing struct wimfs_context");
init_wimfs_context(&ctx);
ctx.wim = wim;
ctx.image_inode_list = &imd->inode_list;
ctx.default_uid = getuid();
ctx.default_gid = getgid();
+ wimlib_assert(list_empty(&imd->unhashed_streams));
ctx.wim->lookup_table->unhashed_streams = &imd->unhashed_streams;
if (mount_flags & WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_WINDOWS)
ctx.default_lookup_flags = LOOKUP_FLAG_ADS_OK;
#endif
/* Mark dentry tree as modified if read-write mount. */
- if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) {
+ if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE)
imd->modified = 1;
- imd->has_been_mounted_rw = 1;
- }
/* Resolve the lookup table entries for every inode in the image, and
* assign inode numbers */