[PATCH V12 00/12] famfs: the Fabric-Attached Memory File System (standalone)

John Groves <[email protected]> Mon, 3 Aug 2026 02:27:42 +0000
Newsgroups dev.linux.lists.nvdimm,dev.linux.lists.fuse-devel,org.kernel.vger.linux-cxl,org.kernel.vger.linux-doc,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel
Message-ID <0100019fc572ca94-ec363dd7-3a77-484b-b4b7-f2503a0931a6-000000@email.amazonses.com>
From: John Groves <[email protected]>=0D=0A=0D=0AThis patch series introduc=
es famfs as a standalone file system, as a pivot=0D=0Aback from fuse/libf=
use, for which the porting effort took close to a year, but=0D=0Athen the=
 review effort started with almost a yearlong delay, and then got=0D=0Ame=
ssy :D [3].=0D=0A=0D=0AHowever, after years of maintaining famfs in both =
forms (standalone and fuse -=0D=0Athe famfs user space works with both) I=
 think famfs makes more sense as a=0D=0Astandalone file system - and some=
 influential maintainers have privately=0D=0Aexpressed that opinion to me=
=2E=0D=0A=0D=0AThe most important thing to know about famfs is that it CA=
NNOT be used as a=0D=0Ageneral purpose file system. It is for enabling fi=
le-based byte-level access=0D=0A(including direct mmap) to very large (e.=
g. 100TB) shared/disaggregated=0D=0Amemory appliances - which have become=
 available during this long process,=0D=0Aand which are in need of Linux =
support.=0D=0A=0D=0ASo famfs cannot be used by anybody who doesn't know w=
hy they need it; Making=0D=0Afamfs standalone means it can't affect users=
 who don't use it. And my super-=0D=0Amega-corp employer (Micron), as wel=
l as other memory companies, need it.=0D=0AWe do not intend to abandon it=
, but imagine if we did: fs/famfs/ should be=0D=0Aremoved if the memory c=
ompanies can't be bothered to maintain it.=0D=0A=0D=0AThis code base has =
been in active CI and used globally by early adopters and=0D=0Atesters of=
 disaggregated memory. I believe it is solid.=0D=0A=0D=0AHistory (skip if=
 you lived it like I did :D)=0D=0A=0D=0AFamfs was introduced at LPC 2023 =
and LSFMM 2024 [1] as a standalone file=0D=0Asystem. The fuse odyssey sta=
rted at LSFMM 24, but I think it's time to=0D=0Abring that to a close. Th=
e first fuse/libfuse patches came out in April=0D=0A2025 [2] - adding a s=
ubstantial amount of complexity to the famfs user space,=0D=0Aand controv=
ersial complexity to fuse [3].=0D=0A=0D=0AThe fuse community was uncomfor=
table with the new metadata and fuse message=0D=0Aformats that famfs need=
s, going so far as to suggest that famfs use a BPF=0D=0Aprogram as a vma =
fault handler [3] to avoid the need to pass famfs file=0D=0Ametadata via =
fuse messages - an idea which, to my relief, was definitively=0D=0Ashot d=
own at LSFMM 2026 [4].=0D=0A=0D=0AIn that session, I was preparing to mak=
e the pivot-to-standalone argument,=0D=0Aand there were others in the roo=
m who support that - but Miklos stated that=0D=0Ahe was not opposed to me=
rging famfs as it stands [4], leading me to back off=0D=0Aof the standalo=
ne pivot at the time.=0D=0A=0D=0AHowever, 1) that is not how the recent p=
atch discussions have been going [5],=0D=0Aand 2) I have (not solely on t=
hat basis) come to the conclusion that famfs=0D=0Amakes more sense as a s=
tandalone entity. In v11 [5] I dropped the=0D=0Acontroversial famfs inter=
leaved extent (exploding fmaps from well under a=0D=0Apage to megabytes),=
 and there is still a push for adding an intermediate=0D=0Avirtual backin=
g dev layer that famfs does not need and can't really live=0D=0Awith. I c=
ould go on...=0D=0A=0D=0AMy argument=0D=0A=0D=0ACan we make famfs work in=
 fuse=3F Yes, if we can agree some things that have=0D=0Abeen quite chall=
enging to agree on. Should we=3F I think not.=0D=0A=0D=0AI think famfs ad=
ds complexity to fuse that will not likely see constructive=0D=0Are-use. =
And I think fuse makes famfs worse - significantly more complex, less=0D=0A=
adaptable to change, and less performant. And famfs files are memory - ac=
cess=0D=0Aneeds to run at memory speeds! In short the risks out-weigh the=
 benefits.=0D=0A=0D=0AAbout this patch series=0D=0A=0D=0AI've called it V=
