From: Jeff Layton Date: Mon, 2 Apr 2018 13:20:41 +0000 (-0400) Subject: fuse: wire up fuse_ll_access X-Git-Tag: v13.1.0~288^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=53b59a3c0b6b4f14e9d0ae9d4900a8b4311159e6;p=ceph.git fuse: wire up fuse_ll_access 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 --- diff --git a/src/client/Client.h b/src/client/Client.h index 0f69bdfa503a..63030589a186 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -860,7 +860,6 @@ private: MAY_READ = 4, }; - 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, @@ -1124,6 +1123,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); diff --git a/src/client/fuse_ll.cc b/src/client/fuse_ll.cc index a6e5b238a88e..86f91d31b230 100644 --- a/src/client/fuse_ll.cc +++ b/src/client/fuse_ll.cc @@ -766,7 +766,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,