]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: trust the fscrypt_file as the inode size and truncate caches
authorXiubo Li <xiubli@redhat.com>
Fri, 26 Nov 2021 02:20:12 +0000 (10:20 +0800)
committerXiubo Li <xiubli@redhat.com>
Thu, 13 Jan 2022 14:01:54 +0000 (22:01 +0800)
Signed-off-by: Xiubo Li <xiubli@redhat.com>
src/client/Client.cc
src/client/Inode.h

index 779370d9cbc318d332899eff95ec9e675a80192b..38881a8fb899281b939ac0f057608f76e62d95c7 100644 (file)
@@ -802,7 +802,7 @@ void Client::update_inode_file_size(Inode *in, int issued, uint64_t size,
 
       // truncate cached file data
       if (prior_size > size) {
-       _invalidate_inode_cache(in, truncate_size, prior_size - truncate_size);
+       _invalidate_inode_cache(in, size, prior_size - size);
       }
     }
 
@@ -5214,15 +5214,20 @@ void Client::handle_cap_trunc(MetaSession *session, Inode *in, const MConstRef<M
   mds_rank_t mds = session->mds_num;
   ceph_assert(in->caps.count(mds));
 
+  uint64_t size = m->get_size();
+  if (in->is_fscrypt_enabled()) {
+    size = std::stoll(std::string(std::rbegin(m->fscrypt_file),
+                                  std::rend(m->fscrypt_file)));
+  }
   ldout(cct, 10) << __func__ << " on ino " << *in
           << " size " << in->size << " -> " << m->get_size()
           << dendl;
-  
+
   int issued;
   in->caps_issued(&issued);
   issued |= in->caps_dirty();
-  update_inode_file_size(in, issued, m->get_size(),
-                        m->get_truncate_seq(), m->get_truncate_size());
+  update_inode_file_size(in, issued, size, m->get_truncate_seq(),
+                         m->get_truncate_size());
 }
 
 void Client::handle_cap_flush_ack(MetaSession *session, Inode *in, Cap *cap, const MConstRef<MClientCaps>& m)
index 72b8c0a2fb908dbe072cbe9fe9f736a0a2de310d..f5db5d7a905e1b39ac04aa4c8d463931f1ff8a35 100644 (file)
@@ -165,6 +165,9 @@ struct Inode : RefCountedObject {
 
   std::vector<uint8_t> fscrypt_auth;
   std::vector<uint8_t> fscrypt_file;
+  bool is_fscrypt_enabled() {
+    return !!fscrypt_auth.size();
+  }
 
   bool is_root()    const { return ino == CEPH_INO_ROOT; }
   bool is_symlink() const { return (mode & S_IFMT) == S_IFLNK; }