From: John Groves <[email protected]>

This patch series introduces famfs as a standalone file system, as a pivot
back from fuse/libfuse, for which the porting effort took close to a year, but
then the review effort started with almost a yearlong delay, and then got
messy :D [3].

However, after years of maintaining famfs in both forms (standalone and fuse -
the famfs user space works with both) I think famfs makes more sense as a
standalone file system - and some influential maintainers have privately
expressed that opinion to me.

The most important thing to know about famfs is that it CANNOT be used as a
general purpose file system. It is for enabling file-based byte-level access
(including direct mmap) to very large (e.g. 100TB) shared/disaggregated
memory appliances - which have become available during this long process,
and which are in need of Linux support.

So famfs cannot be used by anybody who doesn't know why they need it; Making
famfs standalone means it can't affect users who don't use it. And my super-
mega-corp employer (Micron), as well as other memory companies, need it.
We do not intend to abandon it, but imagine if we did: fs/famfs/ should be
removed if the memory companies can't be bothered to maintain it.

This code base has been in active CI and used globally by early adopters and
testers of disaggregated memory. I believe it is solid.

History (skip if you lived it like I did :D)

Famfs was introduced at LPC 2023 and LSFMM 2024 [1] as a standalone file
system. The fuse odyssey started at LSFMM 24, but I think it's time to
bring that to a close. The first fuse/libfuse patches came out in April
2025 [2] - adding a substantial amount of complexity to the famfs user space,
and controversial complexity to fuse [3].

The fuse community was uncomfortable with the new metadata and fuse message
formats that famfs needs, going so far as to suggest that famfs use a BPF
program as a vma fault handler [3] to avoid the need to pass famfs file
metadata via fuse messages - an idea which, to my relief, was definitively
shot down at LSFMM 2026 [4].

In that session, I was preparing to make the pivot-to-standalone argument,
and there were others in the room who support that - but Miklos stated that
he was not opposed to merging famfs as it stands [4], leading me to back off
of the standalone pivot at the time.

However, 1) that is not how the recent patch discussions have been going [5],
and 2) I have (not solely on that basis) come to the conclusion that famfs
makes more sense as a standalone entity. In v11 [5] I dropped the
controversial famfs interleaved extent (exploding fmaps from well under a
page to megabytes), and there is still a push for adding an intermediate
virtual backing dev layer that famfs does not need and can't really live
with. I could go on...

My argument

Can we make famfs work in fuse? Yes, if we can agree some things that have
been quite challenging to agree on. Should we? I think not.

I think famfs adds complexity to fuse that will not likely see constructive
re-use. And I think fuse makes famfs worse - significantly more complex, less
adaptable to change, and less performant. And famfs files are memory - access
needs to run at memory speeds! In short the risks out-weigh the benefits.

About this patch series

I've called it V12 for recent continuity; there was a V1 and a V2 standalone
in 2024, and then V1-V11 were fuse (call this selective consistency).

Famfs depends on the 'fsdev' dax mode which landed in 7.1 - it will only run
with an fsdev-mode (aka famfs-mode) daxdev as its backing device(s).

Patch 01 is a fix to the fsdev driver that is needed by the rest of the
series.

Famfs Overview

Famfs exposes sharable disaggregated memory as a file system. Famfs consumes
shared memory from [usually shared memory] dax devices, and provides
memory-mappable files that map directly to the memory - no page cache
involvement. Famfs differs from conventional file systems in fs-dax mode,
in that it handles in-memory metadata in a sharable way (which begins with
never caching dirty shared metadata). So a famfs file system can be mounted
from multiple nodes, provided they have access to the memory.

The key performance requirement is that famfs must resolve mapping
faults with minimal overhead. This is achieved by fully caching the
file-to-devdax metadata for all active files.

Famfs remains the first fs-dax file system that is backed by devdax
rather than pmem in fs-dax mode (hence the need for the new dax mode).

The famfs user space can be found at [6]

[1] https://lwn.net/Articles/983105/ (Famfs at LSFMM 2024)
[2] https://lwn.net/Articles/1020170/ (Famfs at LSFMM 2025, with patch link)
[3] https://lwn.net/Articles/1068686/ (LWN coverage of the patch thread)
[4] https://lwn.net/Articles/1082687/ (Famfs at LSFMM 2026)
[5] 
https://lore.kernel.org/linux-fsdevel/0100019f7d9fbe81-6cb16662-2522-47ea-a152-fab0ee3d9b35-000...@email.amazonses.com/#b
[6] https://famfs.org

John Groves (12):
  dax: replace exported dax_dev_get() with non-allocating dax_dev_find()
  famfs: Module operations, fs_context, and mount
  famfs: Add daxdev table and dax notify_failure support
  famfs: Introduce inode_operations and super_operations
  famfs: Introduce file_operations read/write
  famfs: Introduce mmap and VM fault handling
  famfs: MAP_CREATE ioctl and fmap ingest (ABI 44)
  famfs: iomap_begin and file-to-dax offset resolution
  famfs: Register secondary daxdevs by path (FAMFSIOC_DAXDEV_OPEN)
  famfs: Add runtime operation-permission (opts) framework
  famfs: Report device capacity via statfs so df works
  famfs: Add documentation

 Documentation/filesystems/famfs.rst           | 142 +++
 Documentation/filesystems/index.rst           |   1 +
 .../userspace-api/ioctl/ioctl-number.rst      |   1 +
 MAINTAINERS                                   |   8 +
 drivers/dax/fsdev.c                           |  19 +
 drivers/dax/super.c                           |  38 +-
 fs/Kconfig                                    |   2 +
 fs/Makefile                                   |   1 +
 fs/famfs/Kconfig                              |  11 +
 fs/famfs/Makefile                             |   5 +
 fs/famfs/famfs_file.c                         | 983 ++++++++++++++++++
 fs/famfs/famfs_inode.c                        | 813 +++++++++++++++
 fs/famfs/famfs_internal.h                     | 162 +++
 fs/namei.c                                    |   1 +
 fs/super.c                                    |   7 +
 include/linux/dax.h                           |   7 +-
 include/linux/fs.h                            |   1 +
 include/uapi/linux/famfs_ioctl.h              | 160 +++
 include/uapi/linux/magic.h                    |   1 +
 19 files changed, 2360 insertions(+), 3 deletions(-)
 create mode 100644 Documentation/filesystems/famfs.rst
 create mode 100644 fs/famfs/Kconfig
 create mode 100644 fs/famfs/Makefile
 create mode 100644 fs/famfs/famfs_file.c
 create mode 100644 fs/famfs/famfs_inode.c
 create mode 100644 fs/famfs/famfs_internal.h
 create mode 100644 include/uapi/linux/famfs_ioctl.h

-- 
2.53.0



Reply via email to