[PATCH v2 2/9] mm/mshare: pre-populate msharefs with information file

From: Khalid Aziz
Date: Wed Jun 29 2022 - 18:58:29 EST


Users of mshare feature to share page tables need to know the size
and alignment requirement for shared regions. Pre-populate msharefs
with a file, mshare_info, that provides this information.

Signed-off-by: Khalid Aziz <khalid.aziz@xxxxxxxxxx>
---
mm/mshare.c | 62 +++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 48 insertions(+), 14 deletions(-)

diff --git a/mm/mshare.c b/mm/mshare.c
index c8fab3869bab..3e448e11c742 100644
--- a/mm/mshare.c
+++ b/mm/mshare.c
@@ -25,8 +25,8 @@
static struct super_block *msharefs_sb;

static const struct file_operations msharefs_file_operations = {
- .open = simple_open,
- .llseek = no_llseek,
+ .open = simple_open,
+ .llseek = no_llseek,
};

static int
@@ -42,23 +42,52 @@ msharefs_d_hash(const struct dentry *dentry, struct qstr *qstr)
return 0;
}

+static void
+mshare_evict_inode(struct inode *inode)
+{
+ clear_inode(inode);
+}
+
static const struct dentry_operations msharefs_d_ops = {
.d_hash = msharefs_d_hash,
};

+static ssize_t
+mshare_info_read(struct file *file, char __user *buf, size_t nbytes,
+ loff_t *ppos)
+{
+ char s[80];
+
+ sprintf(s, "%ld", PGDIR_SIZE);
+ return simple_read_from_buffer(buf, nbytes, ppos, s, strlen(s));
+}
+
+static const struct file_operations mshare_info_ops = {
+ .read = mshare_info_read,
+ .llseek = noop_llseek,
+};
+
+static const struct super_operations mshare_s_ops = {
+ .statfs = simple_statfs,
+ .evict_inode = mshare_evict_inode,
+};
+
static int
msharefs_fill_super(struct super_block *sb, struct fs_context *fc)
{
- static const struct tree_descr empty_descr = {""};
+ static const struct tree_descr mshare_files[] = {
+ [2] = { "mshare_info", &mshare_info_ops, 0444},
+ {""},
+ };
int err;

- sb->s_d_op = &msharefs_d_ops;
- err = simple_fill_super(sb, MSHARE_MAGIC, &empty_descr);
- if (err)
- return err;
-
- msharefs_sb = sb;
- return 0;
+ err = simple_fill_super(sb, MSHARE_MAGIC, mshare_files);
+ if (!err) {
+ msharefs_sb = sb;
+ sb->s_d_op = &msharefs_d_ops;
+ sb->s_op = &mshare_s_ops;
+ }
+ return err;
}

static int
@@ -84,20 +113,25 @@ static struct file_system_type mshare_fs = {
.kill_sb = kill_litter_super,
};

-static int
+static int __init
mshare_init(void)
{
int ret = 0;

ret = sysfs_create_mount_point(fs_kobj, "mshare");
if (ret)
- return ret;
+ goto out;

ret = register_filesystem(&mshare_fs);
- if (ret)
+ if (ret) {
sysfs_remove_mount_point(fs_kobj, "mshare");
+ goto out;
+ }
+
+ return 0;

+out:
return ret;
}

-fs_initcall(mshare_init);
+core_initcall(mshare_init);
--
2.32.0