X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fmount_image.c;h=8037a38f0da5b6a89dc24f2fb08fe78bde78e26a;hb=0e3f2a2ce4cbb624a831d9862da447eaf889e9bd;hp=270e6177c31b6dec0c6bae05bbb47d85fa2d5c2a;hpb=e1de430f021ea1d98214149886d42a5525e7b4e2;p=wimlib diff --git a/src/mount_image.c b/src/mount_image.c index 270e6177..8037a38f 100644 --- a/src/mount_image.c +++ b/src/mount_image.c @@ -39,6 +39,8 @@ #define FUSE_USE_VERSION 26 +#include /* sometimes required before */ + #include #include #include @@ -50,7 +52,6 @@ #include #include #include -#include #include #include @@ -357,7 +358,7 @@ inode_get_data_stream_tstr(const struct wim_inode *inode, struct wim_inode_stream *strm; if (!stream_name || !*stream_name) { - strm = inode_get_unnamed_stream(inode, STREAM_TYPE_DATA); + strm = inode_get_unnamed_data_stream(inode); } else { const utf16lechar *uname; @@ -502,8 +503,8 @@ create_file(struct fuse_context *fuse_ctx, const char *path, } } - list_add_tail(&new_inode->i_list, - &wim_get_current_image_metadata(wimfs_ctx->wim)->inode_list); + hlist_add_head(&new_inode->i_hlist, + &wim_get_current_image_metadata(wimfs_ctx->wim)->inode_list); dentry_add_child(parent, new_dentry); @@ -939,17 +940,20 @@ delete_staging_dir(struct wimfs_context *ctx) close(ctx->parent_dir_fd); } -/* Number the inodes in the mounted image sequentially. */ static void -reassign_inode_numbers(struct wimfs_context *ctx) +prepare_inodes(struct wimfs_context *ctx) { struct wim_image_metadata *imd; struct wim_inode *inode; ctx->next_ino = 1; imd = wim_get_current_image_metadata(ctx->wim); - image_for_each_inode(inode, imd) + image_for_each_inode(inode, imd) { inode->i_ino = ctx->next_ino++; + inode->i_num_opened_fds = 0; + inode->i_num_allocated_fds = 0; + inode->i_fds = NULL; + } } static void @@ -1001,12 +1005,13 @@ inode_close_fds(struct wim_inode *inode) static void close_all_fds(struct wimfs_context *ctx) { - struct wim_inode *inode, *tmp; + struct wim_inode *inode; + struct hlist_node *tmp; struct wim_image_metadata *imd; imd = wim_get_current_image_metadata(ctx->wim); - list_for_each_entry_safe(inode, tmp, &imd->inode_list, i_list) + image_for_each_inode_safe(inode, tmp, imd) inode_close_fds(inode); } @@ -1631,7 +1636,7 @@ wimfs_opendir(const char *path, struct fuse_file_info *fi) return -errno; if (!inode_is_directory(inode)) return -ENOTDIR; - strm = inode_get_unnamed_stream(inode, STREAM_TYPE_DATA); + strm = inode_get_unnamed_data_stream(inode); if (!strm) return -ENOTDIR; ret = alloc_wimfs_fd(inode, strm, &fd); @@ -2143,6 +2148,11 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, return ret; } + if (wim_has_solid_resources(wim)) { + WARNING("Mounting a WIM file containing solid-compressed data; " + "file access may be slow."); + } + /* If the user did not specify an interface for accessing named * data streams, use the default (extended attributes). */ if (!(mount_flags & (WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_NONE | @@ -2199,8 +2209,9 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, } } - /* Assign new inode numbers. */ - reassign_inode_numbers(&ctx); + /* Number the inodes in the mounted image sequentially and initialize + * the file descriptor arrays */ + prepare_inodes(&ctx); /* If a read-write mount, mark the image as modified. */ if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE)