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,
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";
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;
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)
{
// 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);