rofiles: Fix --copyup when creating a new file

This tripped up the `docbook-dtds` `%post` in my experiments
with doing rpm-ostree for buildroots.

I cloned and built [xfstests](https://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git)
but haven't yet investigated actually running it.

In the meantime let's do the obvious fix here; we need to distinguish
between "copyup enabled" and "actually did a copyup" in the open path
at least, since if we didn't do a copyup we don't need to re-open.

Closes: #1396
Approved by: jlebon
This commit is contained in:
Colin Walters authored and Atomic Bot committed 2018-01-08 15:21:29 +00:00
1 parent 46a841a062
commit 3b9304b5d7
2 files changed
+54 -12

No files matched your search

+11 -4
View File
@@ -247,10 +247,14 @@ gioerror_to_errno (GIOErrorEnum e)
}
static int
verify_write_or_copyup (const char *path, const struct stat *stbuf)
verify_write_or_copyup (const char *path, const struct stat *stbuf,
gboolean *out_did_copyup)
{
struct stat stbuf_local;
if (out_did_copyup)
*out_did_copyup = FALSE;
/* If a stbuf wasn't provided, gather it now */
if (!stbuf)
{
@@ -272,6 +276,8 @@ verify_write_or_copyup (const char *path, const struct stat *stbuf)
g_autoptr(GError) tmp_error = NULL;
if (!ostree_break_hardlink (basefd, path, FALSE, NULL, &tmp_error))
return -gioerror_to_errno ((GIOErrorEnum)tmp_error->code);
if (out_did_copyup)
*out_did_copyup = TRUE;
}
else
return -EROFS;
@@ -286,7 +292,7 @@ verify_write_or_copyup (const char *path, const struct stat *stbuf)
*/
#define PATH_WRITE_ENTRYPOINT(path) do { \
path = ENSURE_RELPATH (path); \
int r = verify_write_or_copyup (path, NULL); \
int r = verify_write_or_copyup (path, NULL, NULL); \
if (r != 0) \
return r; \
} while (0)
@@ -374,7 +380,8 @@ do_open (const char *path, mode_t mode, struct fuse_file_info *finfo)
return -errno;
}
int r = verify_write_or_copyup (path, &stbuf);
gboolean did_copyup;
int r = verify_write_or_copyup (path, &stbuf, &did_copyup);
if (r != 0)
{
(void) close (fd);
@@ -382,7 +389,7 @@ do_open (const char *path, mode_t mode, struct fuse_file_info *finfo)
}
/* In the copyup case, we need to re-open */
if (opt_copyup)
if (did_copyup)
{
(void) close (fd);
/* Note that unlike the initial open, we will pass through