gid = get_gid();
RequestUserGroups groups(this, uid, gid);
- int r = _getattr(in, CEPH_STAT_CAP_MODE, uid, gid);
+ int r = _getattr_for_perm(in, uid, gid);
if (r < 0)
goto out;
gid = get_gid();
RequestUserGroups groups(this, uid, gid);
- int r = _getattr(in, CEPH_STAT_CAP_MODE, uid, gid);
+ int r = _getattr_for_perm(in, uid, gid);
if (r < 0)
goto out;
break;
}
- r = _getattr(in, CEPH_STAT_CAP_MODE, uid, gid);
+ r = _getattr_for_perm(in, uid, gid);
if (r < 0)
goto out;
gid = get_gid();
RequestUserGroups groups(this, uid, gid);
- int r = _getattr(dir, CEPH_STAT_CAP_MODE, uid, gid);
+ int r = _getattr_for_perm(dir, uid, gid);
if (r < 0)
goto out;
gid = get_gid();
RequestUserGroups groups(this, uid, gid);
- int r = _getattr(dir, CEPH_STAT_CAP_MODE, uid, gid);
+ int r = _getattr_for_perm(dir, uid, gid);
if (r < 0)
goto out;
gid = get_gid();
RequestUserGroups groups(this, uid, gid);
- int r = _getattr(dir, CEPH_STAT_CAP_MODE, uid, gid);
+ int r = _getattr_for_perm(dir, uid, gid);
if (r < 0)
goto out;
gid = get_gid();
RequestUserGroups groups(this, uid, gid);
- int r = _getattr(in, CEPH_STAT_CAP_MODE, uid, gid);
+ int r = _getattr_for_perm(in, uid, gid);
if (r < 0)
goto out;
return r;
}
+int Client::_getattr_for_perm(Inode *in, int uid, int gid)
+{
+ int mask = CEPH_STAT_CAP_MODE;
+ bool force = false;
+ if (acl_type != NO_ACL) {
+ mask |= CEPH_STAT_CAP_XATTR;
+ force = in->xattr_version == 0;
+ }
+ return _getattr(in, mask, uid, gid, force);
+}
+
vinodeno_t Client::_get_vino(Inode *in)
{
/* The caller must hold the client lock */
int Client::_posix_acl_permission(Inode *in, uid_t uid, UserGroups& groups, unsigned want)
{
if (acl_type == POSIX_ACL) {
- int r = _getattr(in, CEPH_STAT_CAP_XATTR | CEPH_STAT_CAP_MODE,
- uid, groups.get_gid(), in->xattr_version == 0);
- if (r < 0)
- return r;
-
if (in->xattrs.count(ACL_EA_ACCESS)) {
const bufferptr& access_acl = in->xattrs[ACL_EA_ACCESS];
return posix_acl_permits(access_acl, in->uid, in->gid, uid, groups, want);
int may_create(Inode *dir, int uid=-1, int gid=-1);
int may_delete(Inode *dir, const char *name, int uid=-1, int gid=-1);
int may_hardlink(Inode *in, int uid=-1, int gid=-1);
- int _getgrouplist(gid_t **sgids, int uid=-1, int gid=-1);
+ int _getattr_for_perm(Inode *in, int uid, int gid);
+ int _getgrouplist(gid_t **sgids, int uid, int gid);
int check_data_pool_exist(string name, string value, const OSDMap *osdmap);