]> wimlib.net Git - wimlib/blobdiff - src/mount.c
Make different threads use different FILE*'s
[wimlib] / src / mount.c
index 6bc1fdff0e2e2c110f0bdff031413d019b1aadf9..dc1e7d91b6faa59f610a255ee9147f11af24fb4f 100644 (file)
@@ -497,11 +497,9 @@ out_delete_staging_file:
 }
 
 /*
- * Creates a randomly named staging directory and returns its name into the
- * static variable staging_dir_name.
- *
- * If the staging directory cannot be created, staging_dir_name is set to NULL.
- * */
+ * Creates a randomly named staging directory and saves its name in the
+ * filesystem context structure.
+ */
 static int make_staging_dir(struct wimfs_context *ctx)
 {
        /* XXX Give the user an option of where to stage files */
@@ -876,7 +874,7 @@ static int rebuild_wim(struct wimfs_context *ctx, bool check_integrity)
 
 
        DEBUG("Closing all staging file descriptors.");
-       list_for_each_entry(lte, &ctx->staging_list, staging_list) {
+       list_for_each_entry_safe(lte, tmp, &ctx->staging_list, staging_list) {
                ret = inode_close_fds(lte->lte_inode);
                if (ret != 0)
                        return ret;
@@ -1058,7 +1056,8 @@ static int wimfs_getxattr(const char *path, const char *name, char *value,
        if (res_size > size)
                return -ERANGE;
 
-       ret = read_full_wim_resource(lte, (u8*)value);
+       ret = read_full_wim_resource(lte, (u8*)value,
+                                    WIMLIB_RESOURCE_FLAG_MULTITHREADED);
        if (ret != 0)
                return -EIO;
 
@@ -1336,6 +1335,8 @@ static int wimfs_read(const char *path, char *buf, size_t size,
        } else {
                /* Read from WIM */
 
+               wimlib_assert(fd->f_lte->resource_location == RESOURCE_IN_WIM);
+
                u64 res_size = wim_resource_size(fd->f_lte);
 
                if (offset > res_size)
@@ -1344,7 +1345,8 @@ static int wimfs_read(const char *path, char *buf, size_t size,
                size = min(size, res_size - offset);
 
                if (read_wim_resource(fd->f_lte, (u8*)buf,
-                                     size, offset, false) != 0)
+                                     size, offset,
+                                     WIMLIB_RESOURCE_FLAG_MULTITHREADED) != 0)
                        return -EIO;
                return size;
        }
@@ -1398,7 +1400,8 @@ static int wimfs_readlink(const char *path, char *buf, size_t buf_len)
        if (!inode_is_symlink(inode))
                return -EINVAL;
 
-       ret = inode_readlink(inode, buf, buf_len, ctx->wim);
+       ret = inode_readlink(inode, buf, buf_len, ctx->wim,
+                            WIMLIB_RESOURCE_FLAG_MULTITHREADED);
        if (ret > 0)
                ret = 0;
        return ret;
@@ -1856,6 +1859,11 @@ WIMLIBAPI int wimlib_mount(WIMStruct *wim, int image, const char *dir,
        if (ret != 0)
                return ret;
 
+       if ((flags & WIMLIB_MOUNT_FLAG_READWRITE) && (wim->hdr.total_parts != 1)) {
+               ERROR("Cannot mount a split WIM read-write");
+               return WIMLIB_ERR_SPLIT_UNSUPPORTED;
+       }
+
        if (num_additional_swms) {
                ret = new_joined_lookup_table(wim, additional_swms,
                                              num_additional_swms,
@@ -1877,7 +1885,14 @@ WIMLIBAPI int wimlib_mount(WIMStruct *wim, int image, const char *dir,
 
        if (imd->root_dentry->refcnt != 1) {
                ERROR("Cannot mount image that was just exported with "
-                     "wimlib_export()");
+                     "wimlib_export_image()");
+               ret = WIMLIB_ERR_INVALID_PARAM;
+               goto out;
+       }
+
+       if (imd->modified) {
+               ERROR("Cannot mount image that was added "
+                     "with wimlib_add_image()");
                ret = WIMLIB_ERR_INVALID_PARAM;
                goto out;
        }