All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] grub-mount: Support libfuse 3
@ 2022-01-12 14:09 Fabian Vogt
  2022-01-14 15:29 ` Daniel Kiper
  2022-01-17 14:34 ` [PATCH v2] " Fabian Vogt
  0 siblings, 2 replies; 6+ messages in thread
From: Fabian Vogt @ 2022-01-12 14:09 UTC (permalink / raw)
  To: grub-devel

libfuse 3.0.0 got released in 2016, with some API changes compared to 2.x.
This commit introduces support for 3.x while keeping it compatible with 2.6
as a fallback still.

To detect fuse3, switch configure over to use pkg-config, which is simpler yet
more reliable than looking for library and header manually. Also set
FUSE_USE_VERSION that way, as it depends on the used libfuse version.

Now that the CFLAGS are read from pkg-config, use just <fuse.h>, which works
with 2.x as well as 3.x and is recommended by libfuse upstream.

One behaviour change of libfuse3 is that FUSE_ATOMIC_O_TRUNC is set by default,
which means that open with O_TRUNC is passed as-is instead of calling the
truncate operation. With libfuse2, truncate failed with -ENOSYS and that was
returned to the application. To make O_TRUNC fail with libfuse3, return -EROFS
explicitly if writing was requested.

Signed-off-by: Fabian Vogt <fvogt@suse.de>
---
I tested building with libfuse 2.9.9 as well as 3.10.5, both successful.
It appears to work properly when mounting a btrfs partition or ext4 image in
some quick manual testing.

 Makefile.util.def |  4 +++-
 configure.ac      | 16 +++++-----------
 util/grub-mount.c | 24 +++++++++++++++++++++---
 3 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/Makefile.util.def b/Makefile.util.def
index f8b356cc1..e92c1f346 100644
--- a/Makefile.util.def
+++ b/Makefile.util.def
@@ -309,11 +309,13 @@ program = {
   common = grub-core/disk/host.c;
   common = grub-core/osdep/init.c;
 
+  cflags = '$(FUSE_CFLAGS)';
+
   ldadd = libgrubmods.a;
   ldadd = libgrubgcry.a;
   ldadd = libgrubkern.a;
   ldadd = grub-core/lib/gnulib/libgnu.a;
-  ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) -lfuse';
+  ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) $(FUSE_LIBS)';
   condition = COND_GRUB_MOUNT;
 };
 
diff --git a/configure.ac b/configure.ac
index 4f649edaf..1d40f9560 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1787,17 +1787,11 @@ if test x"$enable_grub_mount" = xno ; then
 fi
 
 if test x"$grub_mount_excuse" = x ; then
-  AC_CHECK_LIB([fuse], [fuse_main_real], [],
-               [grub_mount_excuse="need FUSE library"])
-fi
-
-if test x"$grub_mount_excuse" = x ; then
-  # Check for fuse headers.
-  SAVED_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS -DFUSE_USE_VERSION=26"
-  AC_CHECK_HEADERS([fuse/fuse.h], [],
-  	[grub_mount_excuse=["need FUSE headers"]])
-  CPPFLAGS="$SAVED_CPPFLAGS"
+  PKG_CHECK_MODULES([FUSE], [fuse3], [FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=32"], [
+    PKG_CHECK_MODULES([FUSE], [fuse], [FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=26"], [
+      grub_mount_excuse="need fuse or fuse3 libraries"
+    ])
+  ])
 fi
 
 if test x"$enable_grub_mount" = xyes && test x"$grub_mount_excuse" != x ; then
diff --git a/util/grub-mount.c b/util/grub-mount.c
index d7be2a427..f983dd765 100644
--- a/util/grub-mount.c
+++ b/util/grub-mount.c
@@ -16,7 +16,6 @@
  *  You should have received a copy of the GNU General Public License
  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  */
-#define FUSE_USE_VERSION 26
 #include <config.h>
 #include <grub/types.h>
 #include <grub/emu/misc.h>
@@ -34,7 +33,7 @@
 #include <grub/command.h>
 #include <grub/zfs/zfs.h>
 #include <grub/i18n.h>
-#include <fuse/fuse.h>
+#include <fuse.h>
 
 #include <stdio.h>
 #include <unistd.h>
@@ -146,8 +145,13 @@ fuse_getattr_find_file (const char *cur_filename,
   return 0;
 }
 
