mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-15 13:22:55 +00:00
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: commit7221fe4c2e
("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 commits2aeccbe957
"fs: add generic xattr_acl handlers",5bf3258fd2
"fs: make posix_acl_chmod more useful" and37bc15392a
"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>
This commit is contained in:
parent
d891ea23d5
commit
4db658ea0c
103
fs/ceph/acl.c
103
fs/ceph/acl.c
@ -213,7 +213,7 @@ int ceph_init_acl(struct dentry *dentry, struct inode *inode, struct inode *dir)
|
||||
if (ret)
|
||||
goto out_release;
|
||||
}
|
||||
ret = posix_acl_create(&acl, GFP_NOFS, &inode->i_mode);
|
||||
ret = __posix_acl_create(&acl, GFP_NOFS, &inode->i_mode);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
else if (ret > 0)
|
||||
@ -229,104 +229,3 @@ out_release:
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ceph_acl_chmod(struct dentry *dentry, struct inode *inode)
|
||||
{
|
||||
struct posix_acl *acl;
|
||||
int ret = 0;
|
||||
|
||||
if (S_ISLNK(inode->i_mode)) {
|
||||
ret = -EOPNOTSUPP;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!IS_POSIXACL(inode))
|
||||
goto out;
|
||||
|
||||
acl = ceph_get_acl(inode, ACL_TYPE_ACCESS);
|
||||
if (IS_ERR_OR_NULL(acl)) {
|
||||
ret = PTR_ERR(acl);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode);
|
||||
if (ret)
|
||||
goto out;
|
||||
ret = ceph_set_acl(dentry, inode, acl, ACL_TYPE_ACCESS);
|
||||
posix_acl_release(acl);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ceph_xattr_acl_get(struct dentry *dentry, const char *name,
|
||||
void *value, size_t size, int type)
|
||||
{
|
||||
struct posix_acl *acl;
|
||||
int ret = 0;
|
||||
|
||||
if (!IS_POSIXACL(dentry->d_inode))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
acl = ceph_get_acl(dentry->d_inode, type);
|
||||
if (IS_ERR(acl))
|
||||
return PTR_ERR(acl);
|
||||
if (acl == NULL)
|
||||
return -ENODATA;
|
||||
|
||||
ret = posix_acl_to_xattr(&init_user_ns, acl, value, size);
|
||||
posix_acl_release(acl);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ceph_xattr_acl_set(struct dentry *dentry, const char *name,
|
||||
const void *value, size_t size, int flags, int type)
|
||||
{
|
||||
int ret = 0;
|
||||
struct posix_acl *acl = NULL;
|
||||
|
||||
if (!inode_owner_or_capable(dentry->d_inode)) {
|
||||
ret = -EPERM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!IS_POSIXACL(dentry->d_inode)) {
|
||||
ret = -EOPNOTSUPP;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (value) {
|
||||
acl = posix_acl_from_xattr(&init_user_ns, value, size);
|
||||
if (IS_ERR(acl)) {
|
||||
ret = PTR_ERR(acl);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (acl) {
|
||||
ret = posix_acl_valid(acl);
|
||||
if (ret)
|
||||
goto out_release;
|
||||
}
|
||||
}
|
||||
|
||||
ret = ceph_set_acl(dentry, dentry->d_inode, acl, type);
|
||||
|
||||
out_release:
|
||||
posix_acl_release(acl);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
const struct xattr_handler ceph_xattr_acl_default_handler = {
|
||||
.prefix = POSIX_ACL_XATTR_DEFAULT,
|
||||
.flags = ACL_TYPE_DEFAULT,
|
||||
.get = ceph_xattr_acl_get,
|
||||
.set = ceph_xattr_acl_set,
|
||||
};
|
||||
|
||||
const struct xattr_handler ceph_xattr_acl_access_handler = {
|
||||
.prefix = POSIX_ACL_XATTR_ACCESS,
|
||||
.flags = ACL_TYPE_ACCESS,
|
||||
.get = ceph_xattr_acl_get,
|
||||
.set = ceph_xattr_acl_set,
|
||||
};
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <linux/namei.h>
|
||||
#include <linux/writeback.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/posix_acl.h>
|
||||
|
||||
#include "super.h"
|
||||
#include "mds_client.h"
|
||||
@ -1805,7 +1806,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
__mark_inode_dirty(inode, inode_dirty_flags);
|
||||
|
||||
if (ia_valid & ATTR_MODE) {
|
||||
err = ceph_acl_chmod(dentry, inode);
|
||||
err = posix_acl_chmod(inode, attr->ia_mode);
|
||||
if (err)
|
||||
goto out_put;
|
||||
}
|
||||
|
@ -736,15 +736,12 @@ extern void __init ceph_xattr_init(void);
|
||||
extern void ceph_xattr_exit(void);
|
||||
|
||||
/* acl.c */
|
||||
extern const struct xattr_handler ceph_xattr_acl_access_handler;
|
||||
extern const struct xattr_handler ceph_xattr_acl_default_handler;
|
||||
extern const struct xattr_handler *ceph_xattr_handlers[];
|
||||
|
||||
#ifdef CONFIG_CEPH_FS_POSIX_ACL
|
||||
|
||||
struct posix_acl *ceph_get_acl(struct inode *, int);
|
||||
int ceph_init_acl(struct dentry *, struct inode *, struct inode *);
|
||||
int ceph_acl_chmod(struct dentry *, struct inode *);
|
||||
void ceph_forget_all_cached_acls(struct inode *inode);
|
||||
|
||||
#else
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include <linux/ceph/decode.h>
|
||||
|
||||
#include <linux/xattr.h>
|
||||
#include <linux/posix_acl_xattr.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#define XATTR_CEPH_PREFIX "ceph."
|
||||
@ -17,8 +18,8 @@
|
||||
*/
|
||||
const struct xattr_handler *ceph_xattr_handlers[] = {
|
||||
#ifdef CONFIG_CEPH_FS_POSIX_ACL
|
||||
&ceph_xattr_acl_access_handler,
|
||||
&ceph_xattr_acl_default_handler,
|
||||
&posix_acl_access_xattr_handler,
|
||||
&posix_acl_default_xattr_handler,
|
||||
#endif
|
||||
NULL,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user