aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/inode.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2013-12-20 08:16:52 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2014-01-25 23:58:22 -0500
commite01580bf9e4d0e3bbaead44bd46cdbfe61957732 (patch)
tree1f853adc16d311670dbfba0cf6e2e7555d1d9b4b /fs/gfs2/inode.c
parent2cc6a5a01cdbeb0e46f3aa144819d5d7cee458a1 (diff)
gfs2: use generic posix ACL infrastructure
This contains some major refactoring for the create path so that inodes are created with the right mode to start with instead of fixing it up later. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/gfs2/inode.c')
-rw-r--r--fs/gfs2/inode.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 7119504159f1..d573125d1021 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -552,6 +552,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
552 unsigned int size, int excl, int *opened) 552 unsigned int size, int excl, int *opened)
553{ 553{
554 const struct qstr *name = &dentry->d_name; 554 const struct qstr *name = &dentry->d_name;
555 struct posix_acl *default_acl, *acl;
555 struct gfs2_holder ghs[2]; 556 struct gfs2_holder ghs[2];
556 struct inode *inode = NULL; 557 struct inode *inode = NULL;
557 struct gfs2_inode *dip = GFS2_I(dir), *ip; 558 struct gfs2_inode *dip = GFS2_I(dir), *ip;
@@ -611,10 +612,14 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
611 if (!inode) 612 if (!inode)
612 goto fail_gunlock; 613 goto fail_gunlock;
613 614
615 error = posix_acl_create(dir, &mode, &default_acl, &acl);
616 if (error)
617 goto fail_free_vfs_inode;
618
614 ip = GFS2_I(inode); 619 ip = GFS2_I(inode);
615 error = gfs2_rs_alloc(ip); 620 error = gfs2_rs_alloc(ip);
616 if (error) 621 if (error)
617 goto fail_free_inode; 622 goto fail_free_acls;
618 623
619 inode->i_mode = mode; 624 inode->i_mode = mode;
620 set_nlink(inode, S_ISDIR(mode) ? 2 : 1); 625 set_nlink(inode, S_ISDIR(mode) ? 2 : 1);
@@ -682,7 +687,16 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
682 gfs2_set_iop(inode); 687 gfs2_set_iop(inode);
683 insert_inode_hash(inode); 688 insert_inode_hash(inode);
684 689
685 error = gfs2_acl_create(dip, inode); 690 if (default_acl) {
691 error = gfs2_set_acl(inode, default_acl, ACL_TYPE_DEFAULT);
692 posix_acl_release(default_acl);
693 }
694 if (acl) {
695 if (!error)
696 error = gfs2_set_acl(inode, acl, ACL_TYPE_ACCESS);
697 posix_acl_release(acl);
698 }
699
686 if (error) 700 if (error)
687 goto fail_gunlock3; 701 goto fail_gunlock3;
688 702
@@ -716,6 +730,12 @@ fail_free_inode:
716 if (ip->i_gl) 730 if (ip->i_gl)
717 gfs2_glock_put(ip->i_gl); 731 gfs2_glock_put(ip->i_gl);
718 gfs2_rs_delete(ip, NULL); 732 gfs2_rs_delete(ip, NULL);
733fail_free_acls:
734 if (default_acl)
735 posix_acl_release(default_acl);
736 if (acl)
737 posix_acl_release(acl);
738fail_free_vfs_inode:
719 free_inode_nonrcu(inode); 739 free_inode_nonrcu(inode);
720 inode = NULL; 740 inode = NULL;
721fail_gunlock: 741fail_gunlock:
@@ -1678,10 +1698,11 @@ static int gfs2_setattr(struct dentry *dentry, struct iattr *attr)
1678 error = gfs2_setattr_size(inode, attr->ia_size); 1698 error = gfs2_setattr_size(inode, attr->ia_size);
1679 else if (attr->ia_valid & (ATTR_UID | ATTR_GID)) 1699 else if (attr->ia_valid & (ATTR_UID | ATTR_GID))
1680 error = setattr_chown(inode, attr); 1700 error = setattr_chown(inode, attr);
1681 else if ((attr->ia_valid & ATTR_MODE) && IS_POSIXACL(inode)) 1701 else {
1682 error = gfs2_acl_chmod(ip, attr);
1683 else
1684 error = gfs2_setattr_simple(inode, attr); 1702 error = gfs2_setattr_simple(inode, attr);
1703 if (!error && attr->ia_valid & ATTR_MODE)
1704 error = posix_acl_chmod(inode, inode->i_mode);
1705 }
1685 1706
1686out: 1707out:
1687 if (!error) 1708 if (!error)
@@ -1841,6 +1862,7 @@ const struct inode_operations gfs2_file_iops = {
1841 .removexattr = gfs2_removexattr, 1862 .removexattr = gfs2_removexattr,
1842 .fiemap = gfs2_fiemap, 1863 .fiemap = gfs2_fiemap,
1843 .get_acl = gfs2_get_acl, 1864 .get_acl = gfs2_get_acl,
1865 .set_acl = gfs2_set_acl,
1844}; 1866};
1845 1867
1846const struct inode_operations gfs2_dir_iops = { 1868const struct inode_operations gfs2_dir_iops = {
@@ -1862,6 +1884,7 @@ const struct inode_operations gfs2_dir_iops = {
1862 .removexattr = gfs2_removexattr, 1884 .removexattr = gfs2_removexattr,
1863 .fiemap = gfs2_fiemap, 1885 .fiemap = gfs2_fiemap,
1864 .get_acl = gfs2_get_acl, 1886 .get_acl = gfs2_get_acl,
1887 .set_acl = gfs2_set_acl,
1865 .atomic_open = gfs2_atomic_open, 1888 .atomic_open = gfs2_atomic_open,
1866}; 1889};
1867 1890
@@ -1877,6 +1900,5 @@ const struct inode_operations gfs2_symlink_iops = {
1877 .listxattr = gfs2_listxattr, 1900 .listxattr = gfs2_listxattr,
1878 .removexattr = gfs2_removexattr, 1901 .removexattr = gfs2_removexattr,
1879 .fiemap = gfs2_fiemap, 1902 .fiemap = gfs2_fiemap,
1880 .get_acl = gfs2_get_acl,
1881}; 1903};
1882 1904