Port to GLnxTmpfile
There's lots of mechanically replacing `OtTmpFile` with `GLnxTmpfile`; the biggest changes are in the commit path. Symlink commits are now very clearly separated from regular files. Symlinks are `OtCleanupUnlinkat`, and regular files are `GLnxTmpfile`. The commit codepath separates those as `_ostree_repo_commit_path_final()` and `_ostree_repo_commit_tmpf_final()`. A nice aspect of all of this is that they both *consume* the temporary on success. This avoids an extra spurious `unlink()` call. One of the biggest bits of code motion is in `commit_loose_regfile_object()`, which no longer needs to care about symlinks. For the most parth though it's just removing conditionals. Update submodule: libglnx Closes: #958 Approved by: jlebon
This commit is contained in:
1 parent
79f285d188
commit
5776d5dcc0
13 files changed
+278
-358
No files matched your search
@@ -25,61 +25,6 @@
|
||||
#include <sys/xattr.h>
|
||||
#include <gio/gunixinputstream.h>
|
||||
|
||||
/* Before https://github.com/GNOME/libglnx/commit/9929adc, the libglnx
|
||||
* tmpfile API made it hard to clean up tmpfiles in failure cases.
|
||||
* it's API breaking. Carry the fix here until we're ready to fully port.
|
||||
*/
|
||||
void
|
||||
ot_tmpfile_clear (OtTmpfile *tmpf)
|
||||
{
|
||||
if (!tmpf->initialized)
|
||||
return;
|
||||
if (tmpf->fd == -1)
|
||||
return;
|
||||
(void) close (tmpf->fd);
|
||||
/* If ->path is set, we're likely aborting due to an error. Clean it up */
|
||||
if (tmpf->path)
|
||||
{
|
||||
(void) unlinkat (tmpf->src_dfd, tmpf->path, 0);
|
||||
g_free (tmpf->path);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
ot_open_tmpfile_linkable_at (int dfd,
|
||||
const char *subpath,
|
||||
int flags,
|
||||
OtTmpfile *out_tmpf,
|
||||
GError **error)
|
||||
{
|
||||
if (!glnx_open_tmpfile_linkable_at (dfd, subpath, flags, &out_tmpf->fd, &out_tmpf->path, error))
|
||||
return FALSE;
|
||||
out_tmpf->initialized = TRUE;
|
||||
out_tmpf->src_dfd = dfd;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
ot_link_tmpfile_at (OtTmpfile *tmpf,
|
||||
GLnxLinkTmpfileReplaceMode mode,
|
||||
int target_dfd,
|
||||
const char *target,
|
||||
GError **error)
|
||||
{
|
||||
g_return_val_if_fail (tmpf->initialized, FALSE);
|
||||
glnx_fd_close int fd = glnx_steal_fd (&tmpf->fd);
|
||||
if (!glnx_link_tmpfile_at (tmpf->src_dfd, mode, fd, tmpf->path,
|
||||
target_dfd, target, error))
|
||||
{
|
||||
if (tmpf->path)
|
||||
(void) unlinkat (tmpf->src_dfd, tmpf->path, 0);
|
||||
tmpf->initialized = FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
tmpf->initialized = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Convert a fd-relative path to a GFile* - use
|
||||
* for legacy code.
|
||||
*/
|
||||
@@ -213,9 +158,8 @@ ot_dfd_iter_init_allow_noent (int dfd,
|
||||
*out_exists = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
if (!glnx_dirfd_iterator_init_take_fd (fd, dfd_iter, error))
|
||||
if (!glnx_dirfd_iterator_init_take_fd (&fd, dfd_iter, error))
|
||||
return FALSE;
|
||||
fd = -1;
|
||||
*out_exists = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -25,31 +25,6 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/* This is a copy of https://github.com/GNOME/libglnx/pull/46 until we
|
||||
* can do a full port; see https://github.com/ostreedev/ostree/pull/861 */
|
||||
typedef struct {
|
||||
gboolean initialized;
|
||||
int src_dfd;
|
||||
int fd;
|
||||
char *path;
|
||||
} OtTmpfile;
|
||||
void ot_tmpfile_clear (OtTmpfile *tmpf);
|
||||
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(OtTmpfile, ot_tmpfile_clear);
|
||||
|
||||
gboolean
|
||||
ot_open_tmpfile_linkable_at (int dfd,
|
||||
const char *subpath,
|
||||
int flags,
|
||||
OtTmpfile *out_tmpf,
|
||||
GError **error);
|
||||
gboolean
|
||||
ot_link_tmpfile_at (OtTmpfile *tmpf,
|
||||
GLnxLinkTmpfileReplaceMode flags,
|
||||
int target_dfd,
|
||||
const char *target,
|
||||
GError **error);
|
||||
|
||||
|
||||
/* A little helper to call unlinkat() as a cleanup
|
||||
* function. Mostly only necessary to handle
|
||||
* deletion of temporary symlinks.
|
||||
@@ -76,7 +51,6 @@ ot_cleanup_unlinkat (OtCleanupUnlinkat *cleanup)
|
||||
}
|
||||
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(OtCleanupUnlinkat, ot_cleanup_unlinkat);
|
||||
|
||||
|
||||
GFile * ot_fdrel_to_gfile (int dfd, const char *path);
|
||||
|
||||
gboolean ot_readlinkat_gfile_info (int dfd,
|
||||
|
||||
Reference in new issue
Block a user