From: Kotresh HR Date: Thu, 27 Feb 2025 17:42:07 +0000 (+0530) Subject: mds: Referent hardlink Recovery - Store remote_inode X-Git-Tag: v20.3.0~377^2~14 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=97650eeef18c4ed03fc266001cace98bbc6f8d8a;p=ceph.git mds: Referent hardlink Recovery - Store remote_inode Store the remote_inode/real inode as an xattr on the referent inode in the data pool. Fixes: https://tracker.ceph.com/issues/69338 Signed-off-by: Kotresh HR --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index e45219d87f2..7bddb58b48f 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -78,6 +78,12 @@ void CInodeCommitOperation::update(ObjectOperation &op, inode_backtrace_t &bt) { encode(_symlink, symlink_bl); op.setxattr("symlink", symlink_bl); } + + if (remote_inode) { + bufferlist remote_inode_bl; + encode(remote_inode, remote_inode_bl); + op.setxattr("remote_inode", remote_inode_bl); + } } class CInodeIOContext : public MDSIOContextBase @@ -1410,8 +1416,12 @@ void CInode::_store_backtrace(std::vector &ops_vec, slink = symlink; } + inodeno_t remote_inode = 0; + if (is_referent_remote()) + remote_inode = get_remote_ino(); + ops_vec.emplace_back(op_prio, pool, get_inode()->layout, - mdcache->mds->mdsmap->get_up_features(), slink); + mdcache->mds->mdsmap->get_up_features(), slink, remote_inode); if (!state_test(STATE_DIRTYPOOL) || get_inode()->old_pools.empty() || ignore_old_pools) { dout(20) << __func__ << ": no dirtypool or no old pools or ignore_old_pools" << dendl; diff --git a/src/mds/CInode.h b/src/mds/CInode.h index cd3e440d06b..29206c2d8c7 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -66,8 +66,8 @@ public: CInodeCommitOperation(int prio, int64_t po) : pool(po), priority(prio) { } - CInodeCommitOperation(int prio, int64_t po, file_layout_t l, uint64_t f, std::string_view s) - : pool(po), priority(prio), _layout(l), _features(f), _symlink(s) { + CInodeCommitOperation(int prio, int64_t po, file_layout_t l, uint64_t f, std::string_view s, inodeno_t ri) + : pool(po), priority(prio), _layout(l), _features(f), _symlink(s), remote_inode(ri) { update_layout_symlink = true; } @@ -81,6 +81,7 @@ private: file_layout_t _layout; uint64_t _features; std::string_view _symlink; + inodeno_t remote_inode; // real inode of the referent inode }; struct CInodeCommitOperations {