auto req = make_message<MMDSPeerRequest>(mdr->reqid, mdr->attempt, op);
targeti->set_object_info(req->get_object_info());
req->op_stamp = mdr->get_op_stamp();
+ if (mds->mdsmap->allow_referent_inodes()) {
+ if (inc && newi)
+ req->referent_ino = newi->ino();
+ } else {
+ req->referent_ino = inodeno_t(0);
+ }
if (auto& desti_srnode = mdr->more()->desti_srnode)
encode(*desti_srnode, req->desti_snapbl);
bool inc;
bool adjust_realm = false;
bool realm_projected = false;
+ inodeno_t referent_ino = mdr->peer_request->referent_ino;
if (mdr->peer_request->get_op() == MMDSPeerRequest::OP_LINKPREP) {
inc = true;
pi.inode->nlink++;
adjust_realm = true;
realm_projected = true;
}
+ // Reverse link referent inode to the primary inode (targeti)
+ if (referent_ino > 0) {
+ pi.inode->add_referent_ino(referent_ino);
+ dout(20) << __func__ << " referent_inodes " << std::hex << pi.inode->get_referent_inodes()
+ << " referent ino added " << referent_ino << dendl;
+ }
} else {
inc = false;
pi.inode->nlink--;
#include "messages/MMDSOp.h"
class MMDSPeerRequest final : public MMDSOp {
- static constexpr int HEAD_VERSION = 1;
+ static constexpr int HEAD_VERSION = 2;
static constexpr int COMPAT_VERSION = 1;
public:
static constexpr int OP_XLOCK = 1;
ceph::buffer::list srci_snapbl;
ceph::buffer::list desti_snapbl;
+ inodeno_t referent_ino; //referent inode
public:
metareqid_t get_reqid() const { return reqid; }
__u32 get_attempt() const { return attempt; }
encode(srci_snapbl, payload);
encode(desti_snapbl, payload);
encode(alternate_name, payload);
+ encode(referent_ino, payload);
}
void decode_payload() override {
using ceph::decode;
decode(srci_snapbl, p);
decode(desti_snapbl, p);
decode(alternate_name, p);
+ if (header.version >= 2)
+ decode(referent_ino, p);
}
std::string_view get_type_name() const override { return "peer_request"; }