diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index ad910dce..e470b8b7 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -157,10 +157,13 @@ commit_loose_object_trusted (OstreeRepo *self, /* Ensure that in case of a power cut, these files have the data we * want. See http://lwn.net/Articles/322823/ */ - if (fsync (fd) == -1) + if (!self->disable_fsync) { - ot_util_set_error_from_errno (error, errno); - goto out; + if (fsync (fd) == -1) + { + ot_util_set_error_from_errno (error, errno); + goto out; + } } if (!g_output_stream_close (temp_out, cancellable, error)) diff --git a/src/libostree/ostree-repo-private.h b/src/libostree/ostree-repo-private.h index 0a3b0a01..711bfea2 100644 --- a/src/libostree/ostree-repo-private.h +++ b/src/libostree/ostree-repo-private.h @@ -57,6 +57,7 @@ struct OstreeRepo { gboolean inited; gboolean in_transaction; + gboolean disable_fsync; GHashTable *loose_object_devino_hash; GHashTable *updated_uncompressed_dirs; GHashTable *object_sizes; diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index d9938d92..65c2bdfc 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -552,6 +552,24 @@ ostree_repo_open (OstreeRepo *self, return ret; } +/** + * ostree_repo_set_disable_fsync: + * @self: An #OstreeRepo + * @disable_fsync: If %TRUE, do not fsync + * + * Disable requests to fsync() to stable storage during commits. This + * option should only be used by build system tools which are creating + * disposable virtual machines, or have higher level mechanisms for + * ensuring data consistency. + */ +void +ostree_repo_set_disable_fsync (OstreeRepo *self, + gboolean disable_fsync) +{ + self->disable_fsync = disable_fsync; +} + + /** * ostree_repo_get_path: * @self: diff --git a/src/libostree/ostree-repo.h b/src/libostree/ostree-repo.h index 3f311f9f..b3f263e8 100644 --- a/src/libostree/ostree-repo.h +++ b/src/libostree/ostree-repo.h @@ -48,6 +48,9 @@ gboolean ostree_repo_open (OstreeRepo *self, GCancellable *cancellable, GError **error); +void ostree_repo_set_disable_fsync (OstreeRepo *self, + gboolean disable_fsync); + gboolean ostree_repo_create (OstreeRepo *self, OstreeRepoMode mode, GCancellable *cancellable, diff --git a/src/ostree/ot-builtin-pull-local.c b/src/ostree/ot-builtin-pull-local.c index 0feeddf2..b5b5728f 100644 --- a/src/ostree/ot-builtin-pull-local.c +++ b/src/ostree/ot-builtin-pull-local.c @@ -30,9 +30,11 @@ #include "otutil.h" static char *opt_remote; +static gboolean opt_disable_fsync; static GOptionEntry options[] = { { "remote", 0, 0, G_OPTION_ARG_STRING, &opt_remote, "Add REMOTE to refspec", "REMOTE" }, + { "disable-fsync", 0, 0, G_OPTION_ARG_NONE, &opt_disable_fsync, "Do not invoke fsync()", NULL }, { NULL } }; @@ -206,6 +208,9 @@ ostree_builtin_pull_local (int argc, char **argv, OstreeRepo *repo, GCancellable if (!ostree_repo_open (data->src_repo, cancellable, error)) goto out; + if (opt_disable_fsync) + ostree_repo_set_disable_fsync (data->dest_repo, TRUE); + data->threadpool = ot_thread_pool_new_nproc (import_one_object_thread, data); src_repo_dir = g_object_ref (ostree_repo_get_path (data->src_repo));