]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: introduce LOOKUPNAME MDS request
authorYan, Zheng <zheng.z.yan@intel.com>
Thu, 6 Mar 2014 07:24:02 +0000 (15:24 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Fri, 7 Mar 2014 23:22:06 +0000 (07:22 +0800)
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 <zheng.z.yan@intel.com>
src/common/ceph_strings.cc
src/include/ceph_fs.h
src/mds/Server.cc
src/mds/Server.h
wireshark/ceph/ceph_fs.h
wireshark/ceph/packet-ceph.c

index ebf2f0069e70e5b1eadb0957154b39ed5d3f0882..d82ecbbaf63a6aab7a0cae1fb246b8213af9b830 100644 (file)
@@ -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";
index 714b2875a236ce7b97f53d75c69d7a494048424c..4c3b895c2528ff08197220f01d3b27276a6423cd 100644 (file)
@@ -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,
index 5006708bc203246a3c33ca263ce03ea86c459e8e..a4c26bd548cdcf56f63fef467ce9b9be50c4a0e2 100644 (file)
@@ -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<SimpleLock*> 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);
   }
 }
 
index ef43efd6ffba0a9e02df9ffb19c08d2359d0d3b1..6ae9f5956757f538e2f036415cda646f6e8f8f25 100644 (file)
@@ -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);
index b8c60694b2b0977d4ecdb982d8bcaea5f0ef2673..1f731271a6c0c510641689f938b74811f0ec8c42 100644 (file)
@@ -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,
index 4379fda0fe0be63e686f4887e604f373cf1fa2ba..408f015d7c6fce33e64dacbe42c58556de3ef198 100644 (file)
@@ -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";