summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Bruno <luca.bruno@coreos.com>2022-01-04 10:27:14 +0000
committerGitHub <noreply@github.com>2022-01-04 10:27:14 +0000
commita3555f4d1239c1c1aab356a5979e15665fef6ad6 (patch)
treefd89ec82bd474ba7e997950e435ed57801621552
parent4d47733f98f98d14a5e60d8015b90d0921602df5 (diff)
parent43859b58f6b76e958e54ec5d3d1250d906ce12bf (diff)
downloadostree-a3555f4d1239c1c1aab356a5979e15665fef6ad6.tar.gz
Merge pull request #2376 from smcv/fuse3
rofiles-fuse: Build using FUSE 3 if possible, falling back to FUSE 2
-rw-r--r--.github/workflows/tests.yml6
-rwxr-xr-xci/gh-install.sh13
-rw-r--r--configure.ac19
-rw-r--r--src/rofiles-fuse/main.c49
4 files changed, 81 insertions, 6 deletions
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index c17a1c0d..5fd14bde 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -44,22 +44,24 @@ jobs:
# oldstable-backports and unstable.
#
# https://hub.docker.com/_/debian
- - name: Debian Stable with sign-ed25519
+ - name: Debian Stable with sign-ed25519 and FUSE 2
image: debian:stable-slim
pre-checkout-setup: |
apt-get update
apt-get install -y git
extra-packages: >-
+ libfuse-dev
libsodium-dev
configure-options: >-
--with-ed25519-libsodium
- - name: Debian Stable with curl, sign-ed25519 and no gpgme
+ - name: Debian Stable with curl, sign-ed25519, no gpgme, FUSE 3
image: debian:stable-slim
pre-checkout-setup: |
apt-get update
apt-get install -y git
extra-packages: >-
+ libfuse3-dev
libsodium-dev
configure-options: >-
--with-curl
diff --git a/ci/gh-install.sh b/ci/gh-install.sh
index 9902a94e..f39331b1 100755
--- a/ci/gh-install.sh
+++ b/ci/gh-install.sh
@@ -43,6 +43,19 @@ case "$ID" in
# Ubuntu package data:
# https://packages.ubuntu.com/source/impish/ostree
#
+ # Use libfuse3-dev unless otherwise specified
+ case " $* " in
+ (*\ libfuse-dev\ *)
+ ;;
+
+ (*\ libfuse3-dev\ *)
+ ;;
+
+ (*)
+ set -- "$@" libfuse3-dev
+ ;;
+ esac
+
# TODO: fetch this list from the Debian packaging git repository?
# First construct a list of Build-Depends common to all
diff --git a/configure.ac b/configure.ac
index 7dea7d2b..551fc445 100644
--- a/configure.ac
+++ b/configure.ac
@@ -254,6 +254,7 @@ AS_IF([test x$with_ed25519_libsodium != xno], [
AM_CONDITIONAL(USE_LIBSODIUM, test "x$have_libsodium" = xyes)
LIBARCHIVE_DEPENDENCY="libarchive >= 2.8.0"
+FUSE3_DEPENDENCY="fuse3 >= 3.1.1"
# What's in RHEL7.2.
FUSE_DEPENDENCY="fuse >= 2.9.2"
@@ -448,8 +449,22 @@ AC_ARG_ENABLE(rofiles-fuse,
[generate rofiles-fuse helper [default=yes]])],,
enable_rofiles_fuse=yes)
AS_IF([ test x$enable_rofiles_fuse != xno ], [
- PKG_CHECK_MODULES(BUILDOPT_FUSE, $FUSE_DEPENDENCY)
-], [enable_rofiles_fuse=no])
+ PKG_CHECK_MODULES([FUSE3], [$FUSE3_DEPENDENCY],
+ [
+ FUSE_USE_VERSION=31
+ BUILDOPT_FUSE_CFLAGS="$FUSE3_CFLAGS"
+ BUILDOPT_FUSE_LIBS="$FUSE3_LIBS"
+ ],
+ [PKG_CHECK_MODULES([FUSE], [$FUSE_DEPENDENCY],
+ [
+ FUSE_USE_VERSION=26
+ BUILDOPT_FUSE_CFLAGS="$FUSE_CFLAGS"
+ BUILDOPT_FUSE_LIBS="$FUSE_LIBS"
+ ])])
+ AC_DEFINE_UNQUOTED([FUSE_USE_VERSION], [$FUSE_USE_VERSION], [Define to the FUSE API version])
+ AC_SUBST([BUILDOPT_FUSE_CFLAGS])
+ AC_SUBST([BUILDOPT_FUSE_LIBS])
+ ], [enable_rofiles_fuse=no])
AM_CONDITIONAL(BUILDOPT_FUSE, test x$enable_rofiles_fuse = xyes)
AC_ARG_WITH(dracut,
diff --git a/src/rofiles-fuse/main.c b/src/rofiles-fuse/main.c
index e8c916fa..7f49dd88 100644
--- a/src/rofiles-fuse/main.c
+++ b/src/rofiles-fuse/main.c
@@ -17,7 +17,11 @@
* License along with this library. If not, see <https://www.gnu.org/licenses/>.
*/
-#define FUSE_USE_VERSION 26
+#include "config.h"
+
+#ifndef FUSE_USE_VERSION
+#error config.h needs to define FUSE_USE_VERSION
+#endif
#include <sys/types.h>
#include <sys/stat.h>
@@ -55,7 +59,11 @@ ENSURE_RELPATH (const char *path)
}
static int
+#if FUSE_USE_VERSION >= 31
+callback_getattr (const char *path, struct stat *st_data, struct fuse_file_info *finfo)
+#else
callback_getattr (const char *path, struct stat *st_data)
+#endif
{
path = ENSURE_RELPATH (path);
if (!*path)
@@ -89,8 +97,13 @@ callback_readlink (const char *path, char *buf, size_t size)
}
static int
+#if FUSE_USE_VERSION >= 31
+callback_readdir (const char *path, void *buf, fuse_fill_dir_t filler,
+ off_t offset, struct fuse_file_info *fi, enum fuse_readdir_flags flags)
+#else
callback_readdir (const char *path, void *buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info *fi)
+#endif
{
DIR *dp;
struct dirent *de;
@@ -123,8 +136,14 @@ callback_readdir (const char *path, void *buf, fuse_fill_dir_t filler,
memset (&st, 0, sizeof (st));
st.st_ino = de->d_ino;
st.st_mode = de->d_type << 12;
+
+#if FUSE_USE_VERSION >= 31
+ if (filler (buf, de->d_name, &st, 0, 0))
+ break;
+#else
if (filler (buf, de->d_name, &st, 0))
break;
+#endif
}
(void) closedir (dp);
@@ -184,11 +203,21 @@ callback_symlink (const char *from, const char *to)
}
static int
+#if FUSE_USE_VERSION >= 31
+callback_rename (const char *from, const char *to, unsigned int flags)
+#else
callback_rename (const char *from, const char *to)
+#endif
{
+#if FUSE_USE_VERSION < 31
+ unsigned int flags = 0;
+#endif
+
from = ENSURE_RELPATH (from);
to = ENSURE_RELPATH (to);
- if (renameat (basefd, from, basefd, to) == -1)
+
+ /* This assumes Linux 3.15+ */
+ if (renameat2 (basefd, from, basefd, to, flags) == -1)
return -errno;
return 0;
}
@@ -299,7 +328,11 @@ verify_write_or_copyup (const char *path, const struct stat *stbuf,
} while (0)
static int
+#if FUSE_USE_VERSION >= 31
+callback_chmod (const char *path, mode_t mode, struct fuse_file_info *finfo)
+#else
callback_chmod (const char *path, mode_t mode)
+#endif
{
PATH_WRITE_ENTRYPOINT (path);
@@ -313,7 +346,11 @@ callback_chmod (const char *path, mode_t mode)
}
static int
+#if FUSE_USE_VERSION >= 31
+callback_chown (const char *path, uid_t uid, gid_t gid, struct fuse_file_info *finfo)
+#else
callback_chown (const char *path, uid_t uid, gid_t gid)
+#endif
{
PATH_WRITE_ENTRYPOINT (path);
@@ -323,7 +360,11 @@ callback_chown (const char *path, uid_t uid, gid_t gid)
}
static int
+#if FUSE_USE_VERSION >= 31
+callback_truncate (const char *path, off_t size, struct fuse_file_info *finfo)
+#else
callback_truncate (const char *path, off_t size)
+#endif
{
PATH_WRITE_ENTRYPOINT (path);
@@ -338,7 +379,11 @@ callback_truncate (const char *path, off_t size)
}
static int
+#if FUSE_USE_VERSION >= 31
+callback_utimens (const char *path, const struct timespec tv[2], struct fuse_file_info *finfo)
+#else
callback_utimens (const char *path, const struct timespec tv[2])
+#endif
{
/* This one isn't write-verified, we support changing times
* even for hardlinked files.