summaryrefslogtreecommitdiff
path: root/fs/overlayfs/inode.c
diff options
context:
space:
mode:
authorVivek Goyal <vgoyal@redhat.com>2016-07-01 23:34:26 +0300
committerMiklos Szeredi <mszeredi@redhat.com>2016-07-29 13:05:23 +0300
commit39a25b2b37629f65e5a1eba1b353d0b47687c2ca (patch)
tree9e167746ccbd3779aefa536d4e94d9b15009be8c /fs/overlayfs/inode.c
parent72e48481815eeca72fc886b3be91301ad87d6aeb (diff)
downloadlinux-39a25b2b37629f65e5a1eba1b353d0b47687c2ca.tar.xz
ovl: define ->get_acl() for overlay inodes
Now we are planning to do DAC permission checks on overlay inode itself. And to make it work, we will need to make sure we can get acls from underlying inode. So define ->get_acl() for overlay inodes and this in turn calls into underlying filesystem to get acls, if any. Signed-off-by: Vivek Goyal <vgoyal@redhat.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs/overlayfs/inode.c')
-rw-r--r--fs/overlayfs/inode.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
index 32ae8b49a72c..a574108f52a8 100644
--- a/fs/overlayfs/inode.c
+++ b/fs/overlayfs/inode.c
@@ -310,6 +310,22 @@ out:
return err;
}
+struct posix_acl *ovl_get_acl(struct inode *inode, int type)
+{
+ struct inode *realinode = ovl_inode_real(inode);
+
+ if (!realinode)
+ return ERR_PTR(-ENOENT);
+
+ if (!IS_POSIXACL(realinode))
+ return NULL;
+
+ if (!realinode->i_op->get_acl)
+ return NULL;
+
+ return realinode->i_op->get_acl(realinode, type);
+}
+
static bool ovl_open_need_copy_up(int flags, enum ovl_path_type type,
struct dentry *realdentry)
{
@@ -354,6 +370,7 @@ static const struct inode_operations ovl_file_inode_operations = {
.getxattr = ovl_getxattr,
.listxattr = ovl_listxattr,
.removexattr = ovl_removexattr,
+ .get_acl = ovl_get_acl,
};
static const struct inode_operations ovl_symlink_inode_operations = {