diff options
-rw-r--r-- | fs/ceph/acl.c | 14 | ||||
-rw-r--r-- | fs/ceph/inode.c | 16 | ||||
-rw-r--r-- | fs/ceph/super.h | 4 | ||||
-rw-r--r-- | fs/ceph/xattr.c | 28 |
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 | ||
152 | out_dput: | ||
153 | dput(dentry); | ||
154 | out_free: | 150 | out_free: |
155 | kfree(value); | 151 | kfree(value); |
156 | out: | 152 | out: |
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 | /* | 1779 | int __ceph_setattr(struct inode *inode, struct iattr *attr) |
1780 | * setattr | ||
1781 | */ | ||
1782 | int 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 | */ | ||
2011 | int 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 | } |
787 | extern int ceph_permission(struct inode *inode, int mask); | 787 | extern int ceph_permission(struct inode *inode, int mask); |
788 | extern int __ceph_setattr(struct inode *inode, struct iattr *attr); | ||
788 | extern int ceph_setattr(struct dentry *dentry, struct iattr *attr); | 789 | extern int ceph_setattr(struct dentry *dentry, struct iattr *attr); |
789 | extern int ceph_getattr(struct vfsmount *mnt, struct dentry *dentry, | 790 | extern 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 */ |
793 | extern int ceph_setxattr(struct dentry *, const char *, const void *, | 794 | extern int ceph_setxattr(struct dentry *, const char *, const void *, |
794 | size_t, int); | 795 | size_t, int); |
795 | int __ceph_setxattr(struct dentry *, const char *, const void *, size_t, int); | 796 | int __ceph_setxattr(struct inode *, const char *, const void *, size_t, int); |
796 | ssize_t __ceph_getxattr(struct inode *, const char *, void *, size_t); | 797 | ssize_t __ceph_getxattr(struct inode *, const char *, void *, size_t); |
797 | int __ceph_removexattr(struct dentry *, const char *); | ||
798 | extern ssize_t ceph_getxattr(struct dentry *, struct inode *, const char *, void *, size_t); | 798 | extern ssize_t ceph_getxattr(struct dentry *, struct inode *, const char *, void *, size_t); |
799 | extern ssize_t ceph_listxattr(struct dentry *, char *, size_t); | 799 | extern ssize_t ceph_listxattr(struct dentry *, char *, size_t); |
800 | extern int ceph_removexattr(struct dentry *, const char *); | 800 | extern 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 | ||
880 | static int ceph_sync_setxattr(struct dentry *dentry, const char *name, | 880 | static 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 | ||
942 | int __ceph_setxattr(struct dentry *dentry, const char *name, | 941 | int __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 | } |
1061 | out: | 1059 | out: |
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 | ||
1084 | static int ceph_send_removexattr(struct dentry *dentry, const char *name) | 1082 | static 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 | ||
1109 | int __ceph_removexattr(struct dentry *dentry, const char *name) | 1106 | static 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 |