[ostree] core: Use O_NOATIME to open metadata



commit 4d2f77074802ac8b2d05f7cdfecef9bebfba2647
Author: Colin Walters <walters verbum org>
Date:   Mon Aug 27 16:07:39 2012 -0400

    core: Use O_NOATIME to open metadata
    
    We really don't need atime for metadata, it's just a speed hit.

 src/libostree/ostree-repo.c      |    8 ++------
 src/libotutil/ot-unix-utils.c    |   30 ++++++++++++++++++++++++++++++
 src/libotutil/ot-unix-utils.h    |    2 ++
 src/libotutil/ot-variant-utils.c |    7 ++++++-
 4 files changed, 40 insertions(+), 7 deletions(-)
---
diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c
index ab41e30..1503dd7 100644
--- a/src/libostree/ostree-repo.c
+++ b/src/libostree/ostree-repo.c
@@ -812,12 +812,8 @@ ensure_file_data_synced (GFile         *file,
   gboolean ret = FALSE;
   int fd = -1;
 
-  fd = g_open (ot_gfile_get_path_cached (file), O_RDONLY | O_NOATIME | O_CLOEXEC | O_LARGEFILE, 0);
-  if (fd < 0)
-    {
-      ot_util_set_error_from_errno (error, errno);
-      goto out;
-    }
+  if (!ot_unix_open_noatime (ot_gfile_get_path_cached (file), &fd, error))
+    goto out;
 
   if (!ot_unix_fdatasync (fd, error))
     goto out;
diff --git a/src/libotutil/ot-unix-utils.c b/src/libotutil/ot-unix-utils.c
index 600082d..3b0645f 100644
--- a/src/libotutil/ot-unix-utils.c
+++ b/src/libotutil/ot-unix-utils.c
@@ -22,13 +22,17 @@
 
 #include "config.h"
 
+#define _GNU_SOURCE
+
 #include "otutil.h"
 
 #include <gio/gio.h>
+#include <glib/gstdio.h>
 #include <gio/gunixoutputstream.h>
 
 #include <string.h>
 #include <sys/types.h>
+#include <fcntl.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <errno.h>
@@ -225,3 +229,29 @@ ot_unix_close (int fd, GError **error)
     }
   return TRUE;
 }
+
+/**
+ * ot_unix_open_noatime:
+ *
+ * Open a file for reading, using O_NOATIME if possible.
+ */
+gboolean
+ot_unix_open_noatime (const char    *path,
+                      int           *out_fd,
+                      GError       **error)
+{
+  int fd;
+
+#ifdef O_NOATIME
+  fd = g_open (path, O_RDONLY | O_NOATIME | O_CLOEXEC, 0);
+  if (fd == -1 && errno == EPERM)
+#endif
+    fd = g_open (path, O_RDONLY | O_CLOEXEC, 0);
+  if (fd == -1)
+    {
+      ot_util_set_error_from_errno (error, errno);
+      return FALSE;
+    }
+  *out_fd = fd;
+  return TRUE;
+}
diff --git a/src/libotutil/ot-unix-utils.h b/src/libotutil/ot-unix-utils.h
index 2022dea..18f0749 100644
--- a/src/libotutil/ot-unix-utils.h
+++ b/src/libotutil/ot-unix-utils.h
@@ -59,6 +59,8 @@ gboolean ot_unix_fdatasync (int fd, GError **error);
 
 gboolean ot_unix_close (int fd, GError **error);
 
+gboolean ot_unix_open_noatime (const char *path, int *out_fd, GError **error);
+
 G_END_DECLS
 
 #endif
diff --git a/src/libotutil/ot-variant-utils.c b/src/libotutil/ot-variant-utils.c
index 93b69b8..973dbf1 100644
--- a/src/libotutil/ot-variant-utils.c
+++ b/src/libotutil/ot-variant-utils.c
@@ -118,11 +118,16 @@ ot_util_variant_map (GFile              *src,
   const char *path = NULL;
   ot_lvariant GVariant *ret_variant = NULL;
   GMappedFile *mfile = NULL;
+  int fd;
 
   path = ot_gfile_get_path_cached (src);
-  mfile = g_mapped_file_new (path, FALSE, error);
+  if (!ot_unix_open_noatime (path, &fd, error))
+    goto out;
+  mfile = g_mapped_file_new_from_fd (fd, FALSE, error);
   if (!mfile)
     goto out;
+  if (!ot_unix_close (fd, error))
+    goto out;
 
   ret_variant = g_variant_new_from_data (type,
                                          g_mapped_file_get_contents (mfile),



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]