+#if FUSE_USE_VERSION < 30
 static int
 fuse_getattr (const char *path, struct stat *st)
+#else
+static int
+fuse_getattr (const char *path, struct stat *st, struct fuse_file_info *fi)
+#endif
 {
   struct fuse_getattr_ctx ctx;
   char *pathname, *path2;
@@ -241,8 +245,11 @@ static grub_file_t files[65536];
 static int first_fd = 1;
 
 static int 
-fuse_open (const char *path, struct fuse_file_info *fi __attribute__ ((unused)))
+fuse_open (const char *path, struct fuse_file_info *fi)
 {
+  if ((fi->flags & O_ACCMODE) != O_RDONLY)
+    return -EROFS;
+
   grub_file_t file;
   file = grub_file_open (path, GRUB_FILE_TYPE_MOUNT);
   if (! file)
@@ -330,13 +337,24 @@ fuse_readdir_call_fill (const char *filename,
   st.st_blocks = (st.st_size + 511) >> 9;
   st.st_atime = st.st_mtime = st.st_ctime
     = info->mtimeset ? info->mtime : 0;
+#if FUSE_USE_VERSION < 30
   ctx->fill (ctx->buf, filename, &st, 0);
+#else
+  ctx->fill (ctx->buf, filename, &st, 0, 0);
+#endif
   return 0;
 }
 
+#if FUSE_USE_VERSION < 30
 static int 
 fuse_readdir (const char *path, void *buf,
 	      fuse_fill_dir_t fill, off_t off, struct fuse_file_info *fi)
+#else
+static int
+fuse_readdir (const char *path, void *buf,
+	      fuse_fill_dir_t fill, off_t off, struct fuse_file_info *fi,
+	      enum fuse_readdir_flags flags)
+#endif
 {
   struct fuse_readdir_ctx ctx = {
     .path = path,
-- 
2.33.1






^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] grub-mount: Support libfuse 3
  2022-01-12 14:09 [PATCH] grub-mount: Support libfuse 3 Fabian Vogt
@ 2022-01-14 15:29 ` Daniel Kiper
  2022-01-17 14:34 ` [PATCH v2] " Fabian Vogt
  1 sibling, 0 replies; 6+ messages in thread
From: Daniel Kiper @ 2022-01-14 15:29 UTC (permalink / raw)
  To: Fabian Vogt; +Cc: grub-devel

On Wed, Jan 12, 2022 at 03:09:07PM +0100, Fabian Vogt wrote:
> libfuse 3.0.0 got released in 2016, with some API changes compared to 2.x.
> This commit introduces support for 3.x while keeping it compatible with 2.6
> as a fallback still.
>
> To detect fuse3, switch configure over to use pkg-config, which is simpler yet
> more reliable than looking for library and header manually. Also set
> FUSE_USE_VERSION that way, as it depends on the used libfuse version.
>
> Now that the CFLAGS are read from pkg-config, use just <fuse.h>, which works
> with 2.x as well as 3.x and is recommended by libfuse upstream.
>
> One behaviour change of libfuse3 is that FUSE_ATOMIC_O_TRUNC is set by default,
> which means that open with O_TRUNC is passed as-is instead of calling the
> truncate operation. With libfuse2, truncate failed with -ENOSYS and that was
> returned to the application. To make O_TRUNC fail with libfuse3, return -EROFS
> explicitly if writing was requested.
>
> Signed-off-by: Fabian Vogt <fvogt@suse.de>
> ---
> I tested building with libfuse 2.9.9 as well as 3.10.5, both successful.
> It appears to work properly when mounting a btrfs partition or ext4 image in
> some quick manual testing.
>
>  Makefile.util.def |  4 +++-
>  configure.ac      | 16 +++++-----------
>  util/grub-mount.c | 24 +++++++++++++++++++++---
>  3 files changed, 29 insertions(+), 15 deletions(-)
>
> diff --git a/Makefile.util.def b/Makefile.util.def
> index f8b356cc1..e92c1f346 100644
> --- a/Makefile.util.def
> +++ b/Makefile.util.def
> @@ -309,11 +309,13 @@ program = {
>    common = grub-core/disk/host.c;
>    common = grub-core/osdep/init.c;
>
> +  cflags = '$(FUSE_CFLAGS)';
> +
>    ldadd = libgrubmods.a;
>    ldadd = libgrubgcry.a;
>    ldadd = libgrubkern.a;
>    ldadd = grub-core/lib/gnulib/libgnu.a;
> -  ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) -lfuse';
> +  ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) $(FUSE_LIBS)';
>    condition = COND_GRUB_MOUNT;
>  };
>
> diff --git a/configure.ac b/configure.ac
> index 4f649edaf..1d40f9560 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1787,17 +1787,11 @@ if test x"$enable_grub_mount" = xno ; then
>  fi
>
>  if test x"$grub_mount_excuse" = x ; then
> -  AC_CHECK_LIB([fuse], [fuse_main_real], [],
> -               [grub_mount_excuse="need FUSE library"])
> -fi
> -
> -if test x"$grub_mount_excuse" = x ; then
> -  # Check for fuse headers.
> -  SAVED_CPPFLAGS="$CPPFLAGS"
> -  CPPFLAGS="$CPPFLAGS -DFUSE_USE_VERSION=26"
> -  AC_CHECK_HEADERS([fuse/fuse.h], [],
> -  	[grub_mount_excuse=["need FUSE headers"]])
> -  CPPFLAGS="$SAVED_CPPFLAGS"
> +  PKG_CHECK_MODULES([FUSE], [fuse3], [FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=32"], [
> +    PKG_CHECK_MODULES([FUSE], [fuse], [FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=26"], [
> +      grub_mount_excuse="need fuse or fuse3 libraries"
> +    ])
> +  ])
>  fi
>
>  if test x"$enable_grub_mount" = xyes && test x"$grub_mount_excuse" != x ; then
> diff --git a/util/grub-mount.c b/util/grub-mount.c
> index d7be2a427..f983dd765 100644
> --- a/util/grub-mount.c
> +++ b/util/grub-mount.c
> @@ -16,7 +16,6 @@
>   *  You should have received a copy of the GNU General Public License
>   *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
>   */
> -#define FUSE_USE_VERSION 26
>  #include <config.h>
>  #include <grub/types.h>
>  #include <grub/emu/misc.h>
> @@ -34,7 +33,7 @@
>  #include <grub/command.h>
>  #include <grub/zfs/zfs.h>
>  #include <grub/i18n.h>
> -#include <fuse/fuse.h>
> +#include <fuse.h>
>
>  #include <stdio.h>
>  #include <unistd.h>
> @@ -146,8 +145,13 @@ fuse_getattr_find_file (const char *cur_filename,
>    return 0;
>  }
>
> +#if FUSE_USE_VERSION < 30
>  static int
>  fuse_getattr (const char *path, struct stat *st)
> +#else
> +static int
> +fuse_getattr (const char *path, struct stat *st, struct fuse_file_info *fi)

struct fuse_file_info *fi __attribute__ ((unused))) ?

