From 543bbfd1a149e9545e0d134f03954ee902476e1a Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 31 Jul 2004 14:43:41 +0000 Subject: [PATCH] b=4049 r=adilger - fix lock inversion by removing DLM lock acquiring in mdt_obj_create() instead just mark request difficult explicitly --- lustre/include/linux/lustre_net.h | 1 + lustre/mds/handler.c | 21 ++------------------- lustre/ptlrpc/ptlrpc_module.c | 1 + lustre/ptlrpc/service.c | 11 +++++++++++ 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/lustre/include/linux/lustre_net.h b/lustre/include/linux/lustre_net.h index 4890358..03d9ab3 100644 --- a/lustre/include/linux/lustre_net.h +++ b/lustre/include/linux/lustre_net.h @@ -639,6 +639,7 @@ void ptlrpc_retain_replayable_request(struct ptlrpc_request *req, __u64 ptlrpc_next_xid(void); /* ptlrpc/service.c */ +void ptlrpc_require_repack (struct ptlrpc_request *req); void ptlrpc_save_lock (struct ptlrpc_request *req, struct lustre_handle *lock, int mode); void ptlrpc_save_llog_lock (struct ptlrpc_request *req, diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c index a52583b..b3057b5 100644 --- a/lustre/mds/handler.c +++ b/lustre/mds/handler.c @@ -1338,14 +1338,11 @@ static void reconstruct_create(struct ptlrpc_request *req) static int mdt_obj_create(struct ptlrpc_request *req) { struct obd_device *obd = req->rq_export->exp_obd; - struct ldlm_res_id res_id = { .name = {0} }; struct mds_obd *mds = &obd->u.mds; struct ost_body *body, *repbody; char fidname[LL_FID_NAMELEN]; struct inode *parent_inode; - struct lustre_handle lockh; struct lvfs_run_ctxt saved; - ldlm_policy_data_t policy; struct dentry *new = NULL; struct dentry_params dp; int mealen, flags = 0, rc, size = sizeof(*repbody), cleanup_phase = 0; @@ -1465,18 +1462,6 @@ repeat: GOTO(cleanup, rc); } - /* this lock should be taken to serialize MDS modifications - * in failure case */ - res_id.name[0] = new->d_inode->i_ino; - res_id.name[1] = new->d_inode->i_generation; - policy.l_inodebits.bits = MDS_INODELOCK_UPDATE; - rc = ldlm_cli_enqueue(NULL, NULL, obd->obd_namespace, - res_id, LDLM_IBITS, &policy, - LCK_EX, &flags, mds_blocking_ast, - ldlm_completion_ast, NULL, NULL, - NULL, 0, NULL, &lockh); - if (rc != ELDLM_OK) - GOTO(cleanup, rc); cleanup_phase = 2; /* valid lockh */ CDEBUG(D_OTHER, "created dirobj: %lu/%lu mode %o\n", @@ -1515,11 +1500,9 @@ repeat: cleanup: switch (cleanup_phase) { - case 2: /* valid lockh */ + case 2: /* object has been created, but we'll may want to replay it later */ if (rc == 0) - ptlrpc_save_lock(req, &lockh, LCK_EX); - else - ldlm_lock_decref(&lockh, LCK_EX); + ptlrpc_require_repack(req); case 1: /* transaction */ rc = mds_finish_transno(mds, parent_inode, handle, req, rc, 0); } diff --git a/lustre/ptlrpc/ptlrpc_module.c b/lustre/ptlrpc/ptlrpc_module.c index 9e3a0c7..cfd1ad2 100644 --- a/lustre/ptlrpc/ptlrpc_module.c +++ b/lustre/ptlrpc/ptlrpc_module.c @@ -133,6 +133,7 @@ EXPORT_SYMBOL(ptlrpc_fail_import); EXPORT_SYMBOL(ptlrpc_disconnect_import); /* service.c */ +EXPORT_SYMBOL(ptlrpc_require_repack); EXPORT_SYMBOL(ptlrpc_save_lock); EXPORT_SYMBOL(ptlrpc_save_llog_lock); EXPORT_SYMBOL(ptlrpc_schedule_difficult_reply); diff --git a/lustre/ptlrpc/service.c b/lustre/ptlrpc/service.c index 692c929..3cea525 100644 --- a/lustre/ptlrpc/service.c +++ b/lustre/ptlrpc/service.c @@ -129,6 +129,14 @@ ptlrpc_save_llog_lock (struct ptlrpc_request *req, } void +ptlrpc_require_repack(struct ptlrpc_request *req) +{ + struct ptlrpc_reply_state *rs = req->rq_reply_state; + LASSERT (rs != NULL); + rs->rs_difficult = 1; +} + +void ptlrpc_save_lock (struct ptlrpc_request *req, struct lustre_handle *lock, int mode) { @@ -577,12 +585,15 @@ ptlrpc_server_handle_reply (struct ptlrpc_service *svc) if (nlocks == 0 && !been_handled) { /* If we see this, we should already have seen the warning * in mds_steal_ack_locks() */ +#if 0 + /* CMD may ask to save request with no DLM locks -bzzz */ CWARN("All locks stolen from rs %p x"LPD64".t"LPD64 " o%d NID %s\n", rs, rs->rs_xid, rs->rs_transno, rs->rs_msg.opc, ptlrpc_peernid2str(&exp->exp_connection->c_peer, str)); +#endif } if ((!been_handled && rs->rs_on_net) || -- 1.8.3.1