X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fwrite.c;h=54257e046f2effae9916681cfe4f60ff3be427a5;hp=ba8b697078a2efeb2d23a657b10323d05d1cfc25;hb=c9482ee98e12fa3f1073e4fc3c56f5eef3c40f32;hpb=fced769402ff6ef0bf75fe9e4dcb2880891469e0 diff --git a/src/write.c b/src/write.c index ba8b6970..54257e04 100644 --- a/src/write.c +++ b/src/write.c @@ -377,7 +377,7 @@ write_wim_resource(struct wim_lookup_table_entry *lte, if (!(flags & WIMLIB_RESOURCE_FLAG_RECOMPRESS) && lte->resource_location == RESOURCE_IN_WIM && out_ctype != WIMLIB_COMPRESSION_TYPE_NONE && - wimlib_get_compression_type(lte->wim) == out_ctype) + lte->wim->compression_type == out_ctype) { flags |= WIMLIB_RESOURCE_FLAG_RAW; write_ctx.doing_sha = false; @@ -1207,7 +1207,7 @@ main_thread_process_next_stream(struct wim_lookup_table_entry *lte, void *_ctx) ctx->out_ctype == WIMLIB_COMPRESSION_TYPE_NONE || (lte->resource_location == RESOURCE_IN_WIM && !(ctx->write_resource_flags & WIMLIB_RESOURCE_FLAG_RECOMPRESS) && - wimlib_get_compression_type(lte->wim) == ctx->out_ctype)) + lte->wim->compression_type == ctx->out_ctype)) { /* Stream is too small or isn't being compressed. Process it by * the main thread when we have a chance. We can't necessarily @@ -1713,7 +1713,7 @@ write_wim_streams(WIMStruct *wim, int image, int write_flags, return write_stream_list(&stream_list, wim->lookup_table, wim->out_fd, - wimlib_get_compression_type(wim), + wim->compression_type, write_flags, num_threads, progress_func); @@ -1825,6 +1825,7 @@ finish_write(WIMStruct *w, int image, int write_flags, zero_resource_entry(&hdr.integrity); } + hdr.flags &= ~WIM_HDR_FLAG_WRITE_IN_PROGRESS; ret = write_header(&hdr, w->out_fd); if (ret) goto out_close_wim; @@ -1907,7 +1908,9 @@ begin_write(WIMStruct *w, const tchar *path, int write_flags) if (ret) return ret; /* Write dummy header. It will be overwritten later. */ + w->hdr.flags |= WIM_HDR_FLAG_WRITE_IN_PROGRESS; ret = write_header(&w->hdr, w->out_fd); + w->hdr.flags &= ~WIM_HDR_FLAG_WRITE_IN_PROGRESS; if (ret) return ret; if (lseek(w->out_fd, WIM_HEADER_DISK_SIZE, SEEK_SET) == -1) { @@ -2109,11 +2112,20 @@ overwrite_wim_inplace(WIMStruct *w, int write_flags, return ret; } + /* Write header with write in progress flag set. */ + w->hdr.flags |= WIM_HDR_FLAG_WRITE_IN_PROGRESS; + ret = write_header(&w->hdr, w->out_fd); + w->hdr.flags &= ~WIM_HDR_FLAG_WRITE_IN_PROGRESS; + if (ret) { + close_wim_writable(w); + goto out_unlock_wim; + } + if (lseek(w->out_fd, old_wim_end, SEEK_SET) == -1) { ERROR_WITH_ERRNO("Can't seek to end of WIM"); close_wim_writable(w); - w->wim_locked = 0; - return WIMLIB_ERR_WRITE; + ret = WIMLIB_ERR_WRITE; + goto out_unlock_wim; } DEBUG("Writing newly added streams (offset = %"PRIu64")", @@ -2121,7 +2133,7 @@ overwrite_wim_inplace(WIMStruct *w, int write_flags, ret = write_stream_list(&stream_list, w->lookup_table, w->out_fd, - wimlib_get_compression_type(w), + w->compression_type, write_flags, num_threads, progress_func); @@ -2148,6 +2160,7 @@ out_truncate: * an error path. */ (void)ttruncate(w->filename, old_wim_end); } +out_unlock_wim: w->wim_locked = 0; return ret; }