}
/* 'dir' is a inode for which a lock has already been taken */
-struct dentry *mds_name2locked_dentry(struct obd_device *obd, struct dentry *dir,
- struct vfsmount **mnt, char *name,
- int namelen, int lock_mode,
+struct dentry *mds_name2locked_dentry(struct obd_device *obd,
+ struct dentry *dir, struct vfsmount **mnt,
+ char *name, int namelen, int lock_mode,
struct lustre_handle *lockh,
int dir_lock_mode)
{
res_id[0] = dchild->d_inode->i_ino;
rc = ldlm_match_or_enqueue(NULL, NULL, obd->obd_namespace, NULL,
res_id, LDLM_PLAIN, NULL, 0, lock_mode,
- &flags, ldlm_completion_ast, (void *)mds_lock_callback, NULL,
- 0, lockh);
+ &flags, ldlm_completion_ast,
+ mds_blocking_ast, NULL, 0, lockh);
if (rc != ELDLM_OK) {
l_dput(dchild);
up(&dir->d_inode->i_sem);
res_id[0] = de->d_inode->i_ino;
rc = ldlm_match_or_enqueue(NULL, NULL, obd->obd_namespace, NULL,
res_id, LDLM_PLAIN, NULL, 0, lock_mode,
- &flags, ldlm_completion_ast, (void *)mds_lock_callback, NULL,
- 0, lockh);
+ &flags, ldlm_completion_ast,
+ mds_blocking_ast, NULL, 0, lockh);
if (rc != ELDLM_OK) {
l_dput(de);
retval = ERR_PTR(-ENOLCK); /* XXX translate ldlm code */
RETURN(0);
}
-int mds_lock_callback(struct lustre_handle *lockh, struct ldlm_lock_desc *desc,
- void *data, int data_len, struct ptlrpc_request **reqp)
+int mds_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
+ void *data, __u32 data_len)
{
+ struct lustre_handle lockh;
ENTRY;
- if (desc == NULL) {
- /* Completion AST. Do nothing */
- RETURN(0);
- }
-
- if (ldlm_cli_cancel(lockh) < 0)
+ ldlm_lock2handle(lock, &lockh);
+ if (ldlm_cli_cancel(&lockh) < 0)
LBUG();
RETURN(0);
}
LDLM_DEBUG_NOLOCK("enqueue res %Lu", res_id[0]);
rc = ldlm_cli_enqueue(NULL, NULL, obd->obd_namespace, NULL,
res_id, LDLM_PLAIN, NULL, 0, lock_mode,
- &flags, ldlm_completion_ast, (void *)mds_lock_callback,
- NULL, 0, &lockh);
+ &flags, ldlm_completion_ast,
+ mds_blocking_ast, NULL, 0, &lockh);
if (rc != ELDLM_OK) {
CERROR("lock enqueue: err: %d\n", rc);
GOTO(out_create_de, rc = -EIO);
if (rc)
break;
RETURN(0);
- case LDLM_CALLBACK:
+ case LDLM_BL_CALLBACK:
+ case LDLM_CP_CALLBACK:
CDEBUG(D_INODE, "callback\n");
CERROR("callbacks should not happen on MDS\n");
LBUG();
- OBD_FAIL_RETURN(OBD_FAIL_LDLM_CALLBACK, 0);
+ OBD_FAIL_RETURN(OBD_FAIL_LDLM_BL_CALLBACK, 0);
break;
-
-
default:
rc = ptlrpc_error(req->rq_svc, req);
RETURN(rc);
it->opc = NTOH__u64(it->opc);
- LDLM_DEBUG(lock, "intent policy, opc: %s", ldlm_it2str(it->opc));
+ LDLM_DEBUG(lock, "intent policy, opc: %s",
+ ldlm_it2str(it->opc));
/* prepare reply */
switch((long)it->opc) {
/* execute policy */
switch ((long)it->opc) {
- case IT_CREAT:
case IT_CREAT|IT_OPEN:
+ rc = mds_reint(2, req);
+ if (rc || (req->rq_status != 0 &&
+ req->rq_status != -EEXIST)) {
+ rep->lock_policy_res2 = req->rq_status;
+ RETURN(ELDLM_LOCK_ABORTED);
+ }
+ break;
+ case IT_CREAT:
case IT_LINK:
case IT_MKDIR:
case IT_MKNOD:
extern int mds_iocontrol(long cmd, struct lustre_handle *conn,
- int len, void *karg, void *uarg);
+ int len, void *karg, void *uarg);
/* use obd ops to offer management infrastructure */
static struct obd_ops mds_obd_ops = {