Commit 67cd4976 authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Jialin Zhang
Browse files

vfs: add rcu argument to ->get_acl() callback

mainline inclusion
from mainline-v5.15-rc1
commit 0cad6246
category: perf
bugzilla: https://gitee.com/openeuler/kernel/issues/I6ZCW0
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0cad6246621b5887d5b33fea84219d2a71f2f99a



--------------------------------

Add a rcu argument to the ->get_acl() callback to allow
get_cached_acl_rcu() to call the ->get_acl() method in the next patch.

Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
[chengzhihao: rename get_acl to get_acl2 to prevent KABI changes, and
 only backport(realize) overlayfs]
Conflicts:
	fs/overlayfs/dir.c
	fs/overlayfs/inode.c
	fs/overlayfs/overlayfs.h
	fs/posix_acl.c
	include/linux/fs.h
Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
Reviewed-by: default avatarZhang Yi <yi.zhang@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parent b169caaa
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1303,6 +1303,6 @@ const struct inode_operations ovl_dir_inode_operations = {
	.permission	= ovl_permission,
	.getattr	= ovl_getattr,
	.listxattr	= ovl_listxattr,
	.get_acl	= ovl_get_acl,
	.get_acl2	= ovl_get_acl,
	.update_time	= ovl_update_time,
};
+6 −3
Original line number Diff line number Diff line
@@ -441,12 +441,15 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
	return res;
}

struct posix_acl *ovl_get_acl(struct inode *inode, int type)
struct posix_acl *ovl_get_acl(struct inode *inode, int type, bool rcu)
{
	struct inode *realinode = ovl_inode_real(inode);
	const struct cred *old_cred;
	struct posix_acl *acl;

	if (rcu)
		return ERR_PTR(-ECHILD);

	if (!IS_ENABLED(CONFIG_FS_POSIX_ACL) || !IS_POSIXACL(realinode))
		return NULL;

@@ -496,7 +499,7 @@ static const struct inode_operations ovl_file_inode_operations = {
	.permission	= ovl_permission,
	.getattr	= ovl_getattr,
	.listxattr	= ovl_listxattr,
	.get_acl	= ovl_get_acl,
	.get_acl2	= ovl_get_acl,
	.update_time	= ovl_update_time,
	.fiemap		= ovl_fiemap,
};
@@ -514,7 +517,7 @@ static const struct inode_operations ovl_special_inode_operations = {
	.permission	= ovl_permission,
	.getattr	= ovl_getattr,
	.listxattr	= ovl_listxattr,
	.get_acl	= ovl_get_acl,
	.get_acl2	= ovl_get_acl,
	.update_time	= ovl_update_time,
};

+1 −1
Original line number Diff line number Diff line
@@ -466,7 +466,7 @@ int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name,
int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name,
		  void *value, size_t size);
ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size);
struct posix_acl *ovl_get_acl(struct inode *inode, int type);
struct posix_acl *ovl_get_acl(struct inode *inode, int type, bool rcu);
int ovl_update_time(struct inode *inode, struct timespec64 *ts, int flags);
bool ovl_is_private_xattr(struct super_block *sb, const char *name);

+5 −2
Original line number Diff line number Diff line
@@ -134,11 +134,14 @@ struct posix_acl *get_acl(struct inode *inode, int type)
	 * If the filesystem doesn't have a get_acl() function at all, we'll
	 * just create the negative cache entry.
	 */
	if (!inode->i_op->get_acl) {
	if (!inode->i_op->get_acl && !inode->i_op->get_acl2) {
		set_cached_acl(inode, type, NULL);
		return NULL;
	}
	if (inode->i_op->get_acl)
		acl = inode->i_op->get_acl(inode, type);
	else
		acl = inode->i_op->get_acl2(inode, type, false);

	if (IS_ERR(acl)) {
		/*
+1 −0
Original line number Diff line number Diff line
@@ -1933,6 +1933,7 @@ struct inode_operations {
			   umode_t create_mode);
	int (*tmpfile) (struct inode *, struct dentry *, umode_t);
	int (*set_acl)(struct inode *, struct posix_acl *, int);
	struct posix_acl * (*get_acl2)(struct inode *, int, bool);

	KABI_RESERVE(1)
	KABI_RESERVE(2)