switch (req->get_op()) {
case CEPH_MDS_OP_LOOKUPHASH:
case CEPH_MDS_OP_LOOKUPINO:
- handle_client_lookup_ino(mdr);
+ handle_client_lookup_ino(mdr, false);
+ break;
+ case CEPH_MDS_OP_LOOKUPPARENT:
+ handle_client_lookup_ino(mdr, true);
break;
// inodes ops.
handle_client_getattr(mdr, false);
break;
- case CEPH_MDS_OP_LOOKUPPARENT:
- handle_client_lookup_parent(mdr);
- break;
-
case CEPH_MDS_OP_SETATTR:
handle_client_setattr(mdr);
break;
is_lookup ? mdr->dn[0].back() : 0);
}
-/* This function will clean up the passed mdr*/
-void Server::handle_client_lookup_parent(MDRequest *mdr)
-{
- MClientRequest *req = mdr->client_request;
-
- CInode *in = mdcache->get_inode(req->get_filepath().get_ino());
- if (!in) {
- reply_request(mdr, -ESTALE);
- return;
- }
- if (in->is_base()) {
- reply_request(mdr, -EINVAL);
- return;
- }
-
- CDentry *dn = in->get_projected_parent_dn();
-
- set<SimpleLock*> rdlocks, wrlocks, xlocks;
- rdlocks.insert(&dn->lock);
- if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks))
- return;
-
- reply_request(mdr, 0, in, dn); // reply
-}
-
struct C_MDS_LookupIno2 : public Context {
Server *server;
MDRequest *mdr;
/*
* filepath: ino
*/
-void Server::handle_client_lookup_ino(MDRequest *mdr)
+void Server::handle_client_lookup_ino(MDRequest *mdr, bool want_parent)
{
MClientRequest *req = mdr->client_request;
return;
}
- dout(10) << "reply to lookup_ino " << *in << dendl;
- MClientReply *reply = new MClientReply(req, 0);
- reply_request(mdr, reply, in, NULL);
+ if (want_parent) {
+ CInode *pin = in->get_parent_inode();
+ if (pin && !pin->is_stray()) {
+ dout(10) << "reply to lookup_parent " << *in << dendl;
+ reply_request(mdr, 0, pin);
+ } else
+ reply_request(mdr, -ESTALE);
+ } else {
+ dout(10) << "reply to lookup_ino " << *in << dendl;
+ reply_request(mdr, 0, in);
+ }
}
void Server::_lookup_ino_2(MDRequest *mdr, int r)
// requests on existing inodes.
void handle_client_getattr(MDRequest *mdr, bool is_lookup);
- void handle_client_lookup_parent(MDRequest *mdr);
- void handle_client_lookup_ino(MDRequest *mdr);
+ void handle_client_lookup_ino(MDRequest *mdr, bool want_parent);
void _lookup_ino_2(MDRequest *mdr, int r);
void handle_client_readdir(MDRequest *mdr);
void handle_client_file_setlock(MDRequest *mdr);