[ostree] repo: Fix bare-user file loads
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ostree] repo: Fix bare-user file loads
- Date: Mon, 12 Jan 2015 20:11:31 +0000 (UTC)
commit 019635d9c2f89dac56fb40e3df2752ef81fedff3
Author: Colin Walters <walters verbum org>
Date: Mon Jan 12 12:39:57 2015 -0500
repo: Fix bare-user file loads
Regression from 86764dbf007fca1e42aacb830e3c1911b198be6e
This function is kind of fiendish now that we have 3 cases, each of
which want to be optimized somewhat to only load what's necessary
(e.g. don't open the file if we don't have an output for stream
requested).
Clean things up so that BARE_USER and BARE are separate conditionals
that share as much as possible, and fix the bug that asserted we
were in BARE mode.
I tested this by running test-basic-user.sh by hand.
src/libostree/ostree-repo.c | 86 ++++++++++++++++++++++++++----------------
1 files changed, 53 insertions(+), 33 deletions(-)
---
diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c
index d82872c..4d93a89 100644
--- a/src/libostree/ostree-repo.c
+++ b/src/libostree/ostree-repo.c
@@ -1918,10 +1918,14 @@ ostree_repo_load_file (OstreeRepo *self,
if (ret_file_info)
{
+ found = TRUE;
+
if (repo_mode == OSTREE_REPO_MODE_BARE_USER)
{
+ guint32 mode;
gs_unref_variant GVariant *metadata = NULL;
gs_unref_bytes GBytes *bytes = NULL;
+ gs_fd_close int fd = -1;
bytes = ot_lgetxattrat (self->objects_dir_fd, loose_path_buf,
"user.ostreemeta", error);
@@ -1934,9 +1938,28 @@ ostree_repo_load_file (OstreeRepo *self,
ret_xattrs = set_info_from_filemeta (ret_file_info, metadata);
- if (S_ISLNK (g_file_info_get_attribute_uint32 (ret_file_info, "unix::mode")))
+ mode = g_file_info_get_attribute_uint32 (ret_file_info, "unix::mode");
+
+ /* Optimize this so that we only open the file if we
+ * need to; symlinks contain their content, and we only
+ * open regular files if the caller has requested an
+ * input stream.
+ */
+ if (S_ISLNK (mode) || out_input)
+ {
+ if (!gs_file_openat_noatime (self->objects_dir_fd, loose_path_buf, &fd,
+ cancellable, error))
+ goto out;
+ }
+
+ if (S_ISREG (mode) && out_input)
+ {
+ g_assert (fd != -1);
+ ret_input = g_unix_input_stream_new (fd, TRUE);
+ fd = -1; /* Transfer ownership */
+ }
+ else if (S_ISLNK (mode))
{
- int fd = -1;
gs_unref_object GInputStream *target_input = NULL;
char targetbuf[PATH_MAX+1];
gsize target_size;
@@ -1944,11 +1967,8 @@ ostree_repo_load_file (OstreeRepo *self,
g_file_info_set_file_type (ret_file_info, G_FILE_TYPE_SYMBOLIC_LINK);
g_file_info_set_size (ret_file_info, 0);
- if (!gs_file_openat_noatime (self->objects_dir_fd, loose_path_buf, &fd,
- cancellable, error))
- goto out;
-
target_input = g_unix_input_stream_new (fd, TRUE);
+ fd = -1; /* Transfer ownership */
if (!g_input_stream_read_all (target_input, targetbuf, sizeof (targetbuf),
&target_size, cancellable, error))
@@ -1957,41 +1977,41 @@ ostree_repo_load_file (OstreeRepo *self,
g_file_info_set_symlink_target (ret_file_info, targetbuf);
}
}
-
- g_assert (repo_mode == OSTREE_REPO_MODE_BARE);
-
- if (g_file_info_get_file_type (ret_file_info) == G_FILE_TYPE_REGULAR
- && (out_input || out_xattrs))
+ else
{
- gs_fd_close int fd = -1;
-
- if (!gs_file_openat_noatime (self->objects_dir_fd, loose_path_buf, &fd,
- cancellable, error))
- goto out;
+ g_assert (repo_mode == OSTREE_REPO_MODE_BARE);
- if (out_xattrs)
+ if (g_file_info_get_file_type (ret_file_info) == G_FILE_TYPE_REGULAR
+ && (out_input || out_xattrs))
{
- if (!gs_fd_get_all_xattrs (fd, &ret_xattrs,
- cancellable, error))
+ gs_fd_close int fd = -1;
+
+ if (!gs_file_openat_noatime (self->objects_dir_fd, loose_path_buf, &fd,
+ cancellable, error))
goto out;
- }
- if (out_input)
+ if (out_xattrs)
+ {
+ if (!gs_fd_get_all_xattrs (fd, &ret_xattrs,
+ cancellable, error))
+ goto out;
+ }
+
+ if (out_input)
+ {
+ ret_input = g_unix_input_stream_new (fd, TRUE);
+ fd = -1; /* Transfer ownership */
+ }
+ }
+ else if (g_file_info_get_file_type (ret_file_info) == G_FILE_TYPE_SYMBOLIC_LINK
+ && out_xattrs)
{
- ret_input = g_unix_input_stream_new (fd, TRUE);
- fd = -1; /* Transfer ownership */
+ if (!gs_dfd_and_name_get_all_xattrs (self->objects_dir_fd, loose_path_buf,
+ &ret_xattrs,
+ cancellable, error))
+ goto out;
}
}
- else if (g_file_info_get_file_type (ret_file_info) == G_FILE_TYPE_SYMBOLIC_LINK
- && out_xattrs)
- {
- if (!gs_dfd_and_name_get_all_xattrs (self->objects_dir_fd, loose_path_buf,
- &ret_xattrs,
- cancellable, error))
- goto out;
- }
-
- found = TRUE;
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]