aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ceph/acl.c14
-rw-r--r--fs/ceph/inode.c16
-rw-r--r--fs/ceph/super.h4
-rw-r--r--fs/ceph/xattr.c28
4 files changed, 29 insertions, 33 deletions
diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c
index 5457f216e2e5..4f67227f69a5 100644
--- a/fs/ceph/acl.c
+++ b/fs/ceph/acl.c
@@ -90,7 +90,6 @@ int ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type)
90 char *value = NULL; 90 char *value = NULL;
91 struct iattr newattrs; 91 struct iattr newattrs;
92 umode_t new_mode = inode->i_mode, old_mode = inode->i_mode; 92 umode_t new_mode = inode->i_mode, old_mode = inode->i_mode;
93 struct dentry *dentry;
94 93
95 switch (type) { 94 switch (type) {
96 case ACL_TYPE_ACCESS: 95 case ACL_TYPE_ACCESS:
@@ -128,29 +127,26 @@ int ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type)
128 goto out_free; 127 goto out_free;
129 } 128 }
130 129
131 dentry = d_find_alias(inode);
132 if (new_mode != old_mode) { 130 if (new_mode != old_mode) {
133 newattrs.ia_mode = new_mode; 131 newattrs.ia_mode = new_mode;
134 newattrs.ia_valid = ATTR_MODE; 132 newattrs.ia_valid = ATTR_MODE;
135 ret = ceph_setattr(dentry, &newattrs); 133 ret = __ceph_setattr(inode, &newattrs);
136 if (ret) 134 if (ret)
137 goto out_dput; 135 goto out_free;
138 } 136 }
139 137
140 ret = __ceph_setxattr(dentry, name, value, size, 0); 138 ret = __ceph_setxattr(inode, name, value, size, 0);
141 if (ret) { 139 if (ret) {
142 if (new_mode != old_mode) { 140 if (new_mode != old_mode) {
143 newattrs.ia_mode = old_mode; 141 newattrs.ia_mode = old_mode;
144 newattrs.ia_valid = ATTR_MODE; 142 newattrs.ia_valid = ATTR_MODE;
145 ceph_setattr(dentry, &newattrs); 143 __ceph_setattr(inode, &newattrs);
146 } 144 }
147 goto out_dput; 145 goto out_free;
148 } 146 }
149 147
150 ceph_set_cached_acl(inode, type, acl); 148 ceph_set_cached_acl(inode, type, acl);
151 149
152out_dput:
153 dput(dentry);
154out_free: 150out_free:
155 kfree(value); 151 kfree(value);
156out: 152out:
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index ed58b168904a..cadb6aee7f70 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -1776,16 +1776,12 @@ static const struct inode_operations ceph_symlink_iops = {
1776 .removexattr = ceph_removexattr, 1776 .removexattr = ceph_removexattr,
1777}; 1777};
1778 1778
1779/* 1779int __ceph_setattr(struct inode *inode, struct iattr *attr)
1780 * setattr
1781 */
1782int ceph_setattr(struct dentry *dentry, struct iattr *attr)
1783{ 1780{
1784 struct inode *inode = d_inode(dentry);
1785 struct ceph_inode_info *ci = ceph_inode(inode); 1781 struct ceph_inode_info *ci = ceph_inode(inode);
1786 const unsigned int ia_valid = attr->ia_valid; 1782 const unsigned int ia_valid = attr->ia_valid;
1787 struct ceph_mds_request *req; 1783 struct ceph_mds_request *req;
1788 struct ceph_mds_client *mdsc = ceph_sb_to_client(dentry->d_sb)->mdsc; 1784 struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
1789 struct ceph_cap_flush *prealloc_cf; 1785 struct ceph_cap_flush *prealloc_cf;
1790 int issued; 1786 int issued;
1791 int release = 0, dirtied = 0; 1787 int release = 0, dirtied = 0;
@@ -2010,6 +2006,14 @@ out_put:
2010} 2006}
2011 2007
2012/* 2008/*
2009 * setattr
2010 */
2011int ceph_setattr(struct dentry *dentry, struct iattr *attr)
2012{
2013 return __ceph_setattr(d_inode(dentry), attr);
2014}
2015
2016/*
2013 * Verify that we have a lease on the given mask. If not, 2017 * Verify that we have a lease on the given mask. If not,
2014 * do a getattr against an mds. 2018 * do a getattr against an mds.
2015 */ 2019 */
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index beb893bb234f..1e41bc2eb2a8 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -785,6 +785,7 @@ static inline int ceph_do_getattr(struct inode *inode, int mask, bool force)
785 return __ceph_do_getattr(inode, NULL, mask, force); 785 return __ceph_do_getattr(inode, NULL, mask, force);
786} 786}
787extern int ceph_permission(struct inode *inode, int mask); 787extern int ceph_permission(struct inode *inode, int mask);
788extern int __ceph_setattr(struct inode *inode, struct iattr *attr);
788extern int ceph_setattr(struct dentry *dentry, struct iattr *attr); 789extern int ceph_setattr(struct dentry *dentry, struct iattr *attr);
789extern int ceph_getattr(struct vfsmount *mnt, struct dentry *dentry, 790extern int ceph_getattr(struct vfsmount *mnt, struct dentry *dentry,
790 struct kstat *stat); 791 struct kstat *stat);
@@ -792,9 +793,8 @@ extern int ceph_getattr(struct vfsmount *mnt, struct dentry *dentry,
792/* xattr.c */ 793/* xattr.c */
793extern int ceph_setxattr(struct dentry *, const char *, const void *, 794extern int ceph_setxattr(struct dentry *, const char *, const void *,
794 size_t, int); 795 size_t, int);
795int __ceph_setxattr(struct dentry *, const char *, const void *, size_t, int); 796int __ceph_setxattr(struct inode *, const char *, const void *, size_t, int);
796ssize_t __ceph_getxattr(struct inode *, const char *, void *, size_t); 797ssize_t __ceph_getxattr(struct inode *, const char *, void *, size_t);
797int __ceph_removexattr(struct dentry *, const char *);
798extern ssize_t ceph_getxattr(struct dentry *, struct inode *, const char *, void *, size_t); 798extern ssize_t ceph_getxattr(struct dentry *, struct inode *, const char *, void *, size_t);
799extern ssize_t ceph_listxattr(struct dentry *, char *, size_t); 799extern ssize_t ceph_listxattr(struct dentry *, char *, size_t);
800extern int ceph_removexattr(struct dentry *, const char *); 800extern int ceph_removexattr(struct dentry *, const char *);
diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c
index c6e917d360f7..248e32e3ae7d 100644
--- a/fs/ceph/xattr.c
+++ b/fs/ceph/xattr.c
@@ -877,11 +877,10 @@ out:
877 return err; 877 return err;
878} 878}
879 879
880static int ceph_sync_setxattr(struct dentry *dentry, const char *name, 880static int ceph_sync_setxattr(struct inode *inode, const char *name,
881 const char *value, size_t size, int flags) 881 const char *value, size_t size, int flags)
882{ 882{
883 struct ceph_fs_client *fsc = ceph_sb_to_client(dentry->d_sb); 883 struct ceph_fs_client *fsc = ceph_sb_to_client(inode->i_sb);
884 struct inode *inode = d_inode(dentry);
885 struct ceph_inode_info *ci = ceph_inode(inode); 884 struct ceph_inode_info *ci = ceph_inode(inode);
886 struct ceph_mds_request *req; 885 struct ceph_mds_request *req;
887 struct ceph_mds_client *mdsc = fsc->mdsc; 886 struct ceph_mds_client *mdsc = fsc->mdsc;
@@ -939,13 +938,12 @@ out:
939 return err; 938 return err;
940} 939}
941 940
942int __ceph_setxattr(struct dentry *dentry, const char *name, 941int __ceph_setxattr(struct inode *inode, const char *name,
943 const void *value, size_t size, int flags) 942 const void *value, size_t size, int flags)
944{ 943{
945 struct inode *inode = d_inode(dentry);
946 struct ceph_vxattr *vxattr; 944 struct ceph_vxattr *vxattr;
947 struct ceph_inode_info *ci = ceph_inode(inode); 945 struct ceph_inode_info *ci = ceph_inode(inode);
948 struct ceph_mds_client *mdsc = ceph_sb_to_client(dentry->d_sb)->mdsc; 946 struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
949 struct ceph_cap_flush *prealloc_cf = NULL; 947 struct ceph_cap_flush *prealloc_cf = NULL;
950 int issued; 948 int issued;
951 int err; 949 int err;
@@ -1056,7 +1054,7 @@ do_sync_unlocked:
1056 "during filling trace\n", inode); 1054 "during filling trace\n", inode);
1057 err = -EBUSY; 1055 err = -EBUSY;
1058 } else { 1056 } else {
1059 err = ceph_sync_setxattr(dentry, name, value, size, flags); 1057 err = ceph_sync_setxattr(inode, name, value, size, flags);
1060 } 1058 }
1061out: 1059out:
1062 ceph_free_cap_flush(prealloc_cf); 1060 ceph_free_cap_flush(prealloc_cf);
@@ -1078,14 +1076,13 @@ int ceph_setxattr(struct dentry *dentry, const char *name,
1078 if (size == 0) 1076 if (size == 0)
1079 value = ""; /* empty EA, do not remove */ 1077 value = ""; /* empty EA, do not remove */
1080 1078
1081 return __ceph_setxattr(dentry, name, value, size, flags); 1079 return __ceph_setxattr(d_inode(dentry), name, value, size, flags);
1082} 1080}
1083 1081
1084static int ceph_send_removexattr(struct dentry *dentry, const char *name) 1082static int ceph_send_removexattr(struct inode *inode, const char *name)
1085{ 1083{
1086 struct ceph_fs_client *fsc = ceph_sb_to_client(dentry->d_sb); 1084 struct ceph_fs_client *fsc = ceph_sb_to_client(inode->i_sb);
1087 struct ceph_mds_client *mdsc = fsc->mdsc; 1085 struct ceph_mds_client *mdsc = fsc->mdsc;
1088 struct inode *inode = d_inode(dentry);
1089 struct ceph_mds_request *req; 1086 struct ceph_mds_request *req;
1090 int err; 1087 int err;
1091 1088
@@ -1106,12 +1103,11 @@ static int ceph_send_removexattr(struct dentry *dentry, const char *name)
1106 return err; 1103 return err;
1107} 1104}
1108 1105
1109int __ceph_removexattr(struct dentry *dentry, const char *name) 1106static int __ceph_removexattr(struct inode *inode, const char *name)
1110{ 1107{
1111 struct inode *inode = d_inode(dentry);
1112 struct ceph_vxattr *vxattr; 1108 struct ceph_vxattr *vxattr;
1113 struct ceph_inode_info *ci = ceph_inode(inode); 1109 struct ceph_inode_info *ci = ceph_inode(inode);
1114 struct ceph_mds_client *mdsc = ceph_sb_to_client(dentry->d_sb)->mdsc; 1110 struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
1115 struct ceph_cap_flush *prealloc_cf = NULL; 1111 struct ceph_cap_flush *prealloc_cf = NULL;
1116 int issued; 1112 int issued;
1117 int err; 1113 int err;
@@ -1192,7 +1188,7 @@ do_sync_unlocked:
1192 if (lock_snap_rwsem) 1188 if (lock_snap_rwsem)
1193 up_read(&mdsc->snap_rwsem); 1189 up_read(&mdsc->snap_rwsem);
1194 ceph_free_cap_flush(prealloc_cf); 1190 ceph_free_cap_flush(prealloc_cf);
1195 err = ceph_send_removexattr(dentry, name); 1191 err = ceph_send_removexattr(inode, name);
1196 return err; 1192 return err;
1197} 1193}
1198 1194
@@ -1204,7 +1200,7 @@ int ceph_removexattr(struct dentry *dentry, const char *name)
1204 if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) 1200 if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
1205 return generic_removexattr(dentry, name); 1201 return generic_removexattr(dentry, name);
1206 1202
1207 return __ceph_removexattr(dentry, name); 1203 return __ceph_removexattr(d_inode(dentry), name);
1208} 1204}
1209 1205
1210#ifdef CONFIG_SECURITY 1206#ifdef CONFIG_SECURITY