]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: remove client reference from RequestUserGroups
authorGreg Farnum <gfarnum@redhat.com>
Fri, 29 Jul 2016 23:37:43 +0000 (16:37 -0700)
committerGreg Farnum <gfarnum@redhat.com>
Wed, 21 Sep 2016 23:33:50 +0000 (16:33 -0700)
Signed-off-by: Greg Farnum <gfarnum@redhat.com>
src/client/Client.cc
src/client/Client.h

index e523c4e142a068e0460369d0982c81e39cf8df68..274b040522dca1aef05c3599f5ef2664bf3c4a59 100644 (file)
@@ -5043,7 +5043,8 @@ out:
 
 int Client::may_setattr(Inode *in, struct stat *st, int mask, const UserPerm& perms)
 {
-  RequestUserGroups groups(this, perms.uid(), perms.gid());
+  RequestUserGroups groups(perms.uid(), perms.gid());
+  init_groups(&groups);
 
   int r = _getattr_for_perm(in, perms);
   if (r < 0)
@@ -12479,12 +12480,18 @@ void Client::handle_conf_change(const struct md_config_t *conf,
   }
 }
 
+void Client::init_groups(RequestUserGroups *groups)
+{
+  gid_t *sgids;
+  int count = _getgrouplist(&sgids, groups->get_uid(), groups->get_gid());
+  groups->init_gids(sgids, count);
+}
+
 bool Client::RequestUserGroups::is_in(gid_t id)
 {
+  assert(sgid_count >= 0);
   if (id == gid)
     return true;
-  if (sgid_count < 0)
-    init();
   for (int i = 0; i < sgid_count; ++i) {
     if (id == sgids[i])
       return true;
@@ -12494,8 +12501,7 @@ bool Client::RequestUserGroups::is_in(gid_t id)
 
 int Client::RequestUserGroups::get_gids(const gid_t **out)
 {
-  if (sgid_count < 0)
-    init();
+  assert(sgid_count >= 0);
   if (sgid_count > 0) {
     *out = sgids;
     return sgid_count;
index 559c0dfc982dce4afdb2c37a8c128121b782ac54..4dacdd0468425a3064f49e2d78eae83f4b25fe93 100644 (file)
@@ -878,24 +878,28 @@ private:
   };
 
   class RequestUserGroups : public UserGroups {
-    Client *client;
     uid_t uid;
     gid_t gid;
     int sgid_count;
     gid_t *sgids;
-    void init() {
-      sgid_count = client->_getgrouplist(&sgids, uid, gid);
-    }
     public:
-    RequestUserGroups(Client *c, uid_t u, gid_t g) :
-      client(c), uid(u), gid(g), sgid_count(-1), sgids(NULL) {}
+    RequestUserGroups(uid_t u, gid_t g) :
+      uid(u), gid(g), sgid_count(-1), sgids(NULL) {}
     ~RequestUserGroups() {
       free(sgids);
     }
+    bool is_init() { return sgid_count < 0; }
+    void init_gids(gid_t *_sgids, int count) {
+      sgids = _sgids;
+      sgid_count = count;
+    }
+    uid_t get_uid() { return uid; }
     gid_t get_gid() { return gid; }
     bool is_in(gid_t id);
     int get_gids(const gid_t **out);
   };
+  friend class RequestUserGroups;
+  void init_groups(RequestUserGroups *groups);
 
   int inode_permission(Inode *in, uid_t uid, UserGroups& groups, unsigned want);
   int xattr_permission(Inode *in, const char *name, unsigned want,
@@ -908,7 +912,8 @@ private:
   int may_hardlink(Inode *in, const UserPerm& perms);
 
   int inode_permission(Inode *in, const UserPerm& perms, unsigned want) {
-    RequestUserGroups groups(this, perms.uid(), perms.gid());
+    RequestUserGroups groups(perms.uid(), perms.gid());
+    init_groups(&groups);
     return inode_permission(in, perms.uid(), groups, want);
   }
   int xattr_permission(Inode *in, const char *name, unsigned want, int uid=-1, int gid=-1) {