{"id":2227009,"url":"http://patchwork.ozlabs.org/api/patches/2227009/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-ext4/patch/20260422233220.GI7739@frogsfrogsfrogs/","project":{"id":8,"url":"http://patchwork.ozlabs.org/api/projects/8/?format=json","name":"Linux ext4 filesystem development","link_name":"linux-ext4","list_id":"linux-ext4.vger.kernel.org","list_email":"linux-ext4@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260422233220.GI7739@frogsfrogsfrogs>","list_archive_url":null,"date":"2026-04-22T23:32:20","name":"[RFC,3/4] fuseiso: enable systemd service mode","commit_ref":null,"pull_url":null,"state":"not-applicable","archived":false,"hash":"551cfa52e312ad5b909597d4f80c65ae9861a03f","submitter":{"id":77032,"url":"http://patchwork.ozlabs.org/api/people/77032/?format=json","name":"Darrick J. Wong","email":"djwong@kernel.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-ext4/patch/20260422233220.GI7739@frogsfrogsfrogs/mbox/","series":[{"id":501128,"url":"http://patchwork.ozlabs.org/api/series/501128/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-ext4/list/?series=501128","date":"2026-04-22T23:29:50","name":"[RFC,1/4] fusefatfs: enable fuse systemd service mode","version":1,"mbox":"http://patchwork.ozlabs.org/series/501128/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2227009/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2227009/checks/","tags":{},"related":[],"headers":{"Return-Path":"\n <SRS0=OlAD=CV=vger.kernel.org=linux-ext4+bounces-16036-patchwork-incoming=ozlabs.org@ozlabs.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-ext4@vger.kernel.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","patchwork-incoming@ozlabs.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=ORliHy3i;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=ozlabs.org\n (client-ip=2404:9400:2221:ea00::3; helo=mail.ozlabs.org;\n envelope-from=srs0=olad=cv=vger.kernel.org=linux-ext4+bounces-16036-patchwork-incoming=ozlabs.org@ozlabs.org;\n receiver=patchwork.ozlabs.org)","gandalf.ozlabs.org;\n arc=pass smtp.remote-ip=172.234.253.10 arc.chain=subspace.kernel.org","gandalf.ozlabs.org;\n dmarc=pass (p=quarantine dis=none) header.from=kernel.org","gandalf.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=ORliHy3i;\n\tdkim-atps=neutral","gandalf.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.234.253.10; helo=sea.lore.kernel.org;\n envelope-from=linux-ext4+bounces-16036-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"ORliHy3i\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"],"Received":["from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g1Fwz2YGPz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 23 Apr 2026 09:36:35 +1000 (AEST)","from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3])\n\tby gandalf.ozlabs.org (Postfix) with ESMTP id 4g1Fwz25lJz4wKB\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 23 Apr 2026 09:36:35 +1000 (AEST)","by gandalf.ozlabs.org (Postfix)\n\tid 4g1Fwz22Gzz4wKP; Thu, 23 Apr 2026 09:36:35 +1000 (AEST)","from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby gandalf.ozlabs.org (Postfix) with ESMTPS id 4g1Fwv5n9Xz4wKB\n\tfor <patchwork-incoming@ozlabs.org>; Thu, 23 Apr 2026 09:36:31 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id E5AD0307ABAB\n\tfor <patchwork-incoming@ozlabs.org>; Wed, 22 Apr 2026 23:32:22 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 317173A4501;\n\tWed, 22 Apr 2026 23:32:21 +0000 (UTC)","from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id E51BE301472;\n\tWed, 22 Apr 2026 23:32:20 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id B8EEEC19425;\n\tWed, 22 Apr 2026 23:32:20 +0000 (UTC)"],"ARC-Seal":["i=2; a=rsa-sha256; d=ozlabs.org; s=201707; t=1776900995; cv=pass;\n\tb=RwDGa5gZd8bs1QnZaXvDAtYrWB8As/7E56LVoEdEs8f72bu86Bxsy1n+EE4Dc4Ig2u9EkDK6QYV6fOVsxUeiQaEMJaA8IQNphUPSwM63sbtbOsF20y8CqoZ+2VAqgZ/trsdB1FTteB9+An1GvmdKraipGQHwovsXei1efwRJZgWi/+Vh3ysDOVT/V+hOCot1PWUfVGdn7IKX32jc9V94mjj2dNq8BNRS7L7gv19SsKOk+rSCKbIy5YNi0UiuxgDDK8+uSvhaHC55q47Zn1FQPD9CxhEnMZoM3K4Q8WVTp946DNhF0wNdgKa3opaMekD3PHGy66a7lMY0Tx1zqOkB9w==","i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1776900741; cv=none;\n b=SR9qniIOJ+gYOS8HEMUZgULI0nmibROn012re1NWe6K7kF/ftJ7IVRv5BqCS2MmXs7jKmnnkw8KxOK1Ktq35NSGesn68baLbIVVEuSM+JUPuaLduUoWtSNkOnKXmTmHOOy4Pw/wnkm5a2cKTIIcHcAJLT8CoshcBvajnLXUXHdU="],"ARC-Message-Signature":["i=2; a=rsa-sha256; d=ozlabs.org; s=201707;\n\tt=1776900995; c=relaxed/relaxed;\n\tbh=WIldyUERoJFxWk50xDyXf6/4Kpn3JHBhkNKX75u+Gg4=;\n\th=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version:\n\t Content-Type:Content-Disposition:In-Reply-To;\n b=cNDCsZ9rEwSFb/CnkS772JtJ5NRocYqfs6slRNzwOaRRcazlZMT2281gKDxtoJvOhh2BYcwW6KCSkJGFxa3bXilBJ/EHWHAAOwzq5fLvv8+NJ4xcQcayqQVKp3ciAlY5iNs1af3ozLcyHJy4FhJPrRCIyzh9klPjBEleFaT4D7Yt3Kwogvi//HL2lsASdyLeY3QP51OZEJwHjEakXSnxjS9HpgPOBMlWOhXpne8a6FLgL+2+CDMyHA61oREwxM7GIayEHTx7b0K/aeN5gvEJvGgRil8m5y85t0QiGes/7nOSO5GSNl21UUpzbN8lMtrjwlHHT2sDzinAlcQX+wRMKg==","i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1776900741; c=relaxed/simple;\n\tbh=WwnC7XitwZWKv4lRazmoyJetBh+19Er4i2EDf+JnNfc=;\n\th=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version:\n\t Content-Type:Content-Disposition:In-Reply-To;\n b=Qvp9C76acXsbpnJs2fDYu9HWhiM3B1iHGuR5EG24E9vtRMunSsUtPPw+BwoU6BjIYGnydoJ+GCEXZbUwimLXaodRXFRjJfvvZSFxgjJMAoQq/IHrj0O6xbw0W3P0mG5SVeqV4XnZglR2RBunyW1Mwml1Ye1KGw1Wg8xevFbTkHg="],"ARC-Authentication-Results":["i=2; gandalf.ozlabs.org;\n dmarc=pass (p=quarantine dis=none) header.from=kernel.org;\n dkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=ORliHy3i; dkim-atps=neutral;\n spf=pass (client-ip=172.234.253.10; helo=sea.lore.kernel.org;\n envelope-from=linux-ext4+bounces-16036-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org) smtp.mailfrom=vger.kernel.org","i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=ORliHy3i; arc=none smtp.client-ip=10.30.226.201"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1776900740;\n\tbh=WwnC7XitwZWKv4lRazmoyJetBh+19Er4i2EDf+JnNfc=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=ORliHy3ioGXo3PgiRUVurWuBUrYoLjtAXXlw0Sv1r+oscSzizAVkPV1n6ZYgST/TY\n\t y2zOviz0ZrFTNaDsghG+PrD5VDyLLZdTr0rPWOvYhqlT0f0/Xl6CRRfFXXXzK5uncf\n\t NawY2uVRsLFDAReHYBlXOz30RZkIXRddjHonI+gVgqFWcXisLfG5psERT+5U3fVEaN\n\t EtFjwNqTenhc06Ud77aSkXfk85cMREp2YOgArBx6b3UomGrkY1/+IZ3N/cKM+6j21e\n\t wN0+//WShnS48GNC9ZRp9AkquLJ9NEFuhG7NffMkWAdrChBiVrzraOO+RKRIXscOJA\n\t eD2NM1tkV+5Ug==","Date":"Wed, 22 Apr 2026 16:32:20 -0700","From":"\"Darrick J. Wong\" <djwong@kernel.org>","To":"linux-fsdevel <linux-fsdevel@vger.kernel.org>,\n\tlinux-ext4 <linux-ext4@vger.kernel.org>,\n\tfuse-devel <fuse-devel@lists.linux.dev>","Cc":"Miklos Szeredi <miklos@szeredi.hu>, Bernd Schubert <bernd@bsbernd.com>,\n\tJoanne Koong <joannelkoong@gmail.com>,\n\tTheodore Ts'o <tytso@mit.edu>, Neal Gompa <neal@gompa.dev>,\n\tAmir Goldstein <amir73il@gmail.com>,\n\tChristian Brauner <brauner@kernel.org>, demiobenour@gmail.com","Subject":"[RFC PATCH 3/4] fuseiso: enable systemd service mode","Message-ID":"<20260422233220.GI7739@frogsfrogsfrogs>","References":"<20260422231518.GA7717@frogsfrogsfrogs>","Precedence":"bulk","X-Mailing-List":"linux-ext4@vger.kernel.org","List-Id":"<linux-ext4.vger.kernel.org>","List-Subscribe":"<mailto:linux-ext4+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-ext4+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<20260422231518.GA7717@frogsfrogsfrogs>","X-Spam-Status":"No, score=-1.2 required=5.0 tests=ARC_SIGNED,ARC_VALID,\n\tDKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DMARC_PASS,\n\tMAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=disabled\n\tversion=4.0.1","X-Spam-Checker-Version":"SpamAssassin 4.0.1 (2024-03-25) on gandalf.ozlabs.org"},"content":"From: Darrick J. Wong <djwong@kernel.org>\n\nEnable use of fuseiso as a contained fuse service.  This is a patch\nagainst the Debian package, which was ported to fuse3.\n\nSigned-off-by: \"Darrick J. Wong\" <djwong@kernel.org>\n---\n src/isofs.h             |    2 -\n configure.in            |  148 +++++++++++++++++++++++++++++++++++++++++++++++\n src/Makefile.am         |   16 +++++\n src/fuseiso.c           |  134 +++++++++++++++++++++++++++++++++++++------\n src/fuseiso.socket.in   |   16 +++++\n src/fuseiso@.service.in |  102 ++++++++++++++++++++++++++++++++\n 6 files changed, 398 insertions(+), 20 deletions(-)\n create mode 100644 src/fuseiso.socket.in\n create mode 100644 src/fuseiso@.service.in","diff":"diff --git a/src/isofs.h b/src/isofs.h\nindex 3755e886c9ccc2..b765baf209d77e 100644\n--- a/src/isofs.h\n+++ b/src/isofs.h\n@@ -25,7 +25,7 @@\n #include <linux/iso_fs.h>\n #include <linux/rock.h>\n \n-#define FUSE_USE_VERSION 314\n+#define FUSE_USE_VERSION 319\n #include <fuse.h>\n \n typedef struct _isofs_context {\ndiff --git a/configure.in b/configure.in\nindex 9692dc114bfd73..30e2726cea8f2f 100644\n--- a/configure.in\n+++ b/configure.in\n@@ -7,7 +7,153 @@ AC_LANG_C\n AC_PROG_CC\n AM_PROG_LIBTOOL\n \n-PKG_CHECK_MODULES([FUSE],[fuse3 >= 3.14.0],[],[AC_MSG_ERROR([libfuse3 is required])])\n+PKG_CHECK_MODULES([FUSE],[fuse3 >= 3.19.0],[have_fuse3_pkg=yes],[AC_MSG_ERROR([libfuse3 is required])])\n PKG_CHECK_MODULES([GLIB],[glib-2.0],[],[AC_MSG_ERROR([glib-2.0 is required])])\n \n+dnl\n+dnl Check if the FUSE library tells us where to put fs service sockets\n+dnl\n+have_fuse_service=\n+fuse_service_socket_dir=\n+if test -n \"$have_fuse3_pkg\"\n+then\n+\tAC_ARG_WITH([fuse_service_socket_dir],\n+\t  [AS_HELP_STRING([--with-fuse-service-socket-dir@<:@=DIR@:>@],\n+\t\t  [Create fuse3 filesystem service sockets in DIR.])],\n+\t  [],\n+\t  [with_fuse_service_socket_dir=yes])\n+\tAS_IF([test \"x${with_fuse_service_socket_dir}\" != \"xno\"],\n+\t  [\n+\t\tAS_IF([test \"x${with_fuse_service_socket_dir}\" = \"xyes\"],\n+\t\t  [\n+\t\t\tAS_IF([test \"x$have_fuse3_pkg\" = \"xyes\" ],\n+\t\t\t  [\n+\t\t\t\twith_fuse_service_socket_dir=\"$($PKG_CONFIG --variable=service_socket_dir fuse3)\"\n+\t\t\t  ], [\n+\t\t\t\twith_fuse_service_socket_dir=\"\"\n+\t\t\t  ])\n+\t\t  ])\n+\t\tAC_MSG_CHECKING([for fuse3 service socket dir])\n+\t\tfuse_service_socket_dir=\"${with_fuse_service_socket_dir}\"\n+\t\tAS_IF([test -n \"${fuse_service_socket_dir}\"],\n+\t\t  [\n+\t\t\tAC_MSG_RESULT(${fuse_service_socket_dir})\n+\t\t  ],\n+\t\t  [\n+\t\t\tAC_MSG_RESULT(no)\n+\t\t  ])\n+\t  ],\n+\t  [])\n+\tAC_ARG_WITH([fuse_service_socket_perms],\n+\t  [AS_HELP_STRING([--with-fuse-service-socket-perms@<:@=MODE@:>@],\n+\t\t  [Create fuse3 filesystem service socket with these permissions.])],\n+\t  [],\n+\t  [with_fuse_service_socket_perms=yes])\n+\tAS_IF([test \"x${with_fuse_service_socket_perms}\" != \"xno\"],\n+\t  [\n+\t\tAS_IF([test \"x${with_fuse_service_socket_perms}\" = \"xyes\"],\n+\t\t  [\n+\t\t\tAS_IF([test \"x$have_fuse3_pkg\" = \"xyes\" ],\n+\t\t\t  [\n+\t\t\t\twith_fuse_service_socket_perms=\"$($PKG_CONFIG --variable=service_socket_perms fuse3)\"\n+\t\t\t  ], [\n+\t\t\t\twith_fuse_service_socket_perms=\"\"\n+\t\t\t  ])\n+\t\t  ])\n+\t\tfuse_service_socket_perms=\"${with_fuse_service_socket_perms}\"\n+\t  ],\n+\t  [])\n+\n+\tAC_MSG_CHECKING([for fuse_service_accept in libfuse])\n+\told_cflags=\"$CFLAGS\"\n+\tCFLAGS=\"$CFLAGS $FUSE_CFLAGS\"\n+\tAC_LINK_IFELSE(\n+\t[\tAC_LANG_PROGRAM([[\n+\t#define _GNU_SOURCE\n+\t#define _FILE_OFFSET_BITS\t64\n+\t#define FUSE_USE_VERSION\t319\n+\t#include <fuse_lowlevel.h>\n+\t#include <fuse_service.h>\n+\t\t]], [[\n+\tstruct fuse_service *moo;\n+\tfuse_service_accepted(moo);\n+\t\t]])\n+\t], have_fuse_service_accept=yes\n+\t   AC_MSG_RESULT(yes),\n+\t   AC_MSG_RESULT(no))\n+\tCFLAGS=\"$old_cflags\"\n+\n+\tAC_MSG_CHECKING([for fuse3 service support])\n+\tAS_IF([test -n \"${fuse_service_socket_dir}\" && test \"${have_fuse_service_accept}\" = \"yes\"],\n+\t  [\n+\t\tAC_MSG_RESULT(yes)\n+\t\thave_fuse_service=\"yes\"\n+\t  ],\n+\t  [\n+\t\tAC_MSG_RESULT(no)\n+\t  ])\n+fi\n+AC_SUBST(have_fuse_service)\n+AC_SUBST(fuse_service_socket_dir)\n+AC_SUBST(fuse_service_socket_perms)\n+if test \"$have_fuse_service\" = yes\n+then\n+\tAC_DEFINE(HAVE_FUSE_SERVICE, 1, [Define to 1 if fuse supports service])\n+fi\n+\n+dnl\n+dnl Where do systemd services go?\n+dnl\n+AC_ARG_WITH([systemd_unit_dir],\n+  [AS_HELP_STRING([--with-systemd-unit-dir@<:@=DIR@:>@],\n+\t[Install systemd system units into DIR.])],\n+  [],\n+  [with_systemd_unit_dir=yes])\n+AS_IF([test \"x${with_systemd_unit_dir}\" != \"xno\"],\n+  [\n+\tAS_IF([test \"x${with_systemd_unit_dir}\" = \"xyes\"],\n+\t  [\n+\t\tPKG_CHECK_MODULES([systemd], [systemd],\n+\t\t  [\n+\t\t\twith_systemd_unit_dir=\"$($PKG_CONFIG --variable=systemdsystemunitdir systemd)\"\n+\t\t  ], [\n+\t\t\twith_systemd_unit_dir=\"\"\n+\t\t  ])\n+\t\tm4_pattern_allow([^PKG_(MAJOR|MINOR|BUILD|REVISION)$])\n+\t  ])\n+\tAC_MSG_CHECKING([for systemd system unit dir])\n+\tsystemd_system_unit_dir=\"${with_systemd_unit_dir}\"\n+\tAS_IF([test -n \"${systemd_system_unit_dir}\"],\n+\t  [\n+\t\tAC_MSG_RESULT(${systemd_system_unit_dir})\n+\t\thave_systemd=\"yes\"\n+\t  ],\n+\t  [\n+\t\tAC_MSG_RESULT(no)\n+\t\thave_systemd=\"no\"\n+\t  ])\n+  ],\n+  [\n+\thave_systemd=\"disabled\"\n+  ])\n+AC_SUBST(have_systemd)\n+AC_SUBST(systemd_system_unit_dir)\n+\n+AC_MSG_CHECKING([for fuseiso service support and systemd])\n+AS_IF([test \"${FUSE4FS_CMT}${have_fuse_service}${have_systemd}\" = \"yesyes\"],\n+      [\n+           AC_MSG_RESULT(yes)\n+           AC_DEFINE(HAVE_FUSEISO_FUSE_SERVICE, 1,\n+                     [Define to 1 if fuseiso should be built with fuse service support])\n+           have_fuseiso_fuse_service=yes\n+           AM_CONDITIONAL(HAVE_FUSEISO_FUSE_SERVICE, [true])\n+      ],\n+      [\n+           AC_MSG_RESULT(no)\n+           AM_CONDITIONAL(HAVE_FUSEISO_FUSE_SERVICE, [false])\n+           have_fuseiso_fuse_service=no\n+      ]\n+)\n+AC_SUBST(have_fuseiso_service)\n+\n AC_OUTPUT(Makefile src/Makefile zAppRun/Makefile)\ndiff --git a/src/Makefile.am b/src/Makefile.am\nindex cb05da8cd1653c..97cded13a71c96 100644\n--- a/src/Makefile.am\n+++ b/src/Makefile.am\n@@ -8,4 +8,20 @@ INCLUDES= $(all_includes)\n fuseiso_LDFLAGS = $(all_libraries) $(FUSE_LIBS) $(GLIB_LIBS) -lz\n noinst_HEADERS = isofs.h\n \n+if HAVE_FUSEISO_FUSE_SERVICE\n+bin_SCRIPTS = fuseiso.socket fuseiso@.service\n+endif\n+\n+fuseiso.socket: fuseiso.socket.in\n+\tsed \\\n+\t\t-e \"s|@FUSE3_SERVICE_SOCKET_DIR@|$(fuse_service_socket_dir)|g\" \\\n+\t\t-e \"s|@FUSE3_SERVICE_SOCKET_PERMS@|$(fuse_service_socket_perms)|g\" \\\n+\t\t< $< > $@\n+\n+fuseiso@.service: fuseiso@.service.in\n+\tsed -e \"s|@BINDIR@|$(bindir)|g\" \\\n+\t\t   < $< > $@\n+\n+EXTRA_PROGRAMS=$(SERVICE_FILES)\n+\n AM_CFLAGS = -D_FILE_OFFSET_BITS=64 $(FUSE_CFLAGS) $(GLIB_CFLAGS) -Wall\ndiff --git a/src/fuseiso.c b/src/fuseiso.c\nindex 47b94c72161c5f..46b2a61429074b 100644\n--- a/src/fuseiso.c\n+++ b/src/fuseiso.c\n@@ -38,12 +38,16 @@\n \n #include <linux/iso_fs.h>\n \n-#define FUSE_USE_VERSION 314\n+#define FUSE_USE_VERSION 319\n #include <fuse.h>\n \n #include <zlib.h>\n #include <locale.h>\n #include <langinfo.h>\n+#ifdef HAVE_FUSEISO_FUSE_SERVICE\n+# include <sys/mount.h>\n+# include <fuse_service.h>\n+#endif\n \n #include \"isofs.h\"\n \n@@ -61,6 +65,78 @@ int maintain_mount_point;\n int maintain_mtab;\n char* iocharset;\n \n+#ifdef HAVE_FUSEISO_FUSE_SERVICE\n+static struct fuse_service *service;\n+\n+static inline bool isofs_is_service(void)\n+{\n+    return fuse_service_accepted(service);\n+}\n+\n+static int isofs_service_connect(struct fuse_args *args)\n+{\n+    int ret;\n+\n+    ret = fuse_service_accept(&service);\n+    if (ret)\n+        return ret;\n+\n+    if (fuse_service_accepted(service))\n+        return fuse_service_append_args(service, args);\n+\n+    return 0;\n+}\n+\n+static int isofs_service_get_config(const char *device, int *fdp)\n+{\n+    int fd;\n+    int ret;\n+\n+    ret = fuse_service_request_file(service, device, O_RDONLY, 0, 0);\n+    if (ret)\n+        return ret;\n+\n+    ret = fuse_service_receive_file(service, device, &fd);\n+    if (ret)\n+        return ret;\n+\n+    if (fd < 0) {\n+        fprintf(stderr, \"%s opening device: %s.\\n\", device,\n+                strerror(-fd));\n+        return -1;\n+    }\n+    *fdp = fd;\n+\n+    return fuse_service_finish_file_requests(service);\n+}\n+\n+static int isofs_service_main(int fuseopts_cnt, char **fuseopts,\n+                              const struct fuse_operations *ops)\n+{\n+    struct fuse_args args = FUSE_ARGS_INIT(fuseopts_cnt, fuseopts);\n+\n+    fuse_service_expect_mount_format(service, S_IFDIR);\n+    return fuse_service_main(service, &args, ops, NULL);\n+}\n+\n+static int isofs_service_finish(int exitcode)\n+{\n+    if (!isofs_is_service())\n+        return exitcode;\n+\n+    fuse_service_send_goodbye(service, exitcode);\n+    fuse_service_destroy(&service);\n+\n+    return fuse_service_exit(exitcode);\n+}\n+#else\n+# define isofs_is_service(...)\t\t(false)\n+# define isofs_service_connect(...)\t(0)\n+# define isofs_service_get_config(...)\t(EOPNOTSUPP)\n+# define isofs_service_main(...)\t(1)\n+# define isofs_service_finish(ret)\t(ret)\n+#endif /* HAVE_FUSEISO_FUSE_SERVICE */\n+\n char* normalize_name(const char* fname) {\n     char* abs_fname = (char *) malloc(PATH_MAX);\n     realpath(fname, abs_fname);\n@@ -305,6 +381,8 @@ void usage(const char* prog) {\n \n int main(int argc, char *argv[])\n {\n+    struct fuse_args args = FUSE_ARGS_INIT(argc, argv);\n+\n     setlocale(LC_ALL, \"\"); // set current locale for proper iocharset\n     \n     // defaults\n@@ -315,10 +393,15 @@ int main(int argc, char *argv[])\n     char **fuseopts = reallocarray(NULL, 1, sizeof(*fuseopts));\n     fuseopts[0] = argv[0];\n     size_t fuseopts_cnt = 1;\n+    int rc;\n+\n+    rc = isofs_service_connect(&args);\n+    if (rc)\n+        exit(EXIT_FAILURE);\n     \n     int c;\n     char *s;\n-    while((c = getopt(argc, argv, \"+npc:ho:sfdV\")) > 0) {\n+    while((c = getopt(args.argc, args.argv, \"+npc:ho:sfdV\")) > 0) {\n         switch((char)c) {\n             case 'n':\n                 maintain_mtab = 0;\n@@ -361,26 +444,35 @@ int main(int argc, char *argv[])\n         };\n     };\n     \n-    if((argc - optind) < 2) {\n+    if((args.argc - optind) < 2) {\n         usage(argv[0]);\n         exit(EXIT_FAILURE);\n     };\n     \n-    imagefile = normalize_name(argv[optind++]);\n+    imagefile = normalize_name(args.argv[optind++]);\n+\n+    if (isofs_is_service()) {\n+        maintain_mtab = 0;\n+        maintain_mount_point = 0;\n+\n+        rc = isofs_service_get_config(imagefile, &image_fd);\n+        if (rc || image_fd < 0)\n+            exit(EXIT_FAILURE);\n+    } else {\n+        image_fd = open(imagefile, O_RDONLY);\n+        if(image_fd == -1) {\n+            fprintf(stderr, \"Supplied image file name: \\\"%s\\\"\\n\", imagefile);\n+            perror(\"Can`t open image file\");\n+            exit(EXIT_FAILURE);\n+        };\n+    }\n     \n-    image_fd = open(imagefile, O_RDONLY);\n-    if(image_fd == -1) {\n-        fprintf(stderr, \"Supplied image file name: \\\"%s\\\"\\n\", imagefile);\n-        perror(\"Can`t open image file\");\n-        exit(EXIT_FAILURE);\n-    };\n+    mount_point = normalize_name(args.argv[optind]);\n     \n-    mount_point = normalize_name(argv[optind]);\n+    fuseopts = reallocarray(fuseopts, fuseopts_cnt + args.argc - optind, sizeof(*fuseopts));\n     \n-    fuseopts = reallocarray(fuseopts, fuseopts_cnt + argc - optind, sizeof(*fuseopts));\n-    \n-    while(optind < argc) {\n-        fuseopts[fuseopts_cnt++] = argv[optind++];\n+    while(optind < args.argc) {\n+        fuseopts[fuseopts_cnt++] = args.argv[optind++];\n     };\n     \n     if(!iocharset) {\n@@ -395,7 +487,6 @@ int main(int argc, char *argv[])\n         };\n     };\n     \n-    int rc;\n     if(maintain_mount_point) {\n         rc = check_mount_point();\n         if(rc != 0) {\n@@ -412,6 +503,13 @@ int main(int argc, char *argv[])\n     \n     // will exit in case of failure\n     rc = isofs_real_preinit(imagefile, image_fd);\n-    \n-    return fuse_main(fuseopts_cnt, fuseopts, &isofs_oper, NULL);\n+    if (rc)\n+        exit(EXIT_FAILURE);\n+\n+    if (isofs_is_service())\n+        rc = isofs_service_main(fuseopts_cnt, fuseopts, &isofs_oper);\n+    else\n+        rc = fuse_main(fuseopts_cnt, fuseopts, &isofs_oper, NULL);\n+\n+    return isofs_service_finish(rc);\n };\ndiff --git a/src/fuseiso.socket.in b/src/fuseiso.socket.in\nnew file mode 100644\nindex 00000000000000..a2ea11e408fa81\n--- /dev/null\n+++ b/src/fuseiso.socket.in\n@@ -0,0 +1,16 @@\n+# SPDX-License-Identifier: GPL-2.0-or-later\n+#\n+# Copyright (C) 2026 Oracle.  All Rights Reserved.\n+# Author: Darrick J. Wong <djwong@kernel.org>\n+[Unit]\n+Description=Socket for fuseiso Service\n+\n+[Socket]\n+ListenSequentialPacket=@FUSE3_SERVICE_SOCKET_DIR@/isofs\n+ListenSequentialPacket=@FUSE3_SERVICE_SOCKET_DIR@/iso9660\n+Accept=yes\n+SocketMode=@FUSE3_SERVICE_SOCKET_PERMS@\n+RemoveOnStop=yes\n+\n+[Install]\n+WantedBy=sockets.target\ndiff --git a/src/fuseiso@.service.in b/src/fuseiso@.service.in\nnew file mode 100644\nindex 00000000000000..7f2d8977ccf6a9\n--- /dev/null\n+++ b/src/fuseiso@.service.in\n@@ -0,0 +1,102 @@\n+# SPDX-License-Identifier: GPL-2.0-or-later\n+#\n+# Copyright (C) 2026 Oracle.  All Rights Reserved.\n+# Author: Darrick J. Wong <djwong@kernel.org>\n+[Unit]\n+Description=fuseiso Service\n+\n+# Don't leave failed units behind, systemd does not clean them up!\n+CollectMode=inactive-or-failed\n+\n+[Service]\n+Type=exec\n+ExecStart=/@BINDIR@/fuseiso\n+\n+# Try to capture core dumps\n+LimitCORE=infinity\n+\n+SyslogIdentifier=%N\n+\n+# No realtime CPU scheduling\n+RestrictRealtime=true\n+\n+# Don't let us see anything in the regular system, and don't run as root\n+DynamicUser=true\n+ProtectSystem=strict\n+ProtectHome=true\n+PrivateTmp=true\n+PrivateDevices=true\n+PrivateUsers=true\n+\n+# No network access\n+PrivateNetwork=true\n+ProtectHostname=true\n+RestrictAddressFamilies=none\n+IPAddressDeny=any\n+\n+# Don't let the program mess with the kernel configuration at all\n+ProtectKernelLogs=true\n+ProtectKernelModules=true\n+ProtectKernelTunables=true\n+ProtectControlGroups=true\n+ProtectProc=invisible\n+RestrictNamespaces=true\n+RestrictFileSystems=\n+\n+# Hide everything in /proc, even /proc/mounts\n+ProcSubset=pid\n+\n+# Only allow the default personality Linux\n+LockPersonality=true\n+\n+# No writable memory pages\n+MemoryDenyWriteExecute=true\n+\n+# Don't let our mounts leak out to the host\n+PrivateMounts=true\n+\n+# Restrict system calls to the native arch and only enough to get things going\n+SystemCallArchitectures=native\n+SystemCallFilter=@system-service\n+SystemCallFilter=~@privileged\n+SystemCallFilter=~@resources\n+\n+SystemCallFilter=~@clock\n+SystemCallFilter=~@cpu-emulation\n+SystemCallFilter=~@debug\n+SystemCallFilter=~@module\n+SystemCallFilter=~@reboot\n+SystemCallFilter=~@swap\n+\n+SystemCallFilter=~@mount\n+\n+# libfuse io_uring wants to pin cores and memory\n+SystemCallFilter=mbind\n+SystemCallFilter=sched_setaffinity\n+\n+# Leave a breadcrumb if we get whacked by the system call filter\n+SystemCallErrorNumber=EL3RST\n+\n+# Log to the kernel dmesg, just like an in-kernel ext4 driver\n+StandardOutput=append:/dev/ttyprintk\n+StandardError=append:/dev/ttyprintk\n+\n+# Run with no capabilities at all\n+CapabilityBoundingSet=\n+AmbientCapabilities=\n+NoNewPrivileges=true\n+\n+# fuse4fs doesn't create files\n+UMask=7777\n+\n+# No access to hardware /dev files at all\n+ProtectClock=true\n+DevicePolicy=closed\n+\n+# Don't mess with set[ug]id anything.\n+RestrictSUIDSGID=true\n+\n+# Don't let OOM kills of processes in this containment group kill the whole\n+# service, because we don't want filesystem drivers to go down.\n+OOMPolicy=continue\n+OOMScoreAdjust=-1000\n","prefixes":["RFC","3/4"]}