From f5d2300324dbdea55aca6b805b4584ff135036d0 Mon Sep 17 00:00:00 2001 From: Shachar Sharon Date: Thu, 30 Nov 2023 13:29:30 +0200 Subject: [PATCH] reef: client/fuse: handle case of renameat2 with non-zero flags When user issues renameat(2) with non-zero flags (RENAME_EXCHANGE or RENAME_NOREPALCE) the current code ignores those flags and treat the call as ordinary rename. This, in turn, may yield successful rename with wrong semantics then those expected by the caller. Follow the same semantics as kernel's cephfs client: return -EINVAL when having non-zero flags to renameat2 (see 'ceph_rename' at fs/ceph/dir.c). Fixes: https://tracker.ceph.com/issues/63822 Original-Issue: https://tracker.ceph.com/issues/63722 Original-PR: https://github.com/ceph/ceph/pull/54733 Signed-off-by: Leonid Usov Signed-off-by: Shachar Sharon (cherry picked from commit 19509ce650367de8dfb979d3c6a40d5752c822f2) --- src/client/fuse_ll.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/client/fuse_ll.cc b/src/client/fuse_ll.cc index 7f92dd668ba3e..0e2e200644de6 100644 --- a/src/client/fuse_ll.cc +++ b/src/client/fuse_ll.cc @@ -753,6 +753,15 @@ static void fuse_ll_rename(fuse_req_t req, fuse_ino_t parent, const char *name, #endif ) { +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0) + // cephfs does not support renameat2 flavors; follow same logic as done in + // kclient's ceph_rename() + if (flags) { + fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL)); + return; + } +#endif + CephFuse::Handle *cfuse = fuse_ll_req_prepare(req); const struct fuse_ctx *ctx = fuse_req_ctx(req); UserPerm perm(ctx->uid, ctx->gid); -- 2.39.5