[PATCH V12 02/12] famfs: Module operations, fs_context, and mount

John Groves <[email protected]> Mon, 3 Aug 2026 02:28:36 +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 <0100019fc5739e5d-bc002300-eede-4c40-9ca8-a277b754496e-000000@email.amazonses.com>
From: John Groves <[email protected]>=0D=0A=0D=0AStart building up from the=
 famfs module operations. This commit=0D=0Aincludes the following:=0D=0A=0D=
=0A* Register as a file system=0D=0A* Parse mount parameters=0D=0A* Alloc=
ate or find (and initialize) a superblock via famfs_get_tree()=0D=0A* Loo=
kup the host dax device, and bail if it's in use (or not dax)=0D=0A* Add =
Kconfig and Makefile misc to build famfs=0D=0A* Add FAMFS_SUPER_MAGIC to =
include/uapi/linux/magic.h=0D=0A* Add export of fs/namei.c:may_open_dev()=
, which famfs needs to call=0D=0A* Update MAINTAINERS file for the fs/fam=
fs/ path=0D=0A=0D=0AThe following exports had to happen to enable famfs:=0D=
=0A=0D=0A* This adds the new fs/super.c:kill_char_super() - the other kil=
l*super=0D=0A  helpers were not quite right.=0D=0A=0D=0AThis commit build=
s but is otherwise too incomplete to run=0D=0A=0D=0ASigned-off-by: John G=
roves <[email protected]>=0D=0A---=0D=0A MAINTAINERS                |   7 +=
=0D=0A fs/Kconfig                 |   2 +=0D=0A fs/Makefile              =
  |   1 +=0D=0A fs/famfs/Kconfig           |  11 ++=0D=0A fs/famfs/Makefi=
le          |   5 +=0D=0A fs/famfs/famfs_inode.c     | 293 ++++++++++++++=
+++++++++++++++++++++++=0D=0A fs/famfs/famfs_internal.h  |  32 ++++=0D=0A=
 fs/namei.c                 |   1 +=0D=0A fs/super.c                 |   =
7 +=0D=0A include/linux/fs.h         |   1 +=0D=0A include/uapi/linux/mag=
ic.h |   1 +=0D=0A 11 files changed, 361 insertions(+)=0D=0A create mode =
100644 fs/famfs/Kconfig=0D=0A create mode 100644 fs/famfs/Makefile=0D=0A =
create mode 100644 fs/famfs/famfs_inode.c=0D=0A create mode 100644 fs/fam=
fs/famfs_internal.h=0D=0A=0D=0Adiff --git a/MAINTAINERS b/MAINTAINERS=0D=0A=
index a674e36529f7..ca7b90a8f0a1 100644=0D=0A--- a/MAINTAINERS=0D=0A+++ b=
/MAINTAINERS=0D=0A@@ -9905,6 +9905,13 @@ F:=09Documentation/networking/fa=
ilover.rst=0D=0A F:=09include/net/failover.h=0D=0A F:=09net/core/failover=
=2Ec=0D=0A=20=0D=0A+FAMFS [Fabric-Attached Memory File System]=0D=0A+M:=09=
John Groves <[email protected]>=0D=0A+L:[email protected]=0D=
=0A+L:[email protected]=0D=0A+S:=09Supported=0D=0A+F:=09fs/fam=
fs/=0D=0A+=0D=0A FANOTIFY=0D=0A M:=09Jan Kara <[email protected]>=0D=0A R:=09A=
mir Goldstein <[email protected]>=0D=0Adiff --git a/fs/Kconfig b/fs/Kcon=
fig=0D=0Aindex cf6ae64776e6..2db647accc00 100644=0D=0A--- a/fs/Kconfig=0D=
=0A+++ b/fs/Kconfig=0D=0A@@ -131,6 +131,8 @@ source "fs/autofs/Kconfig"=0D=
=0A source "fs/fuse/Kconfig"=0D=0A source "fs/overlayfs/Kconfig"=0D=0A=20=
=0D=0A+source "fs/famfs/Kconfig"=0D=0A+=0D=0A menu "Caches"=0D=0A=20=0D=0A=
 source "fs/netfs/Kconfig"=0D=0Adiff --git a/fs/Makefile b/fs/Makefile=0D=
