From: Xiubo Li Date: Mon, 13 Jun 2022 09:28:00 +0000 (+0800) Subject: mds: switch to use projected inode instead X-Git-Tag: v18.0.0~573^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9e0b3518cbe60d9686eb309135f7eb0383b7bb98;p=ceph.git mds: switch to use projected inode instead When the client send a sync request to MDS even the client has the Xx caps, for example, the MDS will revoke the Xx caps back and journal new changes. If the client try to create a sub-directory the MDS was always using the non-projected inode of parent to inherit the gid/uid/mode metadatas, if the journal log still haven't been flushed and applied yet, it will always get the old metadatas. Fixes: https://tracker.ceph.com/issues/56010 Signed-off-by: Xiubo Li --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 5ec4aabb6e4f..aee7fa0c9354 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3359,18 +3359,20 @@ CInode* Server::prepare_new_inode(MDRequestRef& mdr, CDir *dir, inodeno_t useino _inode->truncate_seq = 1; /* starting with 1, 0 is kept for no-truncation logic */ CInode *diri = dir->get_inode(); + auto pip = diri->get_projected_inode(); - dout(10) << oct << " dir mode 0" << diri->get_inode()->mode << " new mode 0" << mode << dec << dendl; + dout(10) << oct << " dir mode 0" << pip->mode << " new mode 0" << mode << dec << dendl; - if (diri->get_inode()->mode & S_ISGID) { + if (pip->mode & S_ISGID) { dout(10) << " dir is sticky" << dendl; - _inode->gid = diri->get_inode()->gid; + _inode->gid = pip->gid; if (S_ISDIR(mode)) { - dout(10) << " new dir also sticky" << dendl; + dout(10) << " new dir also sticky" << dendl; _inode->mode |= S_ISGID; } - } else + } else { _inode->gid = mdr->client_request->get_caller_gid(); + } _inode->uid = mdr->client_request->get_caller_uid();