]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/client/fuse_ll.cc
update sources to 12.2.7
[ceph.git] / ceph / src / client / fuse_ll.cc
index d24ad5c3451a14a5211988510e313af7efd06589..018653f7e6d7d62d6a004995d8427e5efef0e80f 100644 (file)
@@ -127,20 +127,20 @@ static int getgroups(fuse_req_t req, gid_t **sgids)
   return -ENOSYS;
 }
 
-static int getgroups_cb(void *handle, gid_t **sgids)
+static void get_fuse_groups(UserPerm& perms, fuse_req_t req)
 {
-  CephFuse::Handle *cfuse = (CephFuse::Handle *) handle;
-  fuse_req_t req = cfuse->get_fuse_req();
-  return getgroups(req, sgids);
-}
+  if (g_conf->get_val<bool>("fuse_set_user_groups")) {
+    gid_t *gids = NULL;
+    int count = getgroups(req, &gids);
 
-#define GET_GROUPS(perms, req) {                               \
-  if (g_conf->get_val<bool>("fuse_set_user_groups")) { \
-    gid_t *gids = NULL;                                                \
-    int count = getgroups(req, &gids);                         \
-    perms.init_gids(gids, count);                              \
-    perms.take_gids();                                         \
-  } }
+    if (count > 0) {
+      perms.init_gids(gids, count);
+    } else if (count < 0) {
+      derr << __func__ << ": getgroups failed: " << cpp_strerror(-count)
+          << dendl;
+    }
+  }
+}
 
 
 static CephFuse::Handle *fuse_ll_req_prepare(fuse_req_t req)
@@ -158,7 +158,7 @@ static void fuse_ll_lookup(fuse_req_t req, fuse_ino_t parent, const char *name)
   Inode *i2, *i1 = cfuse->iget(parent); // see below
   int r;
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
 
   memset(&fe, 0, sizeof(fe));
   r = cfuse->client->ll_lookup(i1, name, &fe.attr, &i2, perms);
