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:
1 parent
46a841a062
commit
3b9304b5d7
2 files changed
+54
-12
No files matched your search
+11
-4
@@ -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
|
||||
|
||||
Reference in new issue
Block a user