]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: reduce _getattr() calls during permission check
authorYan, Zheng <zyan@redhat.com>
Mon, 19 Oct 2015 08:10:43 +0000 (16:10 +0800)
committerYan, Zheng <zyan@redhat.com>
Tue, 12 Jan 2016 09:21:01 +0000 (17:21 +0800)
Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/client/Client.cc
src/client/Client.h

index c059631abe7de23d4ef9c9485177e60d71bb4047..20b89aa28dc3474ea5862f2bca0e8f46b87086ab 100644 (file)
@@ -4856,7 +4856,7 @@ int Client::xattr_permission(Inode *in, const char *name, unsigned want, int uid
     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;
 
@@ -4880,7 +4880,7 @@ int Client::may_setattr(Inode *in, struct stat *st, int mask, int uid, int gid)
     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;
 
@@ -4952,7 +4952,7 @@ int Client::may_open(Inode *in, int flags, int uid, int gid)
       break;
   }
 
-  r = _getattr(in, CEPH_STAT_CAP_MODE, uid, gid);
+  r = _getattr_for_perm(in, uid, gid);
   if (r < 0)
     goto out;
 
@@ -4970,7 +4970,7 @@ int Client::may_lookup(Inode *dir, int uid, int gid)
     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;
 
@@ -4988,7 +4988,7 @@ int Client::may_create(Inode *dir, int uid, int gid)
     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;
 
@@ -5006,7 +5006,7 @@ int Client::may_delete(Inode *dir, const char *name, int uid, int gid)
     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;
 
@@ -5036,7 +5036,7 @@ int Client::may_hardlink(Inode *in, int uid, int gid)
     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;
 
@@ -5061,6 +5061,17 @@ 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 */
@@ -12014,11 +12025,6 @@ int Client::check_pool_perm(Inode *in, int need)
 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);
index 2648471147cdb60d7b76f479a928de1d794ec918..b61df614baadd4db0e54a31ed48d5403f846f93a 100644 (file)
@@ -794,7 +794,8 @@ private:
   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);