@@ -191,7 +191,7 @@ static void fuse_ll_getattr(fuse_req_t req, fuse_ino_t ino,
   Inode *in = cfuse->iget(ino);
   struct stat stbuf;
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
   
   (void) fi; // XXX
 
@@ -213,7 +213,7 @@ static void fuse_ll_setattr(fuse_req_t req, fuse_ino_t ino, struct stat *attr,
   const struct fuse_ctx *ctx = fuse_req_ctx(req);
   Inode *in = cfuse->iget(ino);
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
 
   int mask = 0;
   if (to_set & FUSE_SET_ATTR_MODE) mask |= CEPH_SETATTR_MODE;
@@ -250,7 +250,7 @@ static void fuse_ll_setxattr(fuse_req_t req, fuse_ino_t ino, const char *name,
   const struct fuse_ctx *ctx = fuse_req_ctx(req);
   Inode *in = cfuse->iget(ino);
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
 
   int r = cfuse->client->ll_setxattr(in, name, value, size, flags, perms);
   fuse_reply_err(req, -r);
@@ -265,7 +265,7 @@ static void fuse_ll_listxattr(fuse_req_t req, fuse_ino_t ino, size_t size)
   Inode *in = cfuse->iget(ino);
   char buf[size];
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
 
   int r = cfuse->client->ll_listxattr(in, buf, size, perms);
   if (size == 0 && r >= 0)
@@ -290,7 +290,7 @@ static void fuse_ll_getxattr(fuse_req_t req, fuse_ino_t ino, const char *name,
   Inode *in = cfuse->iget(ino);
   char buf[size];
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
 
   int r = cfuse->client->ll_getxattr(in, name, buf, size, perms);
   if (size == 0 && r >= 0)
@@ -310,7 +310,7 @@ static void fuse_ll_removexattr(fuse_req_t req, fuse_ino_t ino,
   const struct fuse_ctx *ctx = fuse_req_ctx(req);
   Inode *in = cfuse->iget(ino);
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
 
   int r = cfuse->client->ll_removexattr(in, name, perms);
   fuse_reply_err(req, -r);
@@ -327,7 +327,7 @@ static void fuse_ll_opendir(fuse_req_t req, fuse_ino_t ino,
   void *dirp;
 
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
 
   int r = cfuse->client->ll_opendir(in, fi->flags, (dir_result_t **)&dirp,
                                    perms);
@@ -348,7 +348,7 @@ static void fuse_ll_readlink(fuse_req_t req, fuse_ino_t ino)
   Inode *in = cfuse->iget(ino);
   char buf[PATH_MAX + 1];  // leave room for a null terminator
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
 
   int r = cfuse->client->ll_readlink(in, buf, sizeof(buf) - 1, perms);
   if (r >= 0) {
@@ -369,7 +369,7 @@ static void fuse_ll_mknod(fuse_req_t req, fuse_ino_t parent, const char *name,
   Inode *i2, *i1 = cfuse->iget(parent);
   struct fuse_entry_param fe;
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
 
   memset(&fe, 0, sizeof(fe));
 
@@ -398,7 +398,7 @@ static void fuse_ll_mkdir(fuse_req_t req, fuse_ino_t parent, const char *name,
 
   memset(&fe, 0, sizeof(fe));
   UserPerm perm(ctx->uid, ctx->gid);
-  GET_GROUPS(perm, req);
+  get_fuse_groups(perm, req);
 #ifdef HAVE_SYS_SYNCFS
   if (cfuse->fino_snap(parent) == CEPH_SNAPDIR &&
       cfuse->client->cct->_conf->fuse_multithreaded &&
@@ -441,7 +441,7 @@ static void fuse_ll_unlink(fuse_req_t req, fuse_ino_t parent, const char *name)
   const struct fuse_ctx *ctx = fuse_req_ctx(req);
   Inode *in = cfuse->iget(parent);
   UserPerm perm(ctx->uid, ctx->gid);
-  GET_GROUPS(perm, req);
+  get_fuse_groups(perm, req);
 
   int r = cfuse->client->ll_unlink(in, name, perm);
   fuse_reply_err(req, -r);
@@ -455,7 +455,7 @@ static void fuse_ll_rmdir(fuse_req_t req, fuse_ino_t parent, const char *name)
   const struct fuse_ctx *ctx = fuse_req_ctx(req);
   Inode *in = cfuse->iget(parent);
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
 
   int r = cfuse->client->ll_rmdir(in, name, perms);
   fuse_reply_err(req, -r);
@@ -471,7 +471,7 @@ static void fuse_ll_symlink(fuse_req_t req, const char *existing,
   Inode *i2, *i1 = cfuse->iget(parent);
   struct fuse_entry_param fe;
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
 
   memset(&fe, 0, sizeof(fe));
 
@@ -497,7 +497,7 @@ static void fuse_ll_rename(fuse_req_t req, fuse_ino_t parent, const char *name,
   Inode *in = cfuse->iget(parent);
   Inode *nin = cfuse->iget(newparent);
   UserPerm perm(ctx->uid, ctx->gid);
-  GET_GROUPS(perm, req);
+  get_fuse_groups(perm, req);
 
   int r = cfuse->client->ll_rename(in, name, nin, newname, perm);
   fuse_reply_err(req, -r);
@@ -517,7 +517,7 @@ static void fuse_ll_link(fuse_req_t req, fuse_ino_t ino, fuse_ino_t newparent,
 
   memset(&fe, 0, sizeof(fe));
   UserPerm perm(ctx->uid, ctx->gid);
-  GET_GROUPS(perm, req);
+  get_fuse_groups(perm, req);
   
   /*
    * Note that we could successfully link, but then fail the subsequent
@@ -556,7 +556,7 @@ static void fuse_ll_open(fuse_req_t req, fuse_ino_t ino,
   Inode *in = cfuse->iget(ino);
   Fh *fh = NULL;
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
 
   int r = cfuse->client->ll_open(in, fi->flags, &fh, perms);
   if (r == 0) {
@@ -748,7 +748,15 @@ static void fuse_ll_fsyncdir(fuse_req_t req, fuse_ino_t ino, int datasync,
 
 static void fuse_ll_access(fuse_req_t req, fuse_ino_t ino, int mask)
 {
-  fuse_reply_err(req, 0);
+  CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
+  const struct fuse_ctx *ctx = fuse_req_ctx(req);
+  Inode *in = cfuse->iget(ino);
+  UserPerm perms(ctx->uid, ctx->gid);
+  get_fuse_groups(perms, req);
+
+  int r = cfuse->client->inode_permission(in, perms, mask);
+  fuse_reply_err(req, -r);
+  cfuse->iput(in);
 }
 
 static void fuse_ll_create(fuse_req_t req, fuse_ino_t parent, const char *name,
@@ -760,7 +768,7 @@ static void fuse_ll_create(fuse_req_t req, fuse_ino_t parent, const char *name,
   struct fuse_entry_param fe;
   Fh *fh = NULL;
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
 
   memset(&fe, 0, sizeof(fe));
 
@@ -791,7 +799,7 @@ static void fuse_ll_statfs(fuse_req_t req, fuse_ino_t ino)
   Inode *in = cfuse->iget(ino);
   const struct fuse_ctx *ctx = fuse_req_ctx(req);
   UserPerm perms(ctx->uid, ctx->gid);
-  GET_GROUPS(perms, req);
+  get_fuse_groups(perms, req);
 
   int r = cfuse->client->ll_statfs(in, &stbuf, perms);
   if (r == 0)
@@ -1130,7 +1138,6 @@ int CephFuse::Handle::start()
 #if defined(__linux__)
     remount_cb: remount_cb,
 #endif
-    getgroups_cb: getgroups_cb,
 #if !defined(DARWIN)
     umask_cb: umask_cb,
 #endif