]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
fuse: wire up fuse_ll_access
authorJeff Layton <jlayton@redhat.com>
Mon, 2 Apr 2018 13:20:41 +0000 (09:20 -0400)
committerPrashant D <pdhange@redhat.com>
Tue, 17 Apr 2018 13:08:27 +0000 (09:08 -0400)
This gets called during chdir and is currently a no-op. Make sure we
check permissions appropriately.

Tracker: http://tracker.ceph.com/issues/23509
Signed-off-by: Jeff Layton <jlayton@redhat.com>
(cherry picked from commit 53b59a3c0b6b4f14e9d0ae9d4900a8b4311159e6)

Conflicts:
src/client/Client.h: Resolved for inode_permission

src/client/Client.h
src/client/fuse_ll.cc

index 0d7cd787bad13ec4ee5c6256d1ec6c271441d0ce..2b6fd001ebccff0af6fd728fdd418c846580fbf2 100644 (file)
@@ -865,7 +865,6 @@ private:
 
   void init_groups(UserPerm *groups);
 
-  int inode_permission(Inode *in, const UserPerm& perms, unsigned want);
   int xattr_permission(Inode *in, const char *name, unsigned want,
                       const UserPerm& perms);
   int may_setattr(Inode *in, struct ceph_statx *stx, int mask,
@@ -1126,6 +1125,9 @@ public:
   int mksnap(const char *path, const char *name, const UserPerm& perm);
   int rmsnap(const char *path, const char *name, const UserPerm& perm);
 
+  // Inode permission checking
+  int inode_permission(Inode *in, const UserPerm& perms, unsigned want);
+
   // expose caps
   int get_caps_issued(int fd);
   int get_caps_issued(const char *path, const UserPerm& perms);
index d24ad5c3451a14a5211988510e313af7efd06589..35f591360ce651da5337fa0ab4e7a44b190ec465 100644 (file)
@@ -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,