Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2227009/?format=api
{ "id": 2227009, "url": "http://patchwork.ozlabs.org/api/patches/2227009/?format=api", "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=api", "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=api", "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=api", "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" ] }