=0Aindex 89a8a9d207d1..f49f9a000210 100644=0D=0A--- a/fs/Makefile=0D=0A++=
+ b/fs/Makefile=0D=0A@@ -129,3 +129,4 @@ obj-$(CONFIG_VBOXSF_FS)=09=09+=3D=
 vboxsf/=0D=0A obj-$(CONFIG_ZONEFS_FS)=09=09+=3D zonefs/=0D=0A obj-$(CONF=
IG_BPF_LSM)=09=09+=3D bpf_fs_kfuncs.o=0D=0A obj-$(CONFIG_RESCTRL_FS)=09+=3D=
 resctrl/=0D=0A+obj-$(CONFIG_FAMFS)=09=09+=3D famfs/=0D=0Adiff --git a/fs=
/famfs/Kconfig b/fs/famfs/Kconfig=0D=0Anew file mode 100644=0D=0Aindex 00=
0000000000..ed40cf8b0592=0D=0A--- /dev/null=0D=0A+++ b/fs/famfs/Kconfig=0D=
=0A@@ -0,0 +1,11 @@=0D=0A+=0D=0A+=0D=0A+config FAMFS=0D=0A+       tristat=
e "famfs: shared memory file system"=0D=0A+       depends on DEV_DAX && F=
S_DAX && DEV_DAX_FSDEV=0D=0A+       default m if DEV_DAX && FS_DAX && DEV=
_DAX_FSDEV=0D=0A+       help=0D=0A+=09  Support for the famfs file system=
=2E Famfs is a dax file system that=0D=0A+=09  can support scale-out shar=
ed access to fabric-attached memory=0D=0A+=09  (e.g. CXL shared memory). =
Famfs is not a general purpose file system;=0D=0A+=09  it is an enabler f=
or data sets in shared memory.=0D=0Adiff --git a/fs/famfs/Makefile b/fs/f=
amfs/Makefile=0D=0Anew file mode 100644=0D=0Aindex 000000000000..62230bcd=
6793=0D=0A--- /dev/null=0D=0A+++ b/fs/famfs/Makefile=0D=0A@@ -0,0 +1,5 @@=
=0D=0A+# SPDX-License-Identifier: GPL-2.0=0D=0A+=0D=0A+obj-$(CONFIG_FAMFS=
) +=3D famfs.o=0D=0A+=0D=0A+famfs-y :=3D famfs_inode.o=0D=0Adiff --git a/=
fs/famfs/famfs_inode.c b/fs/famfs/famfs_inode.c=0D=0Anew file mode 100644=
=0D=0Aindex 000000000000..c299a90912a5=0D=0A--- /dev/null=0D=0A+++ b/fs/f=
amfs/famfs_inode.c=0D=0A@@ -0,0 +1,293 @@=0D=0A+// SPDX-License-Identifie=
r: GPL-2.0=0D=0A+/*=0D=0A+ * famfs - dax file system for shared fabric-at=
tached memory=0D=0A+ *=0D=0A+ * Copyright 2023-2024 Micron Technology, in=
c=0D=0A+ *=0D=0A+ * This file system, originally based on ramfs the dax s=
upport from xfs,=0D=0A+ * is intended to allow multiple host systems to m=
ount a common file system=0D=0A+ * view of dax files that map to shared m=
emory.=0D=0A+ */=0D=0A+=0D=0A+#include <linux/fs.h>=0D=0A+#include <linux=
/cleanup.h>=0D=0A+#include <linux/time.h>=0D=0A+#include <linux/init.h>=0D=
=0A+#include <linux/string.h>=0D=0A+#include <linux/parser.h>=0D=0A+#incl=
ude <linux/magic.h>=0D=0A+#include <linux/slab.h>=0D=0A+#include <linux/f=
s_context.h>=0D=0A+#include <linux/fs_parser.h>=0D=0A+#include <linux/dax=
=2Eh>=0D=0A+#include <linux/hugetlb.h>=0D=0A+#include <linux/iomap.h>=0D=0A=
+#include <linux/path.h>=0D=0A+#include <linux/namei.h>=0D=0A+=0D=0A+#inc=
lude "famfs_internal.h"=0D=0A+=0D=0A+#define FAMFS_DEFAULT_MODE=090755=0D=
=0A+=0D=0A+static struct inode *famfs_get_inode(=0D=0A+=09=09=09struct su=
per_block *sb,=0D=0A+=09=09=09const struct inode *dir,=0D=0A+=09=09=09umo=
de_t mode, dev_t dev)=0D=0A+{=0D=0A+=09struct inode *inode =3D new_inode(=
sb);=0D=0A+=09struct timespec64 tv;=0D=0A+=0D=0A+=09if (!inode)=0D=0A+=09=
=09return NULL;=0D=0A+=0D=0A+=09inode->i_ino =3D get_next_ino();=0D=0A+=09=
inode_init_owner(&nop_mnt_idmap, inode, dir, mode);=0D=0A+=09inode->i_map=
ping->a_ops =3D &ram_aops;=0D=0A+=09mapping_set_gfp_mask(inode->i_mapping=
, GFP_HIGHUSER);=0D=0A+=09mapping_set_unevictable(inode->i_mapping);=0D=0A=
+=09tv =3D inode_set_ctime_current(inode);=0D=0A+=09inode_set_mtime_to_ts=
(inode, tv);=0D=0A+=09inode_set_atime_to_ts(inode, tv);=0D=0A+=0D=0A+=09s=
witch (mode & S_IFMT) {=0D=0A+=09default:=0D=0A+=09=09init_special_inode(=
inode, mode, dev);=0D=0A+=09=09break;=0D=0A+=09case S_IFREG:=0D=0A+=09=09=
inode->i_op =3D NULL /* famfs_file_inode_operations */;=0D=0A+=09=09inode=
->i_fop =3D NULL /* &famfs_file_operations */;=0D=0A+=09=09break;=0D=0A+=09=
case S_IFDIR:=0D=0A+=09=09inode->i_op =3D NULL /* famfs_dir_inode_operati=
ons */;=0D=0A+=09=09inode->i_fop =3D &simple_dir_operations;=0D=0A+=0D=0A=
+=09=09/* Directory inodes start off with i_nlink =3D=3D 2 (for ".") */=0D=
=0A+=09=09inc_nlink(inode);=0D=0A+=09=09break;=0D=0A+=09case S_IFLNK:=0D=0A=
+=09=09inode->i_op =3D &page_symlink_inode_operations;=0D=0A+=09=09inode_=
nohighmem(inode);=0D=0A+=09=09break;=0D=0A+=09}=0D=0A+=09return inode;=0D=
=0A+}=0D=0A+=0D=0A+/*=0D=0A+ * famfs dax_operations (for famfs-mode dax)=0D=
=0A+ */=0D=0A+/**********************************************************=
*******************=0D=0A+ * fs_context_operations=0D=0A+ */=0D=0A+=0D=0A=
+static void=0D=0A+famfs_fill_super(struct super_block *sb, struct fs_con=
text *fc)=0D=0A+{=0D=0A+=09sb->s_maxbytes=09=09=3D MAX_LFS_FILESIZE;=0D=0A=
+=09sb->s_blocksize=09=09=3D PAGE_SIZE;=0D=0A+=09sb->s_blocksize_bits=09=3D=
 PAGE_SHIFT;=0D=0A+=09sb->s_magic=09=09=3D FAMFS_SUPER_MAGIC;=0D=0A+=09sb=
->s_op=09=09=3D NULL /* famfs_super_ops */;=0D=0A+=09sb->s_time_gran=09=09=
=3D 1;=0D=0A+}=0D=0A+=0D=0A+int=0D=0A+lookup_daxdev(const char *pathname,=
 dev_t *devno)=0D=0A+{=0D=0A+=09struct inode *inode;=0D=0A+=09struct path=
 path;=0D=0A+=09int err;=0D=0A+=0D=0A+=09if (!pathname || !*pathname)=0D=0A=
+=09=09return -EINVAL;=0D=0A+=0D=0A+=09err =3D kern_path(pathname, LOOKUP=
_FOLLOW, &path);=0D=0A+=09if (err)=0D=0A+=09=09return err;=0D=0A+=0D=0A+=09=
inode =3D d_backing_inode(path.dentry);=0D=0A+=09if (!S_ISCHR(inode->i_mo=
de)) {=0D=0A+=09=09err =3D -EINVAL;=0D=0A+=09=09goto out_path_put;=0D=0A+=
=09}=0D=0A+=0D=0A+=09if (!may_open_dev(&path)) {=0D=0A+=09=09err =3D -EAC=
CES;=0D=0A+=09=09goto out_path_put;=0D=0A+=09}=0D=0A+=0D=0A+=09/* i_rdev =
is the char dev_t; fs_dax_get() confirms it is dax later */=0D=0A+=09*dev=
no =3D inode->i_rdev;=0D=0A+=0D=0A+out_path_put:=0D=0A+=09path_put(&path)=
;=0D=0A+=09return err;=0D=0A+}=0D=0A+=0D=0A+static int=0D=0A+famfs_get_tr=
ee(struct fs_context *fc)=0D=0A+{=0D=0A+=09struct famfs_fs_info *fsi =3D =
fc->s_fs_info;=0D=0A+=09struct super_block *sb;=0D=0A+=09struct inode *in=
ode;=0D=0A+=09dev_t daxdevno;=0D=0A+=09int err;=0D=0A+=0D=0A+=09err =3D l=
ookup_daxdev(fc->source, &daxdevno);=0D=0A+=09if (err)=0D=0A+=09=09return=
 err;=0D=0A+=0D=0A+=09/* This will set sb->s_dev=3Ddaxdevno */=0D=0A+=09s=
b =3D sget_dev(fc, daxdevno);=0D=0A+=09if (IS_ERR(sb)) {=0D=0A+=09=09pr_d=
ebug("%s: sget_dev error\n", __func__);=0D=0A+=09=09return PTR_ERR(sb);=0D=
=0A+=09}=0D=0A+=0D=0A+=09if (sb->s_root) {=0D=0A+=09=09pr_debug("%s: foun=
d a matching superblock for %s\n",=0D=0A+=09=09=09__func__, fc->source);=0D=
=0A+=0D=0A+=09=09/* We don't expect to find a match by dev_t; if we do, i=
t must=0D=0A+=09=09 * already be mounted, so we bail=0D=0A+=09=09 */=0D=0A=
+=09=09err =3D -EBUSY;=0D=0A+=09=09goto deactivate_out;=0D=0A+=09} else {=
=0D=0A+=09=09pr_debug("%s: initializing new superblock for %s\n",=0D=0A+=09=
=09=09__func__, fc->source);=0D=0A+=09=09famfs_fill_super(sb, fc);=0D=0A+=
=09}=0D=0A+=0D=0A+=09inode =3D famfs_get_inode(sb, NULL, S_IFDIR | fsi->m=
ount_opts.mode, 0);=0D=0A+=09sb->s_root =3D d_make_root(inode);=0D=0A+=09=
if (!sb->s_root) {=0D=0A+=09=09pr_debug("%s: d_make_root() failed\n", __f=
unc__);=0D=0A+=09=09err =3D -ENOMEM;=0D=0A+=09=09goto deactivate_out;=0D=0A=
+=09}=0D=0A+=0D=0A+=09sb->s_flags |=3D SB_ACTIVE;=0D=0A+=0D=0A+=09WARN_ON=
(fc->root);=0D=0A+=09fc->root =3D dget(sb->s_root);=0D=0A+=09return 0;=0D=
=0A+=0D=0A+deactivate_out:=0D=0A+=09pr_debug("%s: deactivating sb=3D%llx\=
n", __func__, (u64)sb);=0D=0A+=09deactivate_locked_super(sb);=0D=0A+=09re=
turn err;=0D=0A+}=0D=0A+=0D=0A+/*****************************************=
************************************/=0D=0A+=0D=0A+enum famfs_param {=0D=0A=
+=09Opt_mode,=0D=0A+=09Opt_dax,=0D=0A+};=0D=0A+=0D=0A+const struct fs_par=
ameter_spec famfs_fs_parameters[] =3D {=0D=0A+=09fsparam_u32oct("mode",=09=
  Opt_mode),=0D=0A+=09fsparam_string("dax",     Opt_dax),=0D=0A+=09{}=0D=0A=
+};=0D=0A+=0D=0A+static int famfs_parse_param(struct fs_context *fc, stru=
ct fs_parameter *param)=0D=0A+{=0D=0A+=09struct famfs_fs_info *fsi =3D fc=
->s_fs_info;=0D=0A+=09struct fs_parse_result result;=0D=0A+=09int opt;=0D=
=0A+=0D=0A+=09opt =3D fs_parse(fc, famfs_fs_parameters, param, &result);=0D=
=0A+=09if (opt =3D=3D -ENOPARAM) {=0D=0A+=09=09opt =3D vfs_parse_fs_param=
_source(fc, param);=0D=0A+=09=09if (opt !=3D -ENOPARAM)=0D=0A+=09=09=09re=
turn opt;=0D=0A+=0D=0A+=09=09return 0;=0D=0A+=09}=0D=0A+=09if (opt < 0)=0D=
=0A+=09=09return opt;=0D=0A+=0D=0A+=09switch (opt) {=0D=0A+=09case Opt_mo=
de:=0D=0A+=09=09fsi->mount_opts.mode =3D result.uint_32 & S_IALLUGO;=0D=0A=
+=09=09break;=0D=0A+=09case Opt_dax:=0D=0A+=09=09if (strcmp(param->string=
, "always"))=0D=0A+=09=09=09pr_debug("%s: invalid dax mode %s\n",=0D=0A+=09=
=09=09=09  __func__, param->string);=0D=0A+=09=09break;=0D=0A+=09}=0D=0A+=
=0D=0A+=09return 0;=0D=0A+}=0D=0A+=0D=0A+static void famfs_free_fc(struct=
 fs_context *fc)=0D=0A+{=0D=0A+=09kfree(fc->s_fs_info);=0D=0A+}=0D=0A+=0D=
=0A+static const struct fs_context_operations famfs_context_ops =3D {=0D=0A=
+=09.free=09=09=3D famfs_free_fc,=0D=0A+=09.parse_param=09=3D famfs_parse=
_param,=0D=0A+=09.get_tree=09=3D famfs_get_tree,=0D=0A+};=0D=0A+=0D=0A+st=
atic int famfs_init_fs_context(struct fs_context *fc)=0D=0A+{=0D=0A+=09st=
ruct famfs_fs_info *fsi;=0D=0A+=0D=0A+=09fsi =3D kzalloc_obj(*fsi, GFP_KE=
RNEL);=0D=0A+=09if (!fsi)=0D=0A+=09=09return -ENOMEM;=0D=0A+=0D=0A+=09fsi=
->mount_opts.mode =3D FAMFS_DEFAULT_MODE;=0D=0A+=09fc->s_fs_info        =3D=
 fsi;=0D=0A+=09fc->ops              =3D &famfs_context_ops;=0D=0A+=09retu=
rn 0;=0D=0A+}=0D=0A+=0D=0A+static void famfs_kill_sb(struct super_block *=
sb)=0D=0A+{=0D=0A+=09struct famfs_fs_info *fsi =3D sb->s_fs_info;=0D=0A+=0D=
=0A+=09kill_char_super(sb);=0D=0A+=0D=0A+=09kfree(fsi);=0D=0A+=09sb->s_fs=
_info =3D NULL;=0D=0A+}=0D=0A+=0D=0A+#define MODULE_NAME "famfs"=0D=0A+st=
atic struct file_system_type famfs_fs_type =3D {=0D=0A+=09.name=09=09  =3D=
 MODULE_NAME,=0D=0A+=09.init_fs_context  =3D famfs_init_fs_context,=0D=0A=
+=09.parameters=09  =3D famfs_fs_parameters,=0D=0A+=09.kill_sb=09  =3D fa=
mfs_kill_sb,=0D=0A+=09.fs_flags=09  =3D FS_REQUIRES_DEV,=0D=0A+};=0D=0A+=0D=
=0A+/********************************************************************=
**********=0D=0A+ * Module stuff=0D=0A+ */=0D=0A+static int __init init_f=
amfs_fs(void)=0D=0A+{=0D=0A+=09int rc;=0D=0A+=0D=0A+=09rc =3D register_fi=
lesystem(&famfs_fs_type);=0D=0A+=0D=0A+=09return rc;=0D=0A+}=0D=0A+=0D=0A=
+static void=0D=0A+__exit famfs_exit(void)=0D=0A+{=0D=0A+=09unregister_fi=
lesystem(&famfs_fs_type);=0D=0A+=09pr_info("%s: unregistered\n", __func__=
);=0D=0A+}=0D=0A+=0D=0A+fs_initcall(init_famfs_fs);=0D=0A+module_exit(fam=
fs_exit);=0D=0A+=0D=0A+MODULE_AUTHOR("John Groves");=0D=0A+MODULE_DESCRIP=
TION("Fabric-Attached Memory File System: see famfs.org");=0D=0A+MODULE_L=
ICENSE("GPL");=0D=0Adiff --git a/fs/famfs/famfs_internal.h b/fs/famfs/fam=
fs_internal.h=0D=0Anew file mode 100644=0D=0Aindex 000000000000..6f481d79=
ed88=0D=0A--- /dev/null=0D=0A+++ b/fs/famfs/famfs_internal.h=0D=0A@@ -0,0=
 +1,32 @@=0D=0A+/* SPDX-License-Identifier: GPL-2.0 */=0D=0A+/*=0D=0A+ * =
famfs - dax file system for shared fabric-attached memory=0D=0A+ *=0D=0A+=
 * Copyright 2023-2024 Micron Technology, Inc.=0D=0A+ *=0D=0A+ * This fil=
e system, originally based on ramfs the dax support from xfs,=0D=0A+ * is=
 intended to allow multiple host systems to mount a common file system=0D=
=0A+ * view of dax files that map to shared memory.=0D=0A+ */=0D=0A+#ifnd=
ef FAMFS_INTERNAL_H=0D=0A+#define FAMFS_INTERNAL_H=0D=0A+=0D=0A+struct fa=
mfs_mount_opts {=0D=0A+=09umode_t mode;=0D=0A+};=0D=0A+=0D=0A+/**=0D=0A+ =
* @famfs_fs_info=0D=0A+ *=0D=0A+ * @mount_opts:  The mount options=0D=0A+=
 * @deverror:    True if the dax device has called our notify_failure ent=
ry=0D=0A+ *               point, or if other "shutdown" conditions exist=0D=
=0A+ */=0D=0A+struct famfs_fs_info {=0D=0A+=09struct famfs_mount_opts   m=
ount_opts;=0D=0A+=09bool                      deverror;=0D=0A+};=0D=0A+=0D=
=0A+int lookup_daxdev(const char *pathname, dev_t *devno);=0D=0A+=0D=0A+#=
endif /* FAMFS_INTERNAL_H */=0D=0Adiff --git a/fs/namei.c b/fs/namei.c=0D=
=0Aindex 19ce43c9a6e6..d67194e89963 100644=0D=0A--- a/fs/namei.c=0D=0A+++=
 b/fs/namei.c=0D=0A@@ -4232,6 +4232,7 @@ bool may_open_dev(const struct p=
ath *path)=0D=0A =09return !(path->mnt->mnt_flags & MNT_NODEV) &&=0D=0A =09=
=09!(path->mnt->mnt_sb->s_iflags & SB_I_NODEV);=0D=0A }=0D=0A+EXPORT_SYMB=
OL(may_open_dev);=0D=0A=20=0D=0A static int may_open(struct mnt_idmap *id=
map, const struct path *path,=0D=0A =09=09    int acc_mode, int flag)=0D=0A=
diff --git a/fs/super.c b/fs/super.c=0D=0Aindex a8fd61136aaf..822ed205d07=
b 100644=0D=0A--- a/fs/super.c=0D=0A+++ b/fs/super.c=0D=0A@@ -1235,6 +123=
5,13 @@ void kill_anon_super(struct super_block *sb)=0D=0A }=0D=0A EXPORT=
_SYMBOL(kill_anon_super);=0D=0A=20=0D=0A+void kill_char_super(struct supe=
r_block *sb)=0D=0A+{=0D=0A+=09generic_shutdown_super(sb);=0D=0A+=09kill_s=
uper_notify(sb);=0D=0A+}=0D=0A+EXPORT_SYMBOL(kill_char_super);=0D=0A+=0D=0A=
 int set_anon_super_fc(struct super_block *sb, struct fs_context *fc)=0D=0A=
 {=0D=0A =09return set_anon_super(sb, NULL);=0D=0Adiff --git a/include/li=
nux/fs.h b/include/linux/fs.h=0D=0Aindex 50ce731a2b78..a8b030d6f218 10064=
4=0D=0A--- a/include/linux/fs.h=0D=0A+++ b/include/linux/fs.h=0D=0A@@ -23=
28,6 +2328,7 @@ void retire_super(struct super_block *sb);=0D=0A void gen=
eric_shutdown_super(struct super_block *sb);=0D=0A void kill_block_super(=
struct super_block *sb);=0D=0A void kill_anon_super(struct super_block *s=
b);=0D=0A+void kill_char_super(struct super_block *sb);=0D=0A void deacti=
vate_super(struct super_block *sb);=0D=0A void deactivate_locked_super(st=
ruct super_block *sb);=0D=0A int set_anon_super(struct super_block *s, vo=
id *data);=0D=0Adiff --git a/include/uapi/linux/magic.h b/include/uapi/li=
nux/magic.h=0D=0Aindex 4f2da935a76c..e644e1fd49bd 100644=0D=0A--- a/inclu=
de/uapi/linux/magic.h=0D=0A+++ b/include/uapi/linux/magic.h=0D=0A@@ -38,6=
 +38,7 @@=0D=0A #define OVERLAYFS_SUPER_MAGIC=090x794c7630=0D=0A #define =
FUSE_SUPER_MAGIC=090x65735546=0D=0A #define BCACHEFS_SUPER_MAGIC=090xca45=
1a4e=0D=0A+#define FAMFS_SUPER_MAGIC=090x87b282ff=0D=0A=20=0D=0A #define =
MINIX_SUPER_MAGIC=090x137F=09=09/* minix v1 fs, 14 char names */=0D=0A #d=
efine MINIX_SUPER_MAGIC2=090x138F=09=09/* minix v1 fs, 30 char names */=0D=
=0A--=20=0D=0A2.53.0=0D=0A=0D=0A