summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2022-08-03 10:43:43 -0400
committerColin Walters <walters@verbum.org>2022-08-03 10:44:51 -0400
commit0a908a180fcce98c2565b9fb34470e5953918260 (patch)
treeefe68289dae5cd993c8a1fe095c995ca771758ce
parentedba4b33be10c05253bfa94895dfbc8477e44d76 (diff)
downloadostree-0a908a180fcce98c2565b9fb34470e5953918260.tar.gz
Move FIFREEZE/FITHAW ioctl invocations into linuxfsutil.c
Should help avoid conflicts between glibc and linux headers. Closes: https://github.com/ostreedev/ostree/issues/2685
-rw-r--r--src/libostree/ostree-linuxfsutil.c24
-rw-r--r--src/libostree/ostree-linuxfsutil.h3
-rw-r--r--src/libostree/ostree-sysroot-deploy.c7
3 files changed, 28 insertions, 6 deletions
diff --git a/src/libostree/ostree-linuxfsutil.c b/src/libostree/ostree-linuxfsutil.c
index 97f93604..aa389aaa 100644
--- a/src/libostree/ostree-linuxfsutil.c
+++ b/src/libostree/ostree-linuxfsutil.c
@@ -24,10 +24,12 @@
#include <fcntl.h>
#include <sys/ioctl.h>
+// This should be the only file including linux/fs.h; see
+// https://sourceware.org/glibc/wiki/Release/2.36#Usage_of_.3Clinux.2Fmount.h.3E_and_.3Csys.2Fmount.h.3E
+// https://github.com/ostreedev/ostree/issues/2685
+#include <linux/fs.h>
#include <ext2fs/ext2_fs.h>
-#include "otutil.h"
-
/**
* _ostree_linuxfs_fd_alter_immutable_flag:
* @fd: A file descriptor
@@ -88,3 +90,21 @@ _ostree_linuxfs_fd_alter_immutable_flag (int fd,
return TRUE;
}
+
+/* Wrapper for FIFREEZE ioctl.
+ * This is split into a separate wrapped API for
+ * reasons around conflicts between glibc and linux/fs.h
+ * includes; see above.
+ */
+int
+_ostree_linuxfs_filesystem_freeze (int fd)
+{
+ return TEMP_FAILURE_RETRY (ioctl (fd, FIFREEZE, 0));
+}
+
+/* Wrapper for FITHAW ioctl. See above. */
+int
+_ostree_linuxfs_filesystem_thaw (int fd)
+{
+ return TEMP_FAILURE_RETRY (ioctl (fd, FITHAW, 0));
+}
diff --git a/src/libostree/ostree-linuxfsutil.h b/src/libostree/ostree-linuxfsutil.h
index 0654b6fc..9011c9d8 100644
--- a/src/libostree/ostree-linuxfsutil.h
+++ b/src/libostree/ostree-linuxfsutil.h
@@ -29,4 +29,7 @@ _ostree_linuxfs_fd_alter_immutable_flag (int fd,
GCancellable *cancellable,
GError **error);
+int _ostree_linuxfs_filesystem_freeze (int fd);
+int _ostree_linuxfs_filesystem_thaw (int fd);
+
G_END_DECLS
diff --git a/src/libostree/ostree-sysroot-deploy.c b/src/libostree/ostree-sysroot-deploy.c
index 2dc9f58b..d86de7dc 100644
--- a/src/libostree/ostree-sysroot-deploy.c
+++ b/src/libostree/ostree-sysroot-deploy.c
@@ -29,7 +29,6 @@
#include <sys/ioctl.h>
#include <stdbool.h>
#include <sys/poll.h>
-#include <linux/fs.h>
#include <err.h>
#ifdef HAVE_LIBMOUNT
@@ -1476,7 +1475,7 @@ fsfreeze_thaw_cycle (OstreeSysroot *self,
* EOPNOTSUPP: If the filesystem doesn't support it
*/
int saved_errno = errno;
- (void) TEMP_FAILURE_RETRY (ioctl (rootfs_dfd, FITHAW, 0));
+ _ostree_linuxfs_filesystem_thaw (rootfs_dfd);
errno = saved_errno;
/* But if we got an error from poll, let's log it */
if (r < 0)
@@ -1517,7 +1516,7 @@ fsfreeze_thaw_cycle (OstreeSysroot *self,
return glnx_throw (error, "aborting due to test-fifreeze");
}
/* Do a freeze/thaw cycle; TODO add a FIFREEZETHAW ioctl */
- if (ioctl (rootfs_dfd, FIFREEZE, 0) != 0)
+ if (_ostree_linuxfs_filesystem_freeze (rootfs_dfd) != 0)
{
/* Not supported, we're running in the unit tests (as non-root), or
* the filesystem is already frozen (EBUSY).
@@ -1539,7 +1538,7 @@ fsfreeze_thaw_cycle (OstreeSysroot *self,
return glnx_throw_errno_prefix (error, "ioctl(FIFREEZE)");
}
/* And finally thaw, then signal our completion to the watchdog */
- if (TEMP_FAILURE_RETRY (ioctl (rootfs_dfd, FITHAW, 0)) != 0)
+ if (_ostree_linuxfs_filesystem_thaw (rootfs_dfd) != 0)
{
/* Warn but don't error if the filesystem was already thawed */
if (errno == EINVAL)