From: Yan, Zheng Date: Thu, 6 Mar 2014 07:24:02 +0000 (+0800) Subject: mds: introduce LOOKUPNAME MDS request X-Git-Tag: v0.78~53^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=617ce6761edd7264893f3638c33fd229c71751a0;p=ceph.git mds: introduce LOOKUPNAME MDS request The new MDS request is used for connecting a given inode to its parent inode. It allows client to have efficient implementation of get_rename() NFS export callback. Signed-off-by: Yan, Zheng --- diff --git a/src/common/ceph_strings.cc b/src/common/ceph_strings.cc index ebf2f0069e70..d82ecbbaf63a 100644 --- a/src/common/ceph_strings.cc +++ b/src/common/ceph_strings.cc @@ -173,6 +173,7 @@ const char *ceph_mds_op_name(int op) case CEPH_MDS_OP_LOOKUPHASH: return "lookuphash"; case CEPH_MDS_OP_LOOKUPPARENT: return "lookupparent"; case CEPH_MDS_OP_LOOKUPINO: return "lookupino"; + case CEPH_MDS_OP_LOOKUPNAME: return "lookupname"; case CEPH_MDS_OP_GETATTR: return "getattr"; case CEPH_MDS_OP_SETXATTR: return "setxattr"; case CEPH_MDS_OP_SETATTR: return "setattr"; diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index 714b2875a236..4c3b895c2528 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -310,6 +310,7 @@ enum { CEPH_MDS_OP_LOOKUPHASH = 0x00102, CEPH_MDS_OP_LOOKUPPARENT = 0x00103, CEPH_MDS_OP_LOOKUPINO = 0x00104, + CEPH_MDS_OP_LOOKUPNAME = 0x00105, CEPH_MDS_OP_SETXATTR = 0x01105, CEPH_MDS_OP_RMXATTR = 0x01106, diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 5006708bc203..a4c26bd548cd 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -1190,10 +1190,13 @@ void Server::dispatch_client_request(MDRequest *mdr) switch (req->get_op()) { case CEPH_MDS_OP_LOOKUPHASH: case CEPH_MDS_OP_LOOKUPINO: - handle_client_lookup_ino(mdr, false); + handle_client_lookup_ino(mdr, false, false); break; case CEPH_MDS_OP_LOOKUPPARENT: - handle_client_lookup_ino(mdr, true); + handle_client_lookup_ino(mdr, true, false); + break; + case CEPH_MDS_OP_LOOKUPNAME: + handle_client_lookup_ino(mdr, false, true); break; // inodes ops. @@ -2372,7 +2375,7 @@ struct C_MDS_LookupIno2 : public Context { /* * filepath: ino */ -void Server::handle_client_lookup_ino(MDRequest *mdr, bool want_parent) +void Server::handle_client_lookup_ino(MDRequest *mdr, bool want_parent, bool want_dentry) { MClientRequest *req = mdr->client_request; @@ -2387,16 +2390,35 @@ void Server::handle_client_lookup_ino(MDRequest *mdr, bool want_parent) return; } + CDentry *dn = in->get_projected_parent_dn(); + CInode *diri = dn ? dn->get_dir()->inode : NULL; + if (dn && (want_parent || want_dentry)) { + mdr->pin(dn); + set rdlocks, wrlocks, xlocks; + rdlocks.insert(&dn->lock); + if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks)) + return; + } + 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 + if (!diri || diri->is_stray()) { reply_request(mdr, -ESTALE); + return; + } + dout(10) << "reply to lookup_parent " << *in << dendl; + reply_request(mdr, 0, diri); } else { - dout(10) << "reply to lookup_ino " << *in << dendl; - reply_request(mdr, 0, in); + if (want_dentry) { + inodeno_t dirino = req->get_filepath2().get_ino(); + if (!diri || (dirino != inodeno_t() && diri->ino() != dirino)) { + reply_request(mdr, -ENOENT); + return; + } + dout(10) << "reply to lookup_name " << *in << dendl; + } else + dout(10) << "reply to lookup_ino " << *in << dendl; + + reply_request(mdr, 0, in, want_dentry ? dn : NULL); } } diff --git a/src/mds/Server.h b/src/mds/Server.h index ef43efd6ffba..6ae9f5956757 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -142,7 +142,7 @@ public: // requests on existing inodes. void handle_client_getattr(MDRequest *mdr, bool is_lookup); - void handle_client_lookup_ino(MDRequest *mdr, bool want_parent); + void handle_client_lookup_ino(MDRequest *mdr, bool want_parent, bool want_dentry); void _lookup_ino_2(MDRequest *mdr, int r); void handle_client_readdir(MDRequest *mdr); void handle_client_file_setlock(MDRequest *mdr); diff --git a/wireshark/ceph/ceph_fs.h b/wireshark/ceph/ceph_fs.h index b8c60694b2b0..1f731271a6c0 100644 --- a/wireshark/ceph/ceph_fs.h +++ b/wireshark/ceph/ceph_fs.h @@ -314,6 +314,7 @@ enum { CEPH_MDS_OP_LOOKUPHASH = 0x00102, CEPH_MDS_OP_LOOKUPPARENT = 0x00103, CEPH_MDS_OP_LOOKUPINO = 0x00104, + CEPH_MDS_OP_LOOKUPNAME = 0x00105, CEPH_MDS_OP_SETXATTR = 0x01105, CEPH_MDS_OP_RMXATTR = 0x01106, diff --git a/wireshark/ceph/packet-ceph.c b/wireshark/ceph/packet-ceph.c index 4379fda0fe0b..408f015d7c6f 100644 --- a/wireshark/ceph/packet-ceph.c +++ b/wireshark/ceph/packet-ceph.c @@ -242,6 +242,7 @@ const char *ceph_mds_op_name(int op) case CEPH_MDS_OP_LOOKUPHASH: return "lookuphash"; case CEPH_MDS_OP_LOOKUPPARENT: return "lookupparent"; case CEPH_MDS_OP_LOOKUPINO: return "lookupino"; + case CEPH_MDS_OP_LOOKUPNAME: return "lookupname"; case CEPH_MDS_OP_GETATTR: return "getattr"; case CEPH_MDS_OP_SETXATTR: return "setxattr"; case CEPH_MDS_OP_SETATTR: return "setattr";