From 4f736ac33e8ba7a047c9ef1c4d17c7993c9048ee Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Tue, 13 Sep 2016 21:09:48 -0400 Subject: [PATCH] sysroot: Drop an fsync for origin file when writing deployments More fsync pruning. Since we have a public API for writing the origin file and it did a fsync before, let's preserve that. But when writing deployments as part of a full transaction, we rely on the global `syncfs()`, so add an internal function for origin file writing that doesn't. Closes: #509 Approved by: giuseppe --- src/libostree/ostree-sysroot-deploy.c | 59 +++++++++++++++++---------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c index 8f0ff733..a3c1401d 100644 --- a/src/libostree/ostree-sysroot-deploy.c +++ b/src/libostree/ostree-sysroot-deploy.c @@ -894,24 +894,13 @@ merge_configuration (OstreeSysroot *sysroot, return ret; } -/** - * ostree_sysroot_write_origin_file: - * @sysroot: System root - * @deployment: Deployment - * @new_origin: (allow-none): Origin content - * @cancellable: Cancellable - * @error: Error - * - * Immediately replace the origin file of the referenced @deployment - * with the contents of @new_origin. If @new_origin is %NULL, - * this function will write the current origin of @deployment. - */ -gboolean -ostree_sysroot_write_origin_file (OstreeSysroot *sysroot, - OstreeDeployment *deployment, - GKeyFile *new_origin, - GCancellable *cancellable, - GError **error) +static gboolean +write_origin_file_internal (OstreeSysroot *sysroot, + OstreeDeployment *deployment, + GKeyFile *new_origin, + GLnxFileReplaceFlags flags, + GCancellable *cancellable, + GError **error) { GKeyFile *origin = new_origin ? new_origin : ostree_deployment_get_origin (deployment); @@ -933,7 +922,7 @@ ostree_sysroot_write_origin_file (OstreeSysroot *sysroot, if (!glnx_file_replace_contents_at (sysroot->sysroot_fd, origin_path, (guint8*)contents, len, - GLNX_FILE_REPLACE_DATASYNC_NEW, + flags, cancellable, error)) return FALSE; } @@ -941,6 +930,30 @@ ostree_sysroot_write_origin_file (OstreeSysroot *sysroot, return TRUE; } +/** + * ostree_sysroot_write_origin_file: + * @sysroot: System root + * @deployment: Deployment + * @new_origin: (allow-none): Origin content + * @cancellable: Cancellable + * @error: Error + * + * Immediately replace the origin file of the referenced @deployment + * with the contents of @new_origin. If @new_origin is %NULL, + * this function will write the current origin of @deployment. + */ +gboolean +ostree_sysroot_write_origin_file (OstreeSysroot *sysroot, + OstreeDeployment *deployment, + GKeyFile *new_origin, + GCancellable *cancellable, + GError **error) +{ + return write_origin_file_internal (sysroot, deployment, new_origin, + GLNX_FILE_REPLACE_DATASYNC_NEW, + cancellable, error); +} + static gboolean get_kernel_from_tree (int deployment_dfd, int *out_boot_dfd, @@ -2152,8 +2165,12 @@ ostree_sysroot_deploy_tree (OstreeSysroot *self, goto out; } - if (!ostree_sysroot_write_origin_file (self, new_deployment, NULL, - cancellable, error)) + /* Don't fsync here, as we assume that's all done in + * ostree_sysroot_write_deployments(). + */ + if (!write_origin_file_internal (self, new_deployment, NULL, + GLNX_FILE_REPLACE_NODATASYNC, + cancellable, error)) { g_prefix_error (error, "Writing out origin file: "); goto out;