]> wimlib.net Git - wimlib/blobdiff - src/mount_image.c
Deprecate wimlib_print_wim_information()
[wimlib] / src / mount_image.c
index 5d96777317542add78ff278460a4877f7b67b856..ac914618cd5166fe8851545998fad613ccf113da 100644 (file)
@@ -194,8 +194,6 @@ alloc_wimfs_fd(struct wim_inode *inode,
        static const u16 max_fds = 0xffff;
        int ret;
 
-       pthread_mutex_lock(&inode->i_mutex);
-
        DEBUG("Allocating fd for stream ID %u from inode %#"PRIx64" "
              "(open = %u, allocated = %u)",
              stream_id, inode->i_ino, inode->i_num_opened_fds,
@@ -247,7 +245,6 @@ alloc_wimfs_fd(struct wim_inode *inode,
                }
        }
 out:
-       pthread_mutex_unlock(&inode->i_mutex);
        return ret;
 }
 
@@ -255,9 +252,6 @@ static void
 inode_put_fd(struct wim_inode *inode, struct wimfs_fd *fd)
 {
        wimlib_assert(inode != NULL);
-
-       pthread_mutex_lock(&inode->i_mutex);
-
        wimlib_assert(fd->f_inode == inode);
        wimlib_assert(inode->i_num_opened_fds != 0);
        wimlib_assert(fd->idx < inode->i_num_allocated_fds);
@@ -265,11 +259,12 @@ inode_put_fd(struct wim_inode *inode, struct wimfs_fd *fd)
 
        inode->i_fds[fd->idx] = NULL;
        FREE(fd);
-       if (--inode->i_num_opened_fds == 0 && inode->i_nlink == 0) {
-               pthread_mutex_unlock(&inode->i_mutex);
-               free_inode(inode);
-       } else {
-               pthread_mutex_unlock(&inode->i_mutex);
+       if (--inode->i_num_opened_fds == 0) {
+               FREE(inode->i_fds);
+               inode->i_fds = NULL;
+               inode->i_num_allocated_fds = 0;
+               if (inode->i_nlink == 0)
+                       free_inode(inode);
        }
 }
 
@@ -1046,29 +1041,29 @@ struct unmount_msg_hdr {
        u32 cur_version;
        u32 msg_type;
        u32 msg_size;
-} PACKED;
+} _packed_attribute;
 
 struct msg_unmount_request {
        struct unmount_msg_hdr hdr;
        u32 unmount_flags;
        u8 want_progress_messages;
-} PACKED;
+} _packed_attribute;
 
 struct msg_daemon_info {
        struct unmount_msg_hdr hdr;
        pid_t daemon_pid;
        u32 mount_flags;
-} PACKED;
+} _packed_attribute;
 
 struct msg_unmount_finished {
        struct unmount_msg_hdr hdr;
        s32 status;
-} PACKED;
+} _packed_attribute;
 
 struct msg_write_streams_progress {
        struct unmount_msg_hdr hdr;
        union wimlib_progress_info info;
-} PACKED;
+} _packed_attribute;
 
 enum {
        MSG_TYPE_UNMOUNT_REQUEST,
@@ -1444,7 +1439,7 @@ message_loop(mqd_t mq,
  *  daemon to finish writing the WIM file.
  */
 static int
-execute_fusermount(const char *dir)
+execute_fusermount(const char *dir, bool lazy)
 {
        pid_t pid;
        int ret;
@@ -1457,7 +1452,15 @@ execute_fusermount(const char *dir)
        }
        if (pid == 0) {
                /* Child */
-               execlp("fusermount", "fusermount", "-u", dir, NULL);
+               char *argv[10];
+               char **argp = argv;
+               *argp++ = "fusermount";
+               if (lazy)
+                       *argp++ = "-z";
+               *argp++ = "-u";
+               *argp++ = (char*)dir;
+               *argp = NULL;
+               execvp("fusermount", argv);
                ERROR_WITH_ERRNO("Failed to execute `fusermount'");
                exit(WIMLIB_ERR_FUSERMOUNT);
        }
@@ -1495,7 +1498,14 @@ execute_fusermount(const char *dir)
        }
        if (pid == 0) {
                /* Child */
-               execlp("umount", "umount", dir, NULL);
+               char *argv[10];
+               char **argp = argv;
+               *argp++ = "umount";
+               if (lazy)
+                       *argp++ = "-l";
+               *argp++ = (char*)dir;
+               *argp = NULL;
+               execvp("umount", argv);
                ERROR_WITH_ERRNO("Failed to execute `umount'");
                exit(WIMLIB_ERR_FUSERMOUNT);
        }
@@ -2392,24 +2402,14 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir,
        if (ret)
                goto out;
 
-       if ((mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) && (wim->hdr.total_parts != 1)) {
-               ERROR("Cannot mount a split WIM read-write");
-               ret = WIMLIB_ERR_SPLIT_UNSUPPORTED;
-               goto out;
-       }
-
-       if (num_additional_swms)
-               merge_lookup_tables(wim, additional_swms, num_additional_swms);
-
        if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) {
-               ret = wim_run_full_verifications(wim);
+               ret = can_delete_from_wim(wim);
                if (ret)
-                       goto out_restore_lookup_table;
+                       goto out;
        }
 
-       ret = wim_checksum_unhashed_streams(wim);
-       if (ret)
-               goto out_restore_lookup_table;
+       if (num_additional_swms)
+               merge_lookup_tables(wim, additional_swms, num_additional_swms);
 
        ret = select_wim_image(wim, image);
        if (ret)
@@ -2470,12 +2470,11 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir,
                goto out_free_message_queue_names;
 
        argc = 0;
-       argv[argc++] = "imagex";
+       argv[argc++] = IMAGEX_PROGNAME;
        argv[argc++] = dir_copy;
 
-       /* disable multi-threaded operation for read-write mounts */
-       if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE)
-               argv[argc++] = "-s";
+       /* disable multi-threaded operation */
+       argv[argc++] = "-s";
 
        if (mount_flags & WIMLIB_MOUNT_FLAG_DEBUG)
                argv[argc++] = "-d";
@@ -2528,10 +2527,8 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir,
         * assign inode numbers */
        DEBUG("Resolving lookup table entries and assigning inode numbers");
        ctx.next_ino = 1;
-       image_for_each_inode(inode, imd) {
-               inode_resolve_ltes(inode, wim->lookup_table);
+       image_for_each_inode(inode, imd)
                inode->i_ino = ctx.next_ino++;
-       }
        DEBUG("(next_ino = %"PRIu64")", ctx.next_ino);
 
        DEBUG("Calling fuse_main()");
@@ -2597,7 +2594,7 @@ wimlib_unmount_image(const char *dir, int unmount_flags,
        if (ret != 0)
                goto out_close_message_queues;
 
-       ret = execute_fusermount(dir);
+       ret = execute_fusermount(dir, (unmount_flags & WIMLIB_UNMOUNT_FLAG_LAZY) != 0);
        if (ret != 0)
                goto out_close_message_queues;