+ if (flag == LDLM_CB_CANCELING) {
+ /* Don't need to do anything here. */
+ RETURN(0);
+ }
+
+ /* XXX layering violation! -phil */
+ l_lock(&lock->l_resource->lr_namespace->ns_lock);
+ lock->l_flags |= LDLM_FL_CBPENDING;
+ do_ast = (!lock->l_readers && !lock->l_writers);
+ l_unlock(&lock->l_resource->lr_namespace->ns_lock);
+
+ if (do_ast) {
+ struct lustre_handle lockh;
+ int rc;
+
+ LDLM_DEBUG(lock, "already unused, calling ldlm_cli_cancel");
+ ldlm_lock2handle(lock, &lockh);
+ rc = ldlm_cli_cancel(&lockh);
+ if (rc < 0)
+ CERROR("ldlm_cli_cancel: %d\n", rc);
+ } else
+ LDLM_DEBUG(lock, "Lock still has references, will be"
+ "cancelled later");
+ RETURN(0);
+}
+
+static int mds_getattr_internal(struct mds_obd *mds, struct dentry *dentry,
+ struct ptlrpc_request *req,
+ struct mds_body *reqbody, int reply_off)
+{
+ struct mds_body *body;
+ struct inode *inode = dentry->d_inode;
+ int rc;
+ ENTRY;
+
+ if (inode == NULL)
+ RETURN(-ENOENT);
+
+ body = lustre_msg_buf(req->rq_repmsg, reply_off);
+
+ mds_pack_inode2fid(&body->fid1, inode);
+ mds_pack_inode2body(body, inode);
+
+ if (S_ISREG(inode->i_mode)) {
+ struct lov_mds_md *lmm;
+
+ lmm = lustre_msg_buf(req->rq_repmsg, reply_off + 1);
+ lmm->lmm_easize = mds->mds_max_mdsize;
+ rc = mds_fs_get_md(mds, inode, lmm);
+
+ if (rc < 0) {
+ if (rc == -ENODATA)
+ RETURN(0);
+ CERROR("mds_fs_get_md failed: %d\n", rc);
+ RETURN(rc);
+ }
+ body->valid |= OBD_MD_FLEASIZE;
+ } else if (S_ISLNK(inode->i_mode) && reqbody->valid & OBD_MD_LINKNAME) {
+ char *symname = lustre_msg_buf(req->rq_repmsg, reply_off + 1);
+ int len = req->rq_repmsg->buflens[reply_off + 1];
+
+ rc = inode->i_op->readlink(dentry, symname, len);
+ if (rc < 0) {
+ CERROR("readlink failed: %d\n", rc);
+ RETURN(rc);
+ } else
+ CDEBUG(D_INODE, "read symlink dest %s\n", symname);
+
+ body->valid |= OBD_MD_LINKNAME;
+ }