]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add lookup parent op
authorSage Weil <sage@newdream.net>
Tue, 28 Jul 2009 17:37:51 +0000 (10:37 -0700)
committerSage Weil <sage@newdream.net>
Tue, 28 Jul 2009 17:37:51 +0000 (10:37 -0700)
src/include/ceph_fs.h
src/mds/Server.cc
src/mds/Server.h

index fbefa01a65716eb1d2d117e23e68b30c2076982f..e617c2fd9511339633e3fc6aad9843d90d6fe14f 100644 (file)
@@ -426,6 +426,8 @@ enum {
        CEPH_MDS_OP_LOOKUP     = 0x00100,
        CEPH_MDS_OP_GETATTR    = 0x00101,
        CEPH_MDS_OP_LOOKUPHASH = 0x00102,
+       CEPH_MDS_OP_LOOKUPPARENT = 0x00103,
+
        CEPH_MDS_OP_SETXATTR   = 0x01105,
        CEPH_MDS_OP_RMXATTR    = 0x01106,
        CEPH_MDS_OP_SETLAYOUT  = 0x01107,
@@ -454,6 +456,7 @@ static inline const char *ceph_mds_op_name(int op)
        switch (op) {
        case CEPH_MDS_OP_LOOKUP:  return "lookup";
        case CEPH_MDS_OP_LOOKUPHASH:  return "lookuphash";
+       case CEPH_MDS_OP_LOOKUPPARENT:  return "lookupparent";
        case CEPH_MDS_OP_GETATTR:  return "getattr";
        case CEPH_MDS_OP_SETXATTR: return "setxattr";
        case CEPH_MDS_OP_SETATTR: return "setattr";
index 9bc1cd99a591d34413b1f55d6dbbf80bf4cc5c62..349b45973b98d55f195457176461c74450dfa802 100644 (file)
@@ -984,6 +984,10 @@ void Server::dispatch_client_request(MDRequest *mdr)
     handle_client_stat(mdr);
     break;
 
+  case CEPH_MDS_OP_LOOKUPPARENT:
+    handle_client_lookup_parent(mdr);
+    break;
+
   case CEPH_MDS_OP_SETATTR:
     handle_client_setattr(mdr);
     break;
@@ -1804,6 +1808,30 @@ void Server::handle_client_stat(MDRequest *mdr)
                req->get_op() == CEPH_MDS_OP_LOOKUP ? mdr->dn[0].back() : 0);
 }
 
+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_root()) {
+    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
+}
+
 
 void Server::handle_client_lookup_hash(MDRequest *mdr)
 {
index 547c928b5c6a67eee2dc4effa05b1e1afff4e7e9..66188198618efa02c93cccc81dfd364a3048426a 100644 (file)
@@ -121,6 +121,7 @@ public:
 
   // requests on existing inodes.
   void handle_client_stat(MDRequest *mdr);
+  void handle_client_lookup_parent(MDRequest *mdr);
   void handle_client_lookup_hash(MDRequest *mdr);
   void handle_client_readdir(MDRequest *mdr);