> +#endif
>  {
>    struct fuse_getattr_ctx ctx;
>    char *pathname, *path2;
> @@ -241,8 +245,11 @@ static grub_file_t files[65536];
>  static int first_fd = 1;
>
>  static int
> -fuse_open (const char *path, struct fuse_file_info *fi __attribute__ ((unused)))
> +fuse_open (const char *path, struct fuse_file_info *fi)
>  {
> +  if ((fi->flags & O_ACCMODE) != O_RDONLY)
> +    return -EROFS;
> +
>    grub_file_t file;
>    file = grub_file_open (path, GRUB_FILE_TYPE_MOUNT);
>    if (! file)
> @@ -330,13 +337,24 @@ fuse_readdir_call_fill (const char *filename,
>    st.st_blocks = (st.st_size + 511) >> 9;
>    st.st_atime = st.st_mtime = st.st_ctime
>      = info->mtimeset ? info->mtime : 0;
> +#if FUSE_USE_VERSION < 30
>    ctx->fill (ctx->buf, filename, &st, 0);
> +#else
> +  ctx->fill (ctx->buf, filename, &st, 0, 0);
> +#endif
>    return 0;
>  }
>
> +#if FUSE_USE_VERSION < 30
>  static int
>  fuse_readdir (const char *path, void *buf,
>  	      fuse_fill_dir_t fill, off_t off, struct fuse_file_info *fi)
> +#else
> +static int
> +fuse_readdir (const char *path, void *buf,
> +	      fuse_fill_dir_t fill, off_t off, struct fuse_file_info *fi,
> +	      enum fuse_readdir_flags flags)

enum fuse_readdir_flags flags __attribute__ ((unused))) ?

Otherwise LGTM...

Daniel


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2] grub-mount: Support libfuse 3
  2022-01-12 14:09 [PATCH] grub-mount: Support libfuse 3 Fabian Vogt
  2022-01-14 15:29 ` Daniel Kiper
@ 2022-01-17 14:34 ` Fabian Vogt
  2022-01-20 17:02   ` Daniel Kiper
  2022-02-08 16:22   ` Daniel Kiper
  1 sibling, 2 replies; 6+ messages in thread
