From 238da603b8646c7cca6e27fe901c8bb478fbd928 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Fri, 12 Oct 2012 13:09:10 -0400 Subject: [PATCH] core: Ensure file data is synced to disk when checking out via non-hardlinks Otherwise we aren't crash-safe. --- src/libostree/ostree-repo.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index 8fe99347..b63df8d9 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -3141,12 +3141,14 @@ checkout_file_from_input (GFile *file, xattrs = NULL; } + else + temp_info = g_object_ref (finfo); if (overwrite_mode == OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES) { - if (g_file_info_get_file_type (temp_info ? temp_info : finfo) == G_FILE_TYPE_DIRECTORY) + if (g_file_info_get_file_type (temp_info) == G_FILE_TYPE_DIRECTORY) { - if (!ostree_create_file_from_input (file, temp_info ? temp_info : finfo, + if (!ostree_create_file_from_input (file, temp_info, xattrs, input, cancellable, &temp_error)) { @@ -3165,11 +3167,10 @@ checkout_file_from_input (GFile *file, { dir = g_file_get_parent (file); if (!ostree_create_temp_file_from_input (dir, NULL, "checkout", - temp_info ? temp_info : finfo, - xattrs, input, &temp_file, + temp_info, xattrs, input, &temp_file, cancellable, error)) goto out; - + if (rename (ot_gfile_get_path_cached (temp_file), ot_gfile_get_path_cached (file)) < 0) { ot_util_set_error_from_errno (error, errno); @@ -3179,11 +3180,17 @@ checkout_file_from_input (GFile *file, } else { - if (!ostree_create_file_from_input (file, temp_info ? temp_info : finfo, + if (!ostree_create_file_from_input (file, temp_info, xattrs, input, cancellable, error)) goto out; } + if (g_file_info_get_file_type (temp_info) == G_FILE_TYPE_REGULAR) + { + if (!ensure_file_data_synced (file, cancellable, error)) + goto out; + } + ret = TRUE; out: return ret;