From 4f258ad38a337684b561d21ae9f7984957e74f31 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Sun, 17 Jan 2016 17:06:12 -0600 Subject: [PATCH] win32_capture: make open by file ID opt-in --- NEWS | 4 ++++ include/wimlib.h | 9 +++++++++ src/update_image.c | 3 ++- src/win32_capture.c | 14 +++++++------- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/NEWS b/NEWS index c9e05d31..ac4faf69 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,10 @@ Version 1.9.0-BETA: Significantly improved performance of directory scans of full NTFS volumes on Windows 8 and later. + On Windows, to improve capture performance, wimlib now sometimes opens + files by inode number rather than by path. This is enabled for + wimcapture and wimappend, but for now other applications have to opt-in. + The progress messages printed by wimlib-imagex while writing WIM files have been slightly tweaked. diff --git a/include/wimlib.h b/include/wimlib.h index 4279ac21..500132e9 100644 --- a/include/wimlib.h +++ b/include/wimlib.h @@ -1757,6 +1757,15 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour */ #define WIMLIB_ADD_FLAG_SNAPSHOT 0x00008000 +/** + * Permit the library to discard file paths after the initial scan. If the + * application won't use WIMLIB_WRITE_FLAG_SEND_DONE_WITH_FILE_MESSAGES while + * writing the WIM archive, this flag can be used to allow the library to enable + * optimizations such as opening files by inode number rather than by path. + * Currently this only makes a difference on Windows. + */ +#define WIMLIB_ADD_FLAG_FILE_PATHS_UNNEEDED 0x00010000 + /** @} */ /** @addtogroup G_modifying_wims * @{ */ diff --git a/src/update_image.c b/src/update_image.c index c24ee194..c07b19d6 100644 --- a/src/update_image.c +++ b/src/update_image.c @@ -1205,7 +1205,8 @@ check_add_command(struct wimlib_update_command *cmd, WIMLIB_ADD_FLAG_WIMBOOT | WIMLIB_ADD_FLAG_NO_REPLACE | WIMLIB_ADD_FLAG_TEST_FILE_EXCLUSION | - WIMLIB_ADD_FLAG_SNAPSHOT)) + WIMLIB_ADD_FLAG_SNAPSHOT | + WIMLIB_ADD_FLAG_FILE_PATHS_UNNEEDED)) return WIMLIB_ERR_INVALID_PARAM; bool is_entire_image = WIMLIB_IS_WIM_ROOT_PATH(cmd->add.wim_target_path); diff --git a/src/win32_capture.c b/src/win32_capture.c index 196342e6..ef7d118a 100644 --- a/src/win32_capture.c +++ b/src/win32_capture.c @@ -2643,22 +2643,22 @@ generate_wim_structures_recursive(struct wim_dentry **root_ret, ns = FIRST_STREAM(ni); for (u32 i = 0; i < ni->num_streams; i++) { struct windows_file *windows_file; - size_t stream_name_nchars; + /* Reference the stream by path if it's a named data stream, or + * if the volume doesn't support "open by file ID", or if the + * application hasn't explicitly opted in to "open by file ID". + * Otherwise, only save the inode number (file ID). */ if (*ns->name || - !(ctx->vol_flags & FILE_SUPPORTS_OPEN_BY_FILE_ID)) + !(ctx->vol_flags & FILE_SUPPORTS_OPEN_BY_FILE_ID) || + !(ctx->params->add_flags & WIMLIB_ADD_FLAG_FILE_PATHS_UNNEEDED)) { - /* Named data stream: reference by path */ - stream_name_nchars = wcslen(ns->name); windows_file = alloc_windows_file(path, path_nchars, ns->name, - stream_name_nchars, + wcslen(ns->name), ctx->snapshot, false); } else { - /* Unamed data stream: reference by file ID (inode number) */ - stream_name_nchars = 0; windows_file = alloc_windows_file_for_file_id(ni->ino, path, ctx->params->capture_root_nchars + 1, -- 2.43.0