aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-01-28 21:06:18 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-01-28 21:06:18 -0500
commit4db658ea0ca2312b5d168230476ec7729385aefe (patch)
tree25154cd4c6883b15ff269389e60a392b01c72318 /fs
parentd891ea23d5203e5c47439b2a174f86a00b356a6c (diff)
ceph: Fix up after semantic merge conflict
The previous ceph-client merge resulted in ceph not even building, because there was a merge conflict that wasn't visible as an actual data conflict: commit 7221fe4c2ed7 ("ceph: add acl for cephfs") added support for POSIX ACL's into Ceph, but unluckily we also had the VFS tree change a lot of the POSIX ACL helper functions to be much more helpful to filesystems (see for example commits 2aeccbe957d0 "fs: add generic xattr_acl handlers", 5bf3258fd2ac "fs: make posix_acl_chmod more useful" and 37bc15392a23 "fs: make posix_acl_create more useful") The reason this conflict wasn't obvious was many-fold: because it was a semantic conflict rather than a data conflict, it wasn't visible in the git merge as a conflict. And because the VFS tree hadn't been in linux-next, people hadn't become aware of it that way. And because I was at jury duty this morning, I was using my laptop and as a result not doing constant "allmodconfig" builds. Anyway, this fixes the build and generally removes a fair chunk of the Ceph POSIX ACL support code, since the improved helpers seem to match really well for Ceph too. But I don't actually have any way to *test* the end result, and I was really hoping for some ACK's for this. Oh, well. Not compiling certainly doesn't make things easier to test, so I'm committing this without the acks after having waited for four hours... Plus it's what I would have done for the merge had I noticed the semantic conflict.. Reported-by: Dave Jones <davej@redhat.com> Cc: Sage Weil <sage@inktank.com> Cc: Guangliang Zhao <lucienchao@gmail.com> Cc: Li Wang <li.wang@ubuntykylin.com> Cc: Christoph Hellwig <hch@infradead.org> Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/ceph/acl.c103
-rw-r--r--fs/ceph/inode.c3
-rw-r--r--fs/ceph/super.h3
-rw-r--r--fs/ceph/xattr.c5
4 files changed, 6 insertions, 108 deletions
diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c
index 64fddbc1d17b..f6911284c9bd 100644
--- a/fs/ceph/acl.c
+++ b/fs/ceph/acl.c
@@ -213,7 +213,7 @@ int ceph_init_acl(struct dentry *dentry, struct inode *inode, struct inode *dir)
213 if (ret) 213 if (ret)
214 goto out_release; 214 goto out_release;
215 } 215 }
216 ret = posix_acl_create(&acl, GFP_NOFS, &inode->i_mode); 216 ret = __posix_acl_create(&acl, GFP_NOFS, &inode->i_mode);
217 if (ret < 0) 217 if (ret < 0)
218 goto out; 218 goto out;
219 else if (ret > 0) 219 else if (ret > 0)
@@ -229,104 +229,3 @@ out_release:
229out: 229out:
230 return ret; 230 return ret;
231} 231}
232
233int ceph_acl_chmod(struct dentry *dentry, struct inode *inode)
234{
235 struct posix_acl *acl;
236 int ret = 0;
237
238 if (S_ISLNK(inode->i_mode)) {
239 ret = -EOPNOTSUPP;
240 goto out;
241 }
242
243 if (!IS_POSIXACL(inode))
244 goto out;
245
246 acl = ceph_get_acl(inode, ACL_TYPE_ACCESS);
247 if (IS_ERR_OR_NULL(acl)) {
248 ret = PTR_ERR(acl);
249 goto out;
250 }
251
252 ret = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode);
253 if (ret)
254 goto out;
255 ret = ceph_set_acl(dentry, inode, acl, ACL_TYPE_ACCESS);
256 posix_acl_release(acl);
257out:
258 return ret;
259}
260
261static int ceph_xattr_acl_get(struct dentry *dentry, const char *name,
262 void *value, size_t size, int type)
263{
264 struct posix_acl *acl;
265 int ret = 0;
266
267 if (!IS_POSIXACL(dentry->d_inode))
268 return -EOPNOTSUPP;
269
270 acl = ceph_get_acl(dentry->d_inode, type);
271 if (IS_ERR(acl))
272 return PTR_ERR(acl);
273 if (acl == NULL)
274 return -ENODATA;
275
276 ret = posix_acl_to_xattr(&init_user_ns, acl, value, size);
277 posix_acl_release(acl);
278
279 return ret;
280}
281
282static int ceph_xattr_acl_set(struct dentry *dentry, const char *name,
283 const void *value, size_t size, int flags, int type)
284{
285 int ret = 0;
286 struct posix_acl *acl = NULL;
287
288 if (!inode_owner_or_capable(dentry->d_inode)) {
289 ret = -EPERM;
290 goto out;
291 }
292
293 if (!IS_POSIXACL(dentry->d_inode)) {
294 ret = -EOPNOTSUPP;
295 goto out;
296 }
297
298 if (value) {
299 acl = posix_acl_from_xattr(&init_user_ns, value, size);
300 if (IS_ERR(acl)) {
301 ret = PTR_ERR(acl);
302 goto out;
303 }
304
305 if (acl) {
306 ret = posix_acl_valid(acl);
307 if (ret)
308 goto out_release;
309 }
310 }
311
312 ret = ceph_set_acl(dentry, dentry->d_inode, acl, type);
313
314out_release:
315 posix_acl_release(acl);
316out:
317 return ret;
318}
319
320const struct xattr_handler ceph_xattr_acl_default_handler = {
321 .prefix = POSIX_ACL_XATTR_DEFAULT,
322 .flags = ACL_TYPE_DEFAULT,
323 .get = ceph_xattr_acl_get,
324 .set = ceph_xattr_acl_set,
325};
326
327const struct xattr_handler ceph_xattr_acl_access_handler = {
328 .prefix = POSIX_ACL_XATTR_ACCESS,
329 .flags = ACL_TYPE_ACCESS,
330 .get = ceph_xattr_acl_get,
331 .set = ceph_xattr_acl_set,
332};
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index 6fc10a7d7c59..8b8b506636cc 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -9,6 +9,7 @@
9#include <linux/namei.h> 9#include <linux/namei.h>
10#include <linux/writeback.h> 10#include <linux/writeback.h>
11#include <linux/vmalloc.h> 11#include <linux/vmalloc.h>
12#include <linux/posix_acl.h>
12 13
13#include "super.h" 14#include "super.h"
14#include "mds_client.h" 15#include "mds_client.h"
@@ -1805,7 +1806,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr)
1805 __mark_inode_dirty(inode, inode_dirty_flags); 1806 __mark_inode_dirty(inode, inode_dirty_flags);
1806 1807
1807 if (ia_valid & ATTR_MODE) { 1808 if (ia_valid & ATTR_MODE) {
1808 err = ceph_acl_chmod(dentry, inode); 1809 err = posix_acl_chmod(inode, attr->ia_mode);
1809 if (err) 1810 if (err)
1810 goto out_put; 1811 goto out_put;
1811 } 1812 }
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index c299f7d19bf3..345933948b6e 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -736,15 +736,12 @@ extern void __init ceph_xattr_init(void);
736extern void ceph_xattr_exit(void); 736extern void ceph_xattr_exit(void);
737 737
738/* acl.c */ 738/* acl.c */
739extern const struct xattr_handler ceph_xattr_acl_access_handler;
740extern const struct xattr_handler ceph_xattr_acl_default_handler;
741extern const struct xattr_handler *ceph_xattr_handlers[]; 739extern const struct xattr_handler *ceph_xattr_handlers[];
742 740
743#ifdef CONFIG_CEPH_FS_POSIX_ACL 741#ifdef CONFIG_CEPH_FS_POSIX_ACL
744 742
745struct posix_acl *ceph_get_acl(struct inode *, int); 743struct posix_acl *ceph_get_acl(struct inode *, int);
746int ceph_init_acl(struct dentry *, struct inode *, struct inode *); 744int ceph_init_acl(struct dentry *, struct inode *, struct inode *);
747int ceph_acl_chmod(struct dentry *, struct inode *);
748void ceph_forget_all_cached_acls(struct inode *inode); 745void ceph_forget_all_cached_acls(struct inode *inode);
749 746
750#else 747#else
diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c
index c7581f3733c1..898b6565ad3e 100644
--- a/fs/ceph/xattr.c
+++ b/fs/ceph/xattr.c
@@ -6,6 +6,7 @@
6#include <linux/ceph/decode.h> 6#include <linux/ceph/decode.h>
7 7
8#include <linux/xattr.h> 8#include <linux/xattr.h>
9#include <linux/posix_acl_xattr.h>
9#include <linux/slab.h> 10#include <linux/slab.h>
10 11
11#define XATTR_CEPH_PREFIX "ceph." 12#define XATTR_CEPH_PREFIX "ceph."
@@ -17,8 +18,8 @@
17 */ 18 */
18const struct xattr_handler *ceph_xattr_handlers[] = { 19const struct xattr_handler *ceph_xattr_handlers[] = {
19#ifdef CONFIG_CEPH_FS_POSIX_ACL 20#ifdef CONFIG_CEPH_FS_POSIX_ACL
20 &ceph_xattr_acl_access_handler, 21 &posix_acl_access_xattr_handler,
21 &ceph_xattr_acl_default_handler, 22 &posix_acl_default_xattr_handler,
22#endif 23#endif
23 NULL, 24 NULL,
24}; 25};