From: Anthony Yznaga <anthony.yznaga@oracle.com>
To: akpm@linux-foundation.org, willy@infradead.org,
markhemm@googlemail.com, viro@zeniv.linux.org.uk,
david@redhat.com, khalid@kernel.org
Cc: anthony.yznaga@oracle.com, jthoughton@google.com, corbet@lwn.net,
dave.hansen@intel.com, kirill@shutemov.name, luto@kernel.org,
brauner@kernel.org, arnd@arndb.de, ebiederm@xmission.com,
catalin.marinas@arm.com, mingo@redhat.com, peterz@infradead.org,
liam.howlett@oracle.com, lorenzo.stoakes@oracle.com,
vbabka@suse.cz, jannh@google.com, hannes@cmpxchg.org,
mhocko@kernel.org, roman.gushchin@linux.dev,
shakeel.butt@linux.dev, muchun.song@linux.dev,
tglx@linutronix.de, cgroups@vger.kernel.org, x86@kernel.org,
linux-doc@vger.kernel.org, linux-arch@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
mhiramat@kernel.org, rostedt@goodmis.org,
vasily.averin@linux.dev, xhao@linux.alibaba.com, pcc@google.com,
neilb@suse.de, maz@kernel.org
Subject: [PATCH 03/20] mm/mshare: make msharefs writable and support directories
Date: Fri, 24 Jan 2025 15:54:37 -0800 [thread overview]
Message-ID: <20250124235454.84587-4-anthony.yznaga@oracle.com> (raw)
In-Reply-To: <20250124235454.84587-1-anthony.yznaga@oracle.com>
From: Khalid Aziz <khalid@kernel.org>
Make msharefs filesystem writable and allow creating directories
to support better access control to mshare'd regions defined in
msharefs.
Signed-off-by: Khalid Aziz <khalid@kernel.org>
Signed-off-by: Anthony Yznaga <anthony.yznaga@oracle.com>
---
mm/mshare.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 116 insertions(+), 1 deletion(-)
diff --git a/mm/mshare.c b/mm/mshare.c
index 6d3760d1af8e..b755346da827 100644
--- a/mm/mshare.c
+++ b/mm/mshare.c
@@ -19,14 +19,129 @@
const unsigned long mshare_align = P4D_SIZE;
+static const struct inode_operations msharefs_dir_inode_ops;
+static const struct inode_operations msharefs_file_inode_ops;
+
static const struct file_operations msharefs_file_operations = {
.open = simple_open,
};
+static struct inode
+*msharefs_get_inode(struct mnt_idmap *idmap, struct super_block *sb,
+ const struct inode *dir, umode_t mode)
+{
+ struct inode *inode = new_inode(sb);
+
+ if (!inode)
+ return ERR_PTR(-ENOMEM);
+
+ inode->i_ino = get_next_ino();
+ inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
+ simple_inode_init_ts(inode);
+
+ switch (mode & S_IFMT) {
+ case S_IFREG:
+ inode->i_op = &msharefs_file_inode_ops;
+ inode->i_fop = &msharefs_file_operations;
+ break;
+ case S_IFDIR:
+ inode->i_op = &msharefs_dir_inode_ops;
+ inode->i_fop = &simple_dir_operations;
+ inc_nlink(inode);
+ break;
+ default:
+ discard_new_inode(inode);
+ return ERR_PTR(-EINVAL);
+ }
+
+ return inode;
+}
+
+static int
+msharefs_mknod(struct mnt_idmap *idmap, struct inode *dir,
+ struct dentry *dentry, umode_t mode)
+{
+ struct inode *inode;
+
+ inode = msharefs_get_inode(idmap, dir->i_sb, dir, mode);
+ if (IS_ERR(inode))
+ return PTR_ERR(inode);
+
+ d_instantiate(dentry, inode);
+ dget(dentry);
+ inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
+
+ return 0;
+}
+
+static int
+msharefs_create(struct mnt_idmap *idmap, struct inode *dir,
+ struct dentry *dentry, umode_t mode, bool excl)
+{
+ return msharefs_mknod(idmap, dir, dentry, mode | S_IFREG);
+}
+
+static int
+msharefs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
+ struct dentry *dentry, umode_t mode)
+{
+ int ret = msharefs_mknod(idmap, dir, dentry, mode | S_IFDIR);
+
+ if (!ret)
+ inc_nlink(dir);
+ return ret;
+}
+
struct msharefs_info {
struct dentry *info_dentry;
};
+static inline bool
+is_msharefs_info_file(const struct dentry *dentry)
+{
+ struct msharefs_info *info = dentry->d_sb->s_fs_info;
+
+ return info->info_dentry == dentry;
+}
+
+static int
+msharefs_rename(struct mnt_idmap *idmap,
+ struct inode *old_dir, struct dentry *old_dentry,
+ struct inode *new_dir, struct dentry *new_dentry,
+ unsigned int flags)
+{
+ if (is_msharefs_info_file(old_dentry) ||
+ is_msharefs_info_file(new_dentry))
+ return -EPERM;
+
+ return simple_rename(idmap, old_dir, old_dentry, new_dir,
+ new_dentry, flags);
+}
+
+static int
+msharefs_unlink(struct inode *dir, struct dentry *dentry)
+{
+ if (is_msharefs_info_file(dentry))
+ return -EPERM;
+
+ return simple_unlink(dir, dentry);
+}
+
+static const struct inode_operations msharefs_file_inode_ops = {
+ .setattr = simple_setattr,
+ .getattr = simple_getattr,
+};
+
+static const struct inode_operations msharefs_dir_inode_ops = {
+ .create = msharefs_create,
+ .lookup = simple_lookup,
+ .link = simple_link,
+ .unlink = msharefs_unlink,
+ .mkdir = msharefs_mkdir,
+ .rmdir = simple_rmdir,
+ .rename = msharefs_rename,
+};
+
static ssize_t
mshare_info_read(struct file *file, char __user *buf, size_t nbytes,
loff_t *ppos)
@@ -105,7 +220,7 @@ msharefs_fill_super(struct super_block *sb, struct fs_context *fc)
inode->i_ino = 1;
inode->i_mode = S_IFDIR | 0777;
simple_inode_init_ts(inode);
- inode->i_op = &simple_dir_inode_operations;
+ inode->i_op = &msharefs_dir_inode_ops;
inode->i_fop = &simple_dir_operations;
set_nlink(inode, 2);
--
2.43.5
next prev parent reply other threads:[~2025-01-24 23:56 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-24 23:54 [PATCH 00/20] Add support for shared PTEs across processes Anthony Yznaga
2025-01-24 23:54 ` [PATCH 01/20] mm: Add msharefs filesystem Anthony Yznaga
2025-01-25 3:13 ` Randy Dunlap
2025-01-25 20:05 ` Anthony Yznaga
2025-01-25 21:10 ` Matthew Wilcox
2025-01-27 17:01 ` Anthony Yznaga
2025-02-04 1:52 ` Bagas Sanjaya
2025-02-04 16:41 ` Anthony Yznaga
2025-01-24 23:54 ` [PATCH 02/20] mm/mshare: pre-populate msharefs with information file Anthony Yznaga
2025-01-24 23:54 ` Anthony Yznaga [this message]
2025-01-24 23:54 ` [PATCH 04/20] mm/mshare: allocate an mm_struct for msharefs files Anthony Yznaga
2025-01-24 23:54 ` [PATCH 05/20] mm/mshare: Add ioctl support Anthony Yznaga
2025-01-24 23:54 ` [PATCH 06/20] mm/mshare: Add a vma flag to indicate an mshare region Anthony Yznaga
2025-01-24 23:54 ` [PATCH 07/20] mm/mshare: Add mmap support Anthony Yznaga
2025-01-24 23:54 ` [PATCH 08/20] mm/mshare: flush all TLBs when updating PTEs in an mshare range Anthony Yznaga
2025-01-24 23:54 ` [PATCH 09/20] sched/numa: do not scan msharefs vmas Anthony Yznaga
2025-01-24 23:54 ` [PATCH 10/20] mm: add mmap_read_lock_killable_nested() Anthony Yznaga
2025-01-24 23:54 ` [PATCH 11/20] mm: add and use unmap_page_range vm_ops hook Anthony Yznaga
2025-01-24 23:54 ` [PATCH 12/20] mm/mshare: prepare for page table sharing support Anthony Yznaga
2025-01-24 23:54 ` [PATCH 13/20] x86/mm: enable page table sharing Anthony Yznaga
2025-01-24 23:54 ` [PATCH 14/20] mm: create __do_mmap() to take an mm_struct * arg Anthony Yznaga
2025-01-24 23:54 ` [PATCH 15/20] mm: pass the mm in vma_munmap_struct Anthony Yznaga
2025-01-24 23:54 ` [PATCH 16/20] mshare: add MSHAREFS_CREATE_MAPPING Anthony Yznaga
2025-01-24 23:54 ` [PATCH 17/20] mshare: add MSHAREFS_UNMAP Anthony Yznaga
2025-01-24 23:54 ` [PATCH 18/20] mm/mshare: provide a way to identify an mm as an mshare host mm Anthony Yznaga
2025-01-24 23:54 ` [PATCH 19/20] mm/mshare: get memcg from current->mm instead of mshare mm Anthony Yznaga
2025-01-24 23:54 ` [PATCH 20/20] mm/mshare: associate a mem cgroup with an mshare file Anthony Yznaga
2025-01-27 22:33 ` [PATCH 00/20] Add support for shared PTEs across processes Andrew Morton
2025-01-27 23:59 ` Anthony Yznaga
2025-01-28 9:21 ` David Hildenbrand
2025-01-28 7:11 ` Bagas Sanjaya
2025-01-28 19:53 ` Anthony Yznaga
2025-01-28 9:36 ` David Hildenbrand
2025-01-28 19:40 ` Anthony Yznaga
2025-01-29 0:11 ` Andrew Morton
2025-01-29 0:25 ` Anthony Yznaga
2025-01-29 0:59 ` Matthew Wilcox
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250124235454.84587-4-anthony.yznaga@oracle.com \
--to=anthony.yznaga@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=arnd@arndb.de \
--cc=brauner@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=cgroups@vger.kernel.org \
--cc=corbet@lwn.net \
--cc=dave.hansen@intel.com \
--cc=david@redhat.com \
--cc=ebiederm@xmission.com \
--cc=hannes@cmpxchg.org \
--cc=jannh@google.com \
--cc=jthoughton@google.com \
--cc=khalid@kernel.org \
--cc=kirill@shutemov.name \
--cc=liam.howlett@oracle.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lorenzo.stoakes@oracle.com \
--cc=luto@kernel.org \
--cc=markhemm@googlemail.com \
--cc=maz@kernel.org \
--cc=mhiramat@kernel.org \
--cc=mhocko@kernel.org \
--cc=mingo@redhat.com \
--cc=muchun.song@linux.dev \
--cc=neilb@suse.de \
--cc=pcc@google.com \
--cc=peterz@infradead.org \
--cc=roman.gushchin@linux.dev \
--cc=rostedt@goodmis.org \
--cc=shakeel.butt@linux.dev \
--cc=tglx@linutronix.de \
--cc=vasily.averin@linux.dev \
--cc=vbabka@suse.cz \
--cc=viro@zeniv.linux.org.uk \
--cc=willy@infradead.org \
--cc=x86@kernel.org \
--cc=xhao@linux.alibaba.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.