12 for recent continuity; there was a V1 and a V2 standalone=0D=0Ain 2024=
, and then V1-V11 were fuse (call this selective consistency).=0D=0A=0D=0A=
Famfs depends on the 'fsdev' dax mode which landed in 7.1 - it will only =
run=0D=0Awith an fsdev-mode (aka famfs-mode) daxdev as its backing device=
(s).=0D=0A=0D=0APatch 01 is a fix to the fsdev driver that is needed by t=
he rest of the=0D=0Aseries.=0D=0A=0D=0AFamfs Overview=0D=0A=0D=0AFamfs ex=
poses sharable disaggregated memory as a file system. Famfs consumes=0D=0A=
shared memory from [usually shared memory] dax devices, and provides=0D=0A=
memory-mappable files that map directly to the memory - no page cache=0D=0A=
involvement. Famfs differs from conventional file systems in fs-dax mode,=
=0D=0Ain that it handles in-memory metadata in a sharable way (which begi=
ns with=0D=0Anever caching dirty shared metadata). So a famfs file system=
 can be mounted=0D=0Afrom multiple nodes, provided they have access to th=
e memory.=0D=0A=0D=0AThe key performance requirement is that famfs must r=
esolve mapping=0D=0Afaults with minimal overhead. This is achieved by ful=
ly caching the=0D=0Afile-to-devdax metadata for all active files.=0D=0A=0D=
=0AFamfs remains the first fs-dax file system that is backed by devdax=0D=
=0Arather than pmem in fs-dax mode (hence the need for the new dax mode).=
=0D=0A=0D=0AThe famfs user space can be found at [6]=0D=0A=0D=0A[1] https=
://lwn.net/Articles/983105/ (Famfs at LSFMM 2024)=0D=0A[2] https://lwn.ne=
t/Articles/1020170/ (Famfs at LSFMM 2025, with patch link)=0D=0A[3] https=
://lwn.net/Articles/1068686/ (LWN coverage of the patch thread)=0D=0A[4] =
https://lwn.net/Articles/1082687/ (Famfs at LSFMM 2026)=0D=0A[5] https://=
lore.kernel.org/linux-fsdevel/0100019f7d9fbe81-6cb16662-2522-47ea-a152-fa=
[email protected]/#b=0D=0A[6] https://famfs.org=0D=0A=
=0D=0AJohn Groves (12):=0D=0A  dax: replace exported dax_dev_get() with n=
on-allocating dax_dev_find()=0D=0A  famfs: Module operations, fs_context,=
 and mount=0D=0A  famfs: Add daxdev table and dax notify_failure support=0D=
=0A  famfs: Introduce inode_operations and super_operations=0D=0A  famfs:=
 Introduce file_operations read/write=0D=0A  famfs: Introduce mmap and VM=
 fault handling=0D=0A  famfs: MAP_CREATE ioctl and fmap ingest (ABI 44)=0D=
=0A  famfs: iomap_begin and file-to-dax offset resolution=0D=0A  famfs: R=
egister secondary daxdevs by path (FAMFSIOC_DAXDEV_OPEN)=0D=0A  famfs: Ad=
d runtime operation-permission (opts) framework=0D=0A  famfs: Report devi=
ce capacity via statfs so df works=0D=0A  famfs: Add documentation=0D=0A=0D=
=0A Documentation/filesystems/famfs.rst           | 142 +++=0D=0A Documen=
tation/filesystems/index.rst           |   1 +=0D=0A .../userspace-api/io=
ctl/ioctl-number.rst      |   1 +=0D=0A MAINTAINERS                      =
             |   8 +=0D=0A drivers/dax/fsdev.c                           =
|  19 +=0D=0A drivers/dax/super.c                           |  38 +-=0D=0A=
 fs/Kconfig                                    |   2 +=0D=0A fs/Makefile =
                                  |   1 +=0D=0A fs/famfs/Kconfig         =
                     |  11 +=0D=0A fs/famfs/Makefile                     =
        |   5 +=0D=0A fs/famfs/famfs_file.c                         | 983=
 ++++++++++++++++++=0D=0A fs/famfs/famfs_inode.c                        |=
 813 +++++++++++++++=0D=0A fs/famfs/famfs_internal.h                     =
| 162 +++=0D=0A fs/namei.c                                    |   1 +=0D=0A=
 fs/super.c                                    |   7 +=0D=0A include/linu=
x/dax.h                           |   7 +-=0D=0A include/linux/fs.h      =
                      |   1 +=0D=0A include/uapi/linux/famfs_ioctl.h     =
         | 160 +++=0D=0A include/uapi/linux/magic.h                    | =
  1 +=0D=0A 19 files changed, 2360 insertions(+), 3 deletions(-)=0D=0A cr=
eate mode 100644 Documentation/filesystems/famfs.rst=0D=0A create mode 10=
0644 fs/famfs/Kconfig=0D=0A create mode 100644 fs/famfs/Makefile=0D=0A cr=
eate mode 100644 fs/famfs/famfs_file.c=0D=0A create mode 100644 fs/famfs/=
famfs_inode.c=0D=0A create mode 100644 fs/famfs/famfs_internal.h=0D=0A cr=
eate mode 100644 include/uapi/linux/famfs_ioctl.h=0D=0A=0D=0A--=20=0D=0A2=
=2E53.0=0D=0A=0D=0A