aboutsummaryrefslogtreecommitdiffstats
path: root/fs/overlayfs
diff options
context:
space:
mode:
authorVivek Goyal <vgoyal@redhat.com>2016-07-01 16:34:26 -0400
committerMiklos Szeredi <mszeredi@redhat.com>2016-07-29 06:05:23 -0400
commit39a25b2b37629f65e5a1eba1b353d0b47687c2ca (patch)
tree9e167746ccbd3779aefa536d4e94d9b15009be8c /fs/overlayfs
parent72e48481815eeca72fc886b3be91301ad87d6aeb (diff)
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')
-rw-r--r--fs/overlayfs/dir.c1
-rw-r--r--fs/overlayfs/inode.c17
-rw-r--r--fs/overlayfs/overlayfs.h2
-rw-r--r--fs/overlayfs/super.c8
4 files changed, 28 insertions, 0 deletions
diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c
index d9cdb4747f68..aa6320557196 100644
--- a/fs/overlayfs/dir.c
+++ b/fs/overlayfs/dir.c
@@ -921,4 +921,5 @@ const struct inode_operations ovl_dir_inode_operations = {
921 .getxattr = ovl_getxattr, 921 .getxattr = ovl_getxattr,
922 .listxattr = ovl_listxattr, 922 .listxattr = ovl_listxattr,
923 .removexattr = ovl_removexattr, 923 .removexattr = ovl_removexattr,
924 .get_acl = ovl_get_acl,
924}; 925};
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:
310 return err; 310 return err;
311} 311}
312 312
313struct posix_acl *ovl_get_acl(struct inode *inode, int type)
314{
315 struct inode *realinode = ovl_inode_real(inode);
316
317 if (!realinode)
318 return ERR_PTR(-ENOENT);
319
320 if (!IS_POSIXACL(realinode))
321 return NULL;
322
323 if (!realinode->i_op->get_acl)
324 return NULL;
325
326 return realinode->i_op->get_acl(realinode, type);
327}
328
313static bool ovl_open_need_copy_up(int flags, enum ovl_path_type type, 329static bool ovl_open_need_copy_up(int flags, enum ovl_path_type type,
314 struct dentry *realdentry) 330 struct dentry *realdentry)
315{ 331{
@@ -354,6 +370,7 @@ static const struct inode_operations ovl_file_inode_operations = {
354 .getxattr = ovl_getxattr, 370 .getxattr = ovl_getxattr,
355 .listxattr = ovl_listxattr, 371 .listxattr = ovl_listxattr,
356 .removexattr = ovl_removexattr, 372 .removexattr = ovl_removexattr,
373 .get_acl = ovl_get_acl,
357}; 374};
358 375
359static const struct inode_operations ovl_symlink_inode_operations = { 376static const struct inode_operations ovl_symlink_inode_operations = {
diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h
index 0d3f2ad45708..75128c70aa6a 100644
--- a/fs/overlayfs/overlayfs.h
+++ b/fs/overlayfs/overlayfs.h
@@ -142,6 +142,7 @@ struct dentry *ovl_dentry_upper(struct dentry *dentry);
142struct dentry *ovl_dentry_lower(struct dentry *dentry); 142struct dentry *ovl_dentry_lower(struct dentry *dentry);
143struct dentry *ovl_dentry_real(struct dentry *dentry); 143struct dentry *ovl_dentry_real(struct dentry *dentry);
144struct dentry *ovl_entry_real(struct ovl_entry *oe, bool *is_upper); 144struct dentry *ovl_entry_real(struct ovl_entry *oe, bool *is_upper);
145struct inode *ovl_inode_real(struct inode *inode);
145struct vfsmount *ovl_entry_mnt_real(struct ovl_entry *oe, struct inode *inode, 146struct vfsmount *ovl_entry_mnt_real(struct ovl_entry *oe, struct inode *inode,
146 bool is_upper); 147 bool is_upper);
147struct ovl_dir_cache *ovl_dir_cache(struct dentry *dentry); 148struct ovl_dir_cache *ovl_dir_cache(struct dentry *dentry);
@@ -179,6 +180,7 @@ ssize_t ovl_getxattr(struct dentry *dentry, struct inode *inode,
179 const char *name, void *value, size_t size); 180 const char *name, void *value, size_t size);
180ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size); 181ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size);
181int ovl_removexattr(struct dentry *dentry, const char *name); 182int ovl_removexattr(struct dentry *dentry, const char *name);
183struct posix_acl *ovl_get_acl(struct inode *inode, int type);
182int ovl_open_maybe_copy_up(struct dentry *dentry, unsigned int file_flags); 184int ovl_open_maybe_copy_up(struct dentry *dentry, unsigned int file_flags);
183 185
184struct inode *ovl_new_inode(struct super_block *sb, umode_t mode, 186struct inode *ovl_new_inode(struct super_block *sb, umode_t mode,
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index 5341ca57677c..893d6e0ea1c5 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -159,6 +159,13 @@ struct dentry *ovl_entry_real(struct ovl_entry *oe, bool *is_upper)
159 return realdentry; 159 return realdentry;
160} 160}
161 161
162struct inode *ovl_inode_real(struct inode *inode)
163{
164 bool tmp;
165
166 return d_inode(ovl_entry_real(inode->i_private, &tmp));
167}
168
162struct vfsmount *ovl_entry_mnt_real(struct ovl_entry *oe, struct inode *inode, 169struct vfsmount *ovl_entry_mnt_real(struct ovl_entry *oe, struct inode *inode,
163 bool is_upper) 170 bool is_upper)
164{ 171{
@@ -1172,6 +1179,7 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
1172 sb->s_op = &ovl_super_operations; 1179 sb->s_op = &ovl_super_operations;
1173 sb->s_root = root_dentry; 1180 sb->s_root = root_dentry;
1174 sb->s_fs_info = ufs; 1181 sb->s_fs_info = ufs;
1182 sb->s_flags |= MS_POSIXACL;
1175 1183
1176 return 0; 1184 return 0;
1177 1185