From: Fabian Vogt @ 2022-01-17 14:34 UTC (permalink / raw)
  To: grub-devel

libfuse 3.0.0 got released in 2016, with some API changes compared to 2.x.
This commit introduces support for 3.x while keeping it compatible with 2.6
as a fallback still.

To detect fuse3, switch configure over to use pkg-config, which is simpler yet
more reliable than looking for library and header manually. Also set
FUSE_USE_VERSION that way, as it depends on the used libfuse version.

Now that the CFLAGS are read from pkg-config, use just <fuse.h>, which works
with 2.x as well as 3.x and is recommended by libfuse upstream.

One behaviour change of libfuse3 is that FUSE_ATOMIC_O_TRUNC is set by default,
which means that open with O_TRUNC is passed as-is instead of calling the
truncate operation. With libfuse2, truncate failed with -ENOSYS and that was
returned to the application. To make O_TRUNC fail with libfuse3, return -EROFS
explicitly if writing was requested.

Signed-off-by: Fabian Vogt <fvogt@suse.de>
---
v2: add __attribute__ ((unused))

 Makefile.util.def |  4 +++-
 configure.ac      | 16 +++++-----------
 util/grub-mount.c | 25 ++++++++++++++++++++++---
 3 files changed, 30 insertions(+), 15 deletions(-)

diff --git a/Makefile.util.def b/Makefile.util.def
index f8b356cc1..e92c1f346 100644
--- a/Makefile.util.def
+++ b/Makefile.util.def
@@ -309,11 +309,13 @@ program = {
   common = grub-core/disk/host.c;
   common = grub-core/osdep/init.c;
 
+  cflags = '$(FUSE_CFLAGS)';
+
   ldadd = libgrubmods.a;
   ldadd = libgrubgcry.a;
   ldadd = libgrubkern.a;
   ldadd = grub-core/lib/gnulib/libgnu.a;
-  ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) -lfuse';
+  ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) $(FUSE_LIBS)';
   condition = COND_GRUB_MOUNT;
 };
 
diff --git a/configure.ac b/configure.ac
index 4f649edaf..1d40f9560 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1787,17 +1787,11 @@ if test x"$enable_grub_mount" = xno ; then
 fi
 
 if test x"$grub_mount_excuse" = x ; then
-  AC_CHECK_LIB([fuse], [fuse_main_real], [],
-               [grub_mount_excuse="need FUSE library"])
-fi
-
-if test x"$grub_mount_excuse" = x ; then
-  # Check for fuse headers.
-  SAVED_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS -DFUSE_USE_VERSION=26"
-  AC_CHECK_HEADERS([fuse/fuse.h], [],
-  	[grub_mount_excuse=["need FUSE headers"]])
-  CPPFLAGS="$SAVED_CPPFLAGS"
+  PKG_CHECK_MODULES([FUSE], [fuse3], [FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=32"], [
+    PKG_CHECK_MODULES([FUSE], [fuse], [FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=26"], [
+      grub_mount_excuse="need fuse or fuse3 libraries"
+    ])
+  ])
 fi
 
 if test x"$enable_grub_mount" = xyes && test x"$grub_mount_excuse" != x ; then
diff --git a/util/grub-mount.c b/util/grub-mount.c
index d7be2a427..6df835df2 100644
--- a/util/grub-mount.c
+++ b/util/grub-mount.c
@@ -16,7 +16,6 @@
  *  You should have received a copy of the GNU General Public License
  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  */
-#define FUSE_USE_VERSION 26
 #include <config.h>
 #include <grub/types.h>
 #include <grub/emu/misc.h>
@@ -34,7 +33,7 @@
 #include <grub/command.h>
 #include <grub/zfs/zfs.h>
 #include <grub/i18n.h>
-#include <fuse/fuse.h>
+#include <fuse.h>
 
 #include <stdio.h>
 #include <unistd.h>
