The client handles the nosnap->snap namespace transition.
if (!mdr)
return -EINVAL;
snapid = CEPH_SNAPDIR;
- mdr->ref_snapdiri = cur;
mdr->ref_snapid = snapid;
depth++;
continue;
if (!snapid)
return -ENOENT;
mdr->ref_snapid = snapid;
- mdr->ref_snapdiri = cur;
depth++;
continue;
}
vector<CDentry*> trace; // original path traversal.
CInode *ref; // reference inode. if there is only one, and its path is pinned.
- CInode *ref_snapdiri;
snapid_t ref_snapid;
CInode *tracei;
// ---------------------------------------------------
MDRequest() :
- session(0), client_request(0), ref(0), ref_snapdiri(0), ref_snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
+ session(0), client_request(0), ref(0), ref_snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
alloc_ino(0), used_prealloc_ino(0), cap(NULL), snap_caps(0), did_early_reply(false),
slave_request(0),
internal_op(-1),
_more(0) {}
MDRequest(metareqid_t ri, MClientRequest *req) :
Mutation(ri),
- session(0), client_request(req), ref(0), ref_snapdiri(0), ref_snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
+ session(0), client_request(req), ref(0), ref_snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
alloc_ino(0), used_prealloc_ino(0), cap(NULL), snap_caps(0), did_early_reply(false),
slave_request(0),
internal_op(-1),
_more(0) {}
MDRequest(metareqid_t ri, int by) :
Mutation(ri, by),
- session(0), client_request(0), ref(0), ref_snapdiri(0), ref_snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
+ session(0), client_request(0), ref(0), ref_snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
alloc_ino(0), used_prealloc_ino(0), cap(NULL), snap_caps(0), did_early_reply(false),
slave_request(0),
internal_op(-1),
<< ") " << *req << dendl;
if (tracei || tracedn)
- set_trace_dist(mdr->session, reply, tracei, tracedn, mdr->ref_snapid, mdr->ref_snapdiri,
+ set_trace_dist(mdr->session, reply, tracei, tracedn, mdr->ref_snapid,
mdr->client_request->is_replay(),
mdr->client_request->get_dentry_wanted());
// get tracei/tracedn from mdr?
snapid_t snapid = mdr->ref_snapid;
- CInode *snapdiri = mdr->ref_snapdiri;
if (!tracei)
tracei = mdr->tracei;
if (!tracedn)
// send reply, with trace, and possible leases
if (!did_early_reply && // don't issue leases if we sent an earlier reply already
(tracei || tracedn))
- set_trace_dist(session, reply, tracei, tracedn, snapid, snapdiri, is_replay, dentry_wanted);
+ set_trace_dist(session, reply, tracei, tracedn, snapid, is_replay, dentry_wanted);
messenger->send_message(reply, client_inst);
}
*/
void Server::set_trace_dist(Session *session, MClientReply *reply,
CInode *in, CDentry *dn,
- snapid_t snapid, CInode *snapdiri,
+ snapid_t snapid,
bool is_replay, int dentry_wanted)
{
// inode, dentry, dir, ..., inode
else
encode_null_lease(bl);
dout(20) << "set_trace_dist added dn " << snapid << " " << *dn << dendl;
- /*} else if (snapdiri && snapdiri->ino() == in->ino() && snapname.length()) {
- // fake a snapname dentry
- dout(20) << "set_trace_dist added fake snap dir+dn " << snapname << " under " << *snapdiri << dendl;
- reply->head.is_dentry = 1;
- snapdiri->encode_inodestat(bl, session, NULL, CEPH_SNAPDIR, is_replay);
- encode_empty_dirstat(bl);
- ::encode(snapname, bl);
- encode_infinite_lease(bl);
- */
} else
reply->head.is_dentry = 0;
// yay
mdr->ref = diri;
mdr->ref_snapid = snapid;
- mdr->ref_snapdiri = diri;
MClientReply *reply = new MClientReply(mdr->client_request, 0);
reply->snapbl = diri->snaprealm->get_snap_trace();
reply_request(mdr, reply, diri);
void reply_request(MDRequest *mdr, int r = 0, CInode *tracei = 0, CDentry *tracedn = 0);
void reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei = 0, CDentry *tracedn = 0);
void set_trace_dist(Session *session, MClientReply *reply, CInode *in, CDentry *dn,
- snapid_t snapid, CInode *snapdiri,
+ snapid_t snapid,
bool is_replay, int num_dentries_wanted);
void encode_empty_dirstat(bufferlist& bl);