]> wimlib.net Git - wimlib/blobdiff - src/mount_image.c
resource reading cleanups
[wimlib] / src / mount_image.c
index 87620defc68daf0daf2356fc2577afb4cee995bd..d9aa23cb69fbdd28f272db5c500fd3dcc80c6448 100644 (file)
@@ -39,6 +39,8 @@
 
 #define FUSE_USE_VERSION 26
 
+#include <sys/types.h> /* sometimes required before <attr/xattr.h> */
+
 #include <attr/xattr.h>
 #include <dirent.h>
 #include <errno.h>
@@ -50,7 +52,6 @@
 #include <string.h>
 #include <sys/stat.h>
 #include <sys/time.h>
-#include <sys/types.h>
 #include <unistd.h>
 #include <utime.h>
 
@@ -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);
 
@@ -716,7 +717,7 @@ extract_blob_to_staging_dir(struct wim_inode *inode,
                filedes_init(&fd, staging_fd);
                errno = 0;
                extract_size = min(old_blob->size, size);
-               result = extract_blob_to_fd(old_blob, &fd, extract_size);
+               result = extract_blob_prefix_to_fd(old_blob, extract_size, &fd);
        } else {
                extract_size = 0;
                result = 0;
@@ -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);
 }
 
@@ -1306,9 +1311,9 @@ wimfs_getxattr(const char *path, const char *name, char *value,
               size_t size)
 {
        const struct wimfs_context *ctx = wimfs_get_context();
-       struct wim_inode *inode;
-       struct wim_inode_stream *strm;
-       struct blob_descriptor *blob;
+       const struct wim_inode *inode;
+       const struct wim_inode_stream *strm;
+       const struct blob_descriptor *blob;
 
        if (!strncmp(name, "wimfs.", 6)) {
                /* Handle some magical extended attributes.  These really should
@@ -1381,7 +1386,7 @@ wimfs_getxattr(const char *path, const char *name, char *value,
                if (size < blob->size)
                        return -ERANGE;
 
-               if (read_full_blob_into_buf(blob, value))
+               if (read_blob_into_buf(blob, value))
                        return errno ? -errno : -EIO;
        }
        return blob->size;
@@ -1664,7 +1669,7 @@ wimfs_read(const char *path, char *buf, size_t size,
 
        switch (blob->blob_location) {
        case BLOB_IN_WIM:
-               if (read_partial_wim_blob_into_buf(blob, size, offset, buf))
+               if (read_partial_wim_blob_into_buf(blob, offset, size, buf))
                        ret = errno ? -errno : -EIO;
                else
                        ret = size;
@@ -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)