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
This commit is contained in:
parent
edba4b33be
commit
0a908a180f
|
|
@ -24,10 +24,12 @@
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <sys/ioctl.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 <ext2fs/ext2_fs.h>
|
||||||
|
|
||||||
#include "otutil.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* _ostree_linuxfs_fd_alter_immutable_flag:
|
* _ostree_linuxfs_fd_alter_immutable_flag:
|
||||||
* @fd: A file descriptor
|
* @fd: A file descriptor
|
||||||
|
|
@ -88,3 +90,21 @@ _ostree_linuxfs_fd_alter_immutable_flag (int fd,
|
||||||
|
|
||||||
return TRUE;
|
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));
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,4 +29,7 @@ _ostree_linuxfs_fd_alter_immutable_flag (int fd,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
int _ostree_linuxfs_filesystem_freeze (int fd);
|
||||||
|
int _ostree_linuxfs_filesystem_thaw (int fd);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,6 @@
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <sys/poll.h>
|
#include <sys/poll.h>
|
||||||
#include <linux/fs.h>
|
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
|
|
||||||
#ifdef HAVE_LIBMOUNT
|
#ifdef HAVE_LIBMOUNT
|
||||||
|
|
@ -1476,7 +1475,7 @@ fsfreeze_thaw_cycle (OstreeSysroot *self,
|
||||||
* EOPNOTSUPP: If the filesystem doesn't support it
|
* EOPNOTSUPP: If the filesystem doesn't support it
|
||||||
*/
|
*/
|
||||||
int saved_errno = errno;
|
int saved_errno = errno;
|
||||||
(void) TEMP_FAILURE_RETRY (ioctl (rootfs_dfd, FITHAW, 0));
|
_ostree_linuxfs_filesystem_thaw (rootfs_dfd);
|
||||||
errno = saved_errno;
|
errno = saved_errno;
|
||||||
/* But if we got an error from poll, let's log it */
|
/* But if we got an error from poll, let's log it */
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
|
|
@ -1517,7 +1516,7 @@ fsfreeze_thaw_cycle (OstreeSysroot *self,
|
||||||
return glnx_throw (error, "aborting due to test-fifreeze");
|
return glnx_throw (error, "aborting due to test-fifreeze");
|
||||||
}
|
}
|
||||||
/* Do a freeze/thaw cycle; TODO add a FIFREEZETHAW ioctl */
|
/* 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
|
/* Not supported, we're running in the unit tests (as non-root), or
|
||||||
* the filesystem is already frozen (EBUSY).
|
* the filesystem is already frozen (EBUSY).
|
||||||
|
|
@ -1539,7 +1538,7 @@ fsfreeze_thaw_cycle (OstreeSysroot *self,
|
||||||
return glnx_throw_errno_prefix (error, "ioctl(FIFREEZE)");
|
return glnx_throw_errno_prefix (error, "ioctl(FIFREEZE)");
|
||||||
}
|
}
|
||||||
/* And finally thaw, then signal our completion to the watchdog */
|
/* 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 */
|
/* Warn but don't error if the filesystem was already thawed */
|
||||||
if (errno == EINVAL)
|
if (errno == EINVAL)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue