]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: switch to use projected inode instead 46641/head
authorXiubo Li <xiubli@redhat.com>
Mon, 13 Jun 2022 09:28:00 +0000 (17:28 +0800)
committerXiubo Li <xiubli@redhat.com>
Tue, 14 Jun 2022 08:54:36 +0000 (16:54 +0800)
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 <xiubli@redhat.com>
src/mds/Server.cc

index 5ec4aabb6e4f4f90715136e3b781a0213be4bd87..aee7fa0c935446df24c9c3831941266230338adb 100644 (file)
@@ -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();