[ostree] core: Attempt direct link() and fallback on EEXIST
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ostree] core: Attempt direct link() and fallback on EEXIST
- Date: Fri, 25 May 2012 00:16:31 +0000 (UTC)
commit fb71519cd6e7c3898601cf31124b9257d8e5f037
Author: Colin Walters <walters verbum org>
Date: Thu May 24 20:14:51 2012 -0400
core: Attempt direct link() and fallback on EEXIST
Rather than always doing:
1) make temporary link
2) unlink() target
3) rename()
Just try making the link, and only do the second two if the file
already exists. This reduces system call traffic a lot.
src/libostree/ostree-repo.c | 48 ++++++++++++++++--------------------------
1 files changed, 18 insertions(+), 30 deletions(-)
---
diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c
index a2d4243..2274588 100644
--- a/src/libostree/ostree-repo.c
+++ b/src/libostree/ostree-repo.c
@@ -4120,37 +4120,27 @@ checkout_file_hardlink (OstreeRepo *self,
{
gboolean ret = FALSE;
ot_lobj GFile *dir = NULL;
- ot_lobj GFile *temp_file = NULL;
- if (overwrite_mode == OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES)
+ if (link (ot_gfile_get_path_cached (source), ot_gfile_get_path_cached (destination)) < 0)
{
- dir = g_file_get_parent (destination);
- if (!ostree_create_temp_hardlink (dir, (GFile*)source, NULL, "link",
- &temp_file, cancellable, error))
- goto out;
-
- /* Idiocy, from man rename(2)
- *
- * "If oldpath and newpath are existing hard links referring to
- * the same file, then rename() does nothing, and returns a
- * success status."
- *
- * So we can't make this atomic.
- */
-
- (void) unlink (ot_gfile_get_path_cached (destination));
-
- if (rename (ot_gfile_get_path_cached (temp_file),
- ot_gfile_get_path_cached (destination)) < 0)
- {
- ot_util_set_error_from_errno (error, errno);
- goto out;
+ if (errno == EEXIST && overwrite_mode == OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES)
+ {
+ /* Idiocy, from man rename(2)
+ *
+ * "If oldpath and newpath are existing hard links referring to
+ * the same file, then rename() does nothing, and returns a
+ * success status."
+ *
+ * So we can't make this atomic.
+ */
+ (void) unlink (ot_gfile_get_path_cached (destination));
+ if (link (ot_gfile_get_path_cached (source), ot_gfile_get_path_cached (destination)) < 0)
+ {
+ ot_util_set_error_from_errno (error, errno);
+ goto out;
+ }
}
- g_clear_object (&temp_file);
- }
- else
- {
- if (link (ot_gfile_get_path_cached (source), ot_gfile_get_path_cached (destination)) < 0)
+ else
{
ot_util_set_error_from_errno (error, errno);
goto out;
@@ -4159,8 +4149,6 @@ checkout_file_hardlink (OstreeRepo *self,
ret = TRUE;
out:
- if (temp_file)
- (void) unlink (ot_gfile_get_path_cached (temp_file));
return ret;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]