@@ -86,7 +86,7 @@ static int send_remove(struct dlm_rsb *r);
8686static int _request_lock (struct dlm_rsb * r , struct dlm_lkb * lkb );
8787static int _cancel_lock (struct dlm_rsb * r , struct dlm_lkb * lkb );
8888static void __receive_convert_reply (struct dlm_rsb * r , struct dlm_lkb * lkb ,
89- struct dlm_message * ms );
89+ struct dlm_message * ms , bool local );
9090static int receive_extralen (struct dlm_message * ms );
9191static void do_purge (struct dlm_ls * ls , int nodeid , int pid );
9292static void toss_rsb (struct kref * kref );
@@ -1561,15 +1561,16 @@ static int remove_from_waiters(struct dlm_lkb *lkb, int mstype)
15611561/* Handles situations where we might be processing a "fake" or "local" reply in
15621562 which we can't try to take waiters_mutex again. */
15631563
1564- static int remove_from_waiters_ms (struct dlm_lkb * lkb , struct dlm_message * ms )
1564+ static int remove_from_waiters_ms (struct dlm_lkb * lkb , struct dlm_message * ms ,
1565+ bool local )
15651566{
15661567 struct dlm_ls * ls = lkb -> lkb_resource -> res_ls ;
15671568 int error ;
15681569
1569- if (ms -> m_flags != cpu_to_le32 ( DLM_IFL_LOCAL_MS ) )
1570+ if (! local )
15701571 mutex_lock (& ls -> ls_waiters_mutex );
15711572 error = _remove_from_waiters (lkb , le32_to_cpu (ms -> m_type ), ms );
1572- if (ms -> m_flags != cpu_to_le32 ( DLM_IFL_LOCAL_MS ) )
1573+ if (! local )
15731574 mutex_unlock (& ls -> ls_waiters_mutex );
15741575 return error ;
15751576}
@@ -3486,10 +3487,9 @@ static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb)
34863487 /* down conversions go without a reply from the master */
34873488 if (!error && down_conversion (lkb )) {
34883489 remove_from_waiters (lkb , DLM_MSG_CONVERT_REPLY );
3489- r -> res_ls -> ls_local_ms .m_flags = cpu_to_le32 (DLM_IFL_LOCAL_MS );
34903490 r -> res_ls -> ls_local_ms .m_type = cpu_to_le32 (DLM_MSG_CONVERT_REPLY );
34913491 r -> res_ls -> ls_local_ms .m_result = 0 ;
3492- __receive_convert_reply (r , lkb , & r -> res_ls -> ls_local_ms );
3492+ __receive_convert_reply (r , lkb , & r -> res_ls -> ls_local_ms , true );
34933493 }
34943494
34953495 return error ;
@@ -3679,9 +3679,10 @@ static void receive_flags(struct dlm_lkb *lkb, struct dlm_message *ms)
36793679 (le32_to_cpu (ms -> m_flags ) & 0x0000FFFF );
36803680}
36813681
3682- static void receive_flags_reply (struct dlm_lkb * lkb , struct dlm_message * ms )
3682+ static void receive_flags_reply (struct dlm_lkb * lkb , struct dlm_message * ms ,
3683+ bool local )
36833684{
3684- if (ms -> m_flags == cpu_to_le32 ( DLM_IFL_LOCAL_MS ) )
3685+ if (local )
36853686 return ;
36863687
36873688 lkb -> lkb_sbflags = le32_to_cpu (ms -> m_sbflags );
@@ -4074,7 +4075,7 @@ static int receive_grant(struct dlm_ls *ls, struct dlm_message *ms)
40744075 if (error )
40754076 goto out ;
40764077
4077- receive_flags_reply (lkb , ms );
4078+ receive_flags_reply (lkb , ms , false );
40784079 if (is_altmode (lkb ))
40794080 munge_altmode (lkb , ms );
40804081 grant_lock_pc (r , lkb , ms );
@@ -4278,7 +4279,7 @@ static int receive_request_reply(struct dlm_ls *ls, struct dlm_message *ms)
42784279 case - EINPROGRESS :
42794280 case 0 :
42804281 /* request was queued or granted on remote master */
4281- receive_flags_reply (lkb , ms );
4282+ receive_flags_reply (lkb , ms , false );
42824283 lkb -> lkb_remid = le32_to_cpu (ms -> m_lkid );
42834284 if (is_altmode (lkb ))
42844285 munge_altmode (lkb , ms );
@@ -4348,7 +4349,7 @@ static int receive_request_reply(struct dlm_ls *ls, struct dlm_message *ms)
43484349}
43494350
43504351static void __receive_convert_reply (struct dlm_rsb * r , struct dlm_lkb * lkb ,
4351- struct dlm_message * ms )
4352+ struct dlm_message * ms , bool local )
43524353{
43534354 /* this is the value returned from do_convert() on the master */
43544355 switch (from_dlm_errno (le32_to_cpu (ms -> m_result ))) {
@@ -4358,14 +4359,14 @@ static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb,
43584359 break ;
43594360
43604361 case - EDEADLK :
4361- receive_flags_reply (lkb , ms );
4362+ receive_flags_reply (lkb , ms , local );
43624363 revert_lock_pc (r , lkb );
43634364 queue_cast (r , lkb , - EDEADLK );
43644365 break ;
43654366
43664367 case - EINPROGRESS :
43674368 /* convert was queued on remote master */
4368- receive_flags_reply (lkb , ms );
4369+ receive_flags_reply (lkb , ms , local );
43694370 if (is_demoted (lkb ))
43704371 munge_demoted (lkb );
43714372 del_lkb (r , lkb );
@@ -4374,7 +4375,7 @@ static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb,
43744375
43754376 case 0 :
43764377 /* convert was granted on remote master */
4377- receive_flags_reply (lkb , ms );
4378+ receive_flags_reply (lkb , ms , local );
43784379 if (is_demoted (lkb ))
43794380 munge_demoted (lkb );
43804381 grant_lock_pc (r , lkb , ms );
@@ -4391,7 +4392,8 @@ static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb,
43914392 }
43924393}
43934394
4394- static void _receive_convert_reply (struct dlm_lkb * lkb , struct dlm_message * ms )
4395+ static void _receive_convert_reply (struct dlm_lkb * lkb , struct dlm_message * ms ,
4396+ bool local )
43954397{
43964398 struct dlm_rsb * r = lkb -> lkb_resource ;
43974399 int error ;
@@ -4404,11 +4406,11 @@ static void _receive_convert_reply(struct dlm_lkb *lkb, struct dlm_message *ms)
44044406 goto out ;
44054407
44064408 /* local reply can happen with waiters_mutex held */
4407- error = remove_from_waiters_ms (lkb , ms );
4409+ error = remove_from_waiters_ms (lkb , ms , local );
44084410 if (error )
44094411 goto out ;
44104412
4411- __receive_convert_reply (r , lkb , ms );
4413+ __receive_convert_reply (r , lkb , ms , local );
44124414 out :
44134415 unlock_rsb (r );
44144416 put_rsb (r );
@@ -4423,12 +4425,13 @@ static int receive_convert_reply(struct dlm_ls *ls, struct dlm_message *ms)
44234425 if (error )
44244426 return error ;
44254427
4426- _receive_convert_reply (lkb , ms );
4428+ _receive_convert_reply (lkb , ms , false );
44274429 dlm_put_lkb (lkb );
44284430 return 0 ;
44294431}
44304432
4431- static void _receive_unlock_reply (struct dlm_lkb * lkb , struct dlm_message * ms )
4433+ static void _receive_unlock_reply (struct dlm_lkb * lkb , struct dlm_message * ms ,
4434+ bool local )
44324435{
44334436 struct dlm_rsb * r = lkb -> lkb_resource ;
44344437 int error ;
@@ -4441,15 +4444,15 @@ static void _receive_unlock_reply(struct dlm_lkb *lkb, struct dlm_message *ms)
44414444 goto out ;
44424445
44434446 /* local reply can happen with waiters_mutex held */
4444- error = remove_from_waiters_ms (lkb , ms );
4447+ error = remove_from_waiters_ms (lkb , ms , local );
44454448 if (error )
44464449 goto out ;
44474450
44484451 /* this is the value returned from do_unlock() on the master */
44494452
44504453 switch (from_dlm_errno (le32_to_cpu (ms -> m_result ))) {
44514454 case - DLM_EUNLOCK :
4452- receive_flags_reply (lkb , ms );
4455+ receive_flags_reply (lkb , ms , local );
44534456 remove_lock_pc (r , lkb );
44544457 queue_cast (r , lkb , - DLM_EUNLOCK );
44554458 break ;
@@ -4473,12 +4476,13 @@ static int receive_unlock_reply(struct dlm_ls *ls, struct dlm_message *ms)
44734476 if (error )
44744477 return error ;
44754478
4476- _receive_unlock_reply (lkb , ms );
4479+ _receive_unlock_reply (lkb , ms , false );
44774480 dlm_put_lkb (lkb );
44784481 return 0 ;
44794482}
44804483
4481- static void _receive_cancel_reply (struct dlm_lkb * lkb , struct dlm_message * ms )
4484+ static void _receive_cancel_reply (struct dlm_lkb * lkb , struct dlm_message * ms ,
4485+ bool local )
44824486{
44834487 struct dlm_rsb * r = lkb -> lkb_resource ;
44844488 int error ;
@@ -4491,15 +4495,15 @@ static void _receive_cancel_reply(struct dlm_lkb *lkb, struct dlm_message *ms)
44914495 goto out ;
44924496
44934497 /* local reply can happen with waiters_mutex held */
4494- error = remove_from_waiters_ms (lkb , ms );
4498+ error = remove_from_waiters_ms (lkb , ms , local );
44954499 if (error )
44964500 goto out ;
44974501
44984502 /* this is the value returned from do_cancel() on the master */
44994503
45004504 switch (from_dlm_errno (le32_to_cpu (ms -> m_result ))) {
45014505 case - DLM_ECANCEL :
4502- receive_flags_reply (lkb , ms );
4506+ receive_flags_reply (lkb , ms , local );
45034507 revert_lock_pc (r , lkb );
45044508 queue_cast (r , lkb , - DLM_ECANCEL );
45054509 break ;
@@ -4524,7 +4528,7 @@ static int receive_cancel_reply(struct dlm_ls *ls, struct dlm_message *ms)
45244528 if (error )
45254529 return error ;
45264530
4527- _receive_cancel_reply (lkb , ms );
4531+ _receive_cancel_reply (lkb , ms , false );
45284532 dlm_put_lkb (lkb );
45294533 return 0 ;
45304534}
@@ -4839,11 +4843,10 @@ static void recover_convert_waiter(struct dlm_ls *ls, struct dlm_lkb *lkb,
48394843 if (middle_conversion (lkb )) {
48404844 hold_lkb (lkb );
48414845 memset (ms_local , 0 , sizeof (struct dlm_message ));
4842- ms_local -> m_flags = cpu_to_le32 (DLM_IFL_LOCAL_MS );
48434846 ms_local -> m_type = cpu_to_le32 (DLM_MSG_CONVERT_REPLY );
48444847 ms_local -> m_result = cpu_to_le32 (to_dlm_errno (- EINPROGRESS ));
48454848 ms_local -> m_header .h_nodeid = cpu_to_le32 (lkb -> lkb_nodeid );
4846- _receive_convert_reply (lkb , ms_local );
4849+ _receive_convert_reply (lkb , ms_local , true );
48474850
48484851 /* Same special case as in receive_rcom_lock_args() */
48494852 lkb -> lkb_grmode = DLM_LOCK_IV ;
@@ -4961,22 +4964,20 @@ void dlm_recover_waiters_pre(struct dlm_ls *ls)
49614964 case DLM_MSG_UNLOCK :
49624965 hold_lkb (lkb );
49634966 memset (ms_local , 0 , sizeof (struct dlm_message ));
4964- ms_local -> m_flags = cpu_to_le32 (DLM_IFL_LOCAL_MS );
49654967 ms_local -> m_type = cpu_to_le32 (DLM_MSG_UNLOCK_REPLY );
49664968 ms_local -> m_result = cpu_to_le32 (to_dlm_errno (local_unlock_result ));
49674969 ms_local -> m_header .h_nodeid = cpu_to_le32 (lkb -> lkb_nodeid );
4968- _receive_unlock_reply (lkb , ms_local );
4970+ _receive_unlock_reply (lkb , ms_local , true );
49694971 dlm_put_lkb (lkb );
49704972 break ;
49714973
49724974 case DLM_MSG_CANCEL :
49734975 hold_lkb (lkb );
49744976 memset (ms_local , 0 , sizeof (struct dlm_message ));
4975- ms_local -> m_flags = cpu_to_le32 (DLM_IFL_LOCAL_MS );
49764977 ms_local -> m_type = cpu_to_le32 (DLM_MSG_CANCEL_REPLY );
49774978 ms_local -> m_result = cpu_to_le32 (to_dlm_errno (local_cancel_result ));
49784979 ms_local -> m_header .h_nodeid = cpu_to_le32 (lkb -> lkb_nodeid );
4979- _receive_cancel_reply (lkb , ms_local );
4980+ _receive_cancel_reply (lkb , ms_local , true );
49804981 dlm_put_lkb (lkb );
49814982 break ;
49824983
0 commit comments