@@ -146,8 +145,14 @@ fuse_getattr_find_file (const char *cur_filename,
   return 0;
 }
 
+#if FUSE_USE_VERSION < 30
 static int
 fuse_getattr (const char *path, struct stat *st)
+#else
+static int
+fuse_getattr (const char *path, struct stat *st,
+              struct fuse_file_info *fi __attribute__ ((unused)))
+#endif
 {
   struct fuse_getattr_ctx ctx;
   char *pathname, *path2;
@@ -241,8 +246,11 @@ static grub_file_t files[65536];
 static int first_fd = 1;
 
 static int 
-fuse_open (const char *path, struct fuse_file_info *fi __attribute__ ((unused)))
+fuse_open (const char *path, struct fuse_file_info *fi)
 {
+  if ((fi->flags & O_ACCMODE) != O_RDONLY)
+    return -EROFS;
+
   grub_file_t file;
   file = grub_file_open (path, GRUB_FILE_TYPE_MOUNT);
   if (! file)
@@ -330,13 +338,24 @@ fuse_readdir_call_fill (const char *filename,
   st.st_blocks = (st.st_size + 511) >> 9;
   st.st_atime = st.st_mtime = st.st_ctime
     = info->mtimeset ? info->mtime : 0;
+#if FUSE_USE_VERSION < 30
   ctx->fill (ctx->buf, filename, &st, 0);
+#else
+  ctx->fill (ctx->buf, filename, &st, 0, 0);
+#endif
   return 0;
 }
 
+#if FUSE_USE_VERSION < 30
 static int 
 fuse_readdir (const char *path, void *buf,
 	      fuse_fill_dir_t fill, off_t off, struct fuse_file_info *fi)
+#else
+static int
+fuse_readdir (const char *path, void *buf,
+	      fuse_fill_dir_t fill, off_t off, struct fuse_file_info *fi,
+	      enum fuse_readdir_flags flags __attribute__ ((unused)))
+#endif
 {
   struct fuse_readdir_ctx ctx = {
     .path = path,
-- 
2.34.1






^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] grub-mount: Support libfuse 3
  2022-01-17 14:34 ` [PATCH v2] " Fabian Vogt
@ 2022-01-20 17:02   ` Daniel Kiper
  2022-02-08 16:22   ` Daniel Kiper
  1 sibling, 0 replies; 6+ messages in thread
From: Daniel Kiper @ 2022-01-20 17:02 UTC (permalink / raw)
  To: Fabian Vogt; +Cc: grub-devel

On Mon, Jan 17, 2022 at 03:34:37PM +0100, Fabian Vogt wrote:
> libfuse 3.0.0 got released in 2016, with some API changes compared to 2.x.
> This commit introduces support for 3.x while keeping it compatible with 2.6
> as a fallback still.
>
> To detect fuse3, switch configure over to use pkg-config, which is simpler yet
> more reliable than looking for library and header manually. Also set
> FUSE_USE_VERSION that way, as it depends on the used libfuse version.
>
> Now that the CFLAGS are read from pkg-config, use just <fuse.h>, which works
> with 2.x as well as 3.x and is recommended by libfuse upstream.
>
> One behaviour change of libfuse3 is that FUSE_ATOMIC_O_TRUNC is set by default,
> which means that open with O_TRUNC is passed as-is instead of calling the
> truncate operation. With libfuse2, truncate failed with -ENOSYS and that was
> returned to the application. To make O_TRUNC fail with libfuse3, return -EROFS
> explicitly if writing was requested.
>
> Signed-off-by: Fabian Vogt <fvogt@suse.de>

Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>

Daniel


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] grub-mount: Support libfuse 3
  2022-01-17 14:34 ` [PATCH v2] " Fabian Vogt
  2022-01-20 17:02   ` Daniel Kiper
@ 2022-02-08 16:22   ` Daniel Kiper
  2022-03-10 23:18     ` Daniel Kiper
  1 sibling, 1 reply; 6+ messages in thread
From: Daniel Kiper @ 2022-02-08 16:22 UTC (permalink / raw)
  To: Fabian Vogt; +Cc: grub-devel

On Mon, Jan 17, 2022 at 03:34:37PM +0100, Fabian Vogt wrote:
> libfuse 3.0.0 got released in 2016, with some API changes compared to 2.x.
> This commit introduces support for 3.x while keeping it compatible with 2.6
> as a fallback still.
>
> To detect fuse3, switch configure over to use pkg-config, which is simpler yet
> more reliable than looking for library and header manually. Also set
> FUSE_USE_VERSION that way, as it depends on the used libfuse version.
>
> Now that the CFLAGS are read from pkg-config, use just <fuse.h>, which works
> with 2.x as well as 3.x and is recommended by libfuse upstream.
>
> One behaviour change of libfuse3 is that FUSE_ATOMIC_O_TRUNC is set by default,
> which means that open with O_TRUNC is passed as-is instead of calling the
> truncate operation. With libfuse2, truncate failed with -ENOSYS and that was
> returned to the application. To make O_TRUNC fail with libfuse3, return -EROFS
> explicitly if writing was requested.
>
> Signed-off-by: Fabian Vogt <fvogt@suse.de>

Sadly this patch breaks Windows builds:
  In file included from util/grub-mount.c:36:0:
  /usr/include/fuse/fuse.h:33:25: fatal error: sys/statvfs.h: No such file or directory
   #include <sys/statvfs.h>
                         ^
  compilation terminated.

I think it happens because pkg-config is not aware we want make Windows
version of the GRUB. So, I would suggest to disable FUSE detection when
the host for tools is Windows.

And two nits below...

> ---
> v2: add __attribute__ ((unused))
>
>  Makefile.util.def |  4 +++-
>  configure.ac      | 16 +++++-----------
>  util/grub-mount.c | 25 ++++++++++++++++++++++---
>  3 files changed, 30 insertions(+), 15 deletions(-)
>
> diff --git a/Makefile.util.def b/Makefile.util.def
> index f8b356cc1..e92c1f346 100644
> --- a/Makefile.util.def
> +++ b/Makefile.util.def
> @@ -309,11 +309,13 @@ program = {
>    common = grub-core/disk/host.c;
>    common = grub-core/osdep/init.c;
>
> +  cflags = '$(FUSE_CFLAGS)';
> +
>    ldadd = libgrubmods.a;
>    ldadd = libgrubgcry.a;
>    ldadd = libgrubkern.a;
>    ldadd = grub-core/lib/gnulib/libgnu.a;
> -  ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) -lfuse';
> +  ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) $(FUSE_LIBS)';
>    condition = COND_GRUB_MOUNT;
>  };
>
> diff --git a/configure.ac b/configure.ac
> index 4f649edaf..1d40f9560 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1787,17 +1787,11 @@ if test x"$enable_grub_mount" = xno ; then
>  fi
>
>  if test x"$grub_mount_excuse" = x ; then
> -  AC_CHECK_LIB([fuse], [fuse_main_real], [],
> -               [grub_mount_excuse="need FUSE library"])
> -fi
> -
> -if test x"$grub_mount_excuse" = x ; then
> -  # Check for fuse headers.
> -  SAVED_CPPFLAGS="$CPPFLAGS"
> -  CPPFLAGS="$CPPFLAGS -DFUSE_USE_VERSION=26"
> -  AC_CHECK_HEADERS([fuse/fuse.h], [],
> -  	[grub_mount_excuse=["need FUSE headers"]])
> -  CPPFLAGS="$SAVED_CPPFLAGS"
> +  PKG_CHECK_MODULES([FUSE], [fuse3], [FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=32"], [

s/[FUSE]/[fuse3]/

> +    PKG_CHECK_MODULES([FUSE], [fuse], [FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=26"], [

s/[FUSE]/[fuse]/

Otherwise you cannot differentiate FUSE3 and FUSE detection just reading the
configure messages.

Daniel


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] grub-mount: Support libfuse 3
  2022-02-08 16:22   ` Daniel Kiper
@ 2022-03-10 23:18     ` Daniel Kiper
  0 siblings, 0 replies; 6+ messages in thread
From: Daniel Kiper @ 2022-03-10 23:18 UTC (permalink / raw)
  To: Fabian Vogt; +Cc: grub-devel

On Tue, Feb 08, 2022 at 05:22:45PM +0100, Daniel Kiper wrote:
> On Mon, Jan 17, 2022 at 03:34:37PM +0100, Fabian Vogt wrote:
> > libfuse 3.0.0 got released in 2016, with some API changes compared to 2.x.
> > This commit introduces support for 3.x while keeping it compatible with 2.6
> > as a fallback still.
> >
> > To detect fuse3, switch configure over to use pkg-config, which is simpler yet
> > more reliable than looking for library and header manually. Also set
> > FUSE_USE_VERSION that way, as it depends on the used libfuse version.
> >
> > Now that the CFLAGS are read from pkg-config, use just <fuse.h>, which works
> > with 2.x as well as 3.x and is recommended by libfuse upstream.
> >
> > One behaviour change of libfuse3 is that FUSE_ATOMIC_O_TRUNC is set by default,
> > which means that open with O_TRUNC is passed as-is instead of calling the
> > truncate operation. With libfuse2, truncate failed with -ENOSYS and that was
> > returned to the application. To make O_TRUNC fail with libfuse3, return -EROFS
> > explicitly if writing was requested.
> >
> > Signed-off-by: Fabian Vogt <fvogt@suse.de>
>
> Sadly this patch breaks Windows builds:
>   In file included from util/grub-mount.c:36:0:
>   /usr/include/fuse/fuse.h:33:25: fatal error: sys/statvfs.h: No such file or directory
>    #include <sys/statvfs.h>
>                          ^
>   compilation terminated.
>
> I think it happens because pkg-config is not aware we want make Windows
> version of the GRUB. So, I would suggest to disable FUSE detection when
> the host for tools is Windows.

Ugh... Operator error... I realized Windows build was using incorrect
pkg-config. When I installed correct one everything went smoothly.
Sorry for the noise. I will commit this patch together with other
patches next week.

> And two nits below...

I will fix them myself.

Daniel

> > ---
> > v2: add __attribute__ ((unused))
> >
> >  Makefile.util.def |  4 +++-
> >  configure.ac      | 16 +++++-----------
> >  util/grub-mount.c | 25 ++++++++++++++++++++++---
> >  3 files changed, 30 insertions(+), 15 deletions(-)
> >
> > diff --git a/Makefile.util.def b/Makefile.util.def
> > index f8b356cc1..e92c1f346 100644
> > --- a/Makefile.util.def
> > +++ b/Makefile.util.def
> > @@ -309,11 +309,13 @@ program = {
> >    common = grub-core/disk/host.c;
> >    common = grub-core/osdep/init.c;
> >
> > +  cflags = '$(FUSE_CFLAGS)';
> > +
> >    ldadd = libgrubmods.a;
> >    ldadd = libgrubgcry.a;
> >    ldadd = libgrubkern.a;
> >    ldadd = grub-core/lib/gnulib/libgnu.a;
> > -  ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) -lfuse';
> > +  ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) $(FUSE_LIBS)';
> >    condition = COND_GRUB_MOUNT;
> >  };
> >
> > diff --git a/configure.ac b/configure.ac
> > index 4f649edaf..1d40f9560 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -1787,17 +1787,11 @@ if test x"$enable_grub_mount" = xno ; then
> >  fi
> >
> >  if test x"$grub_mount_excuse" = x ; then
> > -  AC_CHECK_LIB([fuse], [fuse_main_real], [],
> > -               [grub_mount_excuse="need FUSE library"])
> > -fi
> > -
> > -if test x"$grub_mount_excuse" = x ; then
> > -  # Check for fuse headers.
> > -  SAVED_CPPFLAGS="$CPPFLAGS"
> > -  CPPFLAGS="$CPPFLAGS -DFUSE_USE_VERSION=26"
> > -  AC_CHECK_HEADERS([fuse/fuse.h], [],
> > -  	[grub_mount_excuse=["need FUSE headers"]])
> > -  CPPFLAGS="$SAVED_CPPFLAGS"
> > +  PKG_CHECK_MODULES([FUSE], [fuse3], [FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=32"], [
>
> s/[FUSE]/[fuse3]/
>
> > +    PKG_CHECK_MODULES([FUSE], [fuse], [FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=26"], [
>
> s/[FUSE]/[fuse]/
>
> Otherwise you cannot differentiate FUSE3 and FUSE detection just reading the
> configure messages.
>
> Daniel


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-03-10 23:18 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-12 14:09 [PATCH] grub-mount: Support libfuse 3 Fabian Vogt
2022-01-14 15:29 ` Daniel Kiper
2022-01-17 14:34 ` [PATCH v2] " Fabian Vogt
2022-01-20 17:02   ` Daniel Kiper
2022-02-08 16:22   ` Daniel Kiper
2022-03-10 23:18     ` Daniel Kiper

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.