@@ -28,7 +28,8 @@ static int rcom_response(struct dlm_ls *ls)
2828}
2929
3030static void _create_rcom (struct dlm_ls * ls , int to_nodeid , int type , int len ,
31- struct dlm_rcom * * rc_ret , char * mb , int mb_len )
31+ struct dlm_rcom * * rc_ret , char * mb , int mb_len ,
32+ uint64_t seq )
3233{
3334 struct dlm_rcom * rc ;
3435
@@ -41,16 +42,14 @@ static void _create_rcom(struct dlm_ls *ls, int to_nodeid, int type, int len,
4142 rc -> rc_header .h_cmd = DLM_RCOM ;
4243
4344 rc -> rc_type = cpu_to_le32 (type );
44-
45- spin_lock (& ls -> ls_recover_lock );
46- rc -> rc_seq = cpu_to_le64 (ls -> ls_recover_seq );
47- spin_unlock (& ls -> ls_recover_lock );
45+ rc -> rc_seq = cpu_to_le64 (seq );
4846
4947 * rc_ret = rc ;
5048}
5149
5250static int create_rcom (struct dlm_ls * ls , int to_nodeid , int type , int len ,
53- struct dlm_rcom * * rc_ret , struct dlm_mhandle * * mh_ret )
51+ struct dlm_rcom * * rc_ret , struct dlm_mhandle * * mh_ret ,
52+ uint64_t seq )
5453{
5554 int mb_len = sizeof (struct dlm_rcom ) + len ;
5655 struct dlm_mhandle * mh ;
@@ -63,14 +62,14 @@ static int create_rcom(struct dlm_ls *ls, int to_nodeid, int type, int len,
6362 return - ENOBUFS ;
6463 }
6564
66- _create_rcom (ls , to_nodeid , type , len , rc_ret , mb , mb_len );
65+ _create_rcom (ls , to_nodeid , type , len , rc_ret , mb , mb_len , seq );
6766 * mh_ret = mh ;
6867 return 0 ;
6968}
7069
7170static int create_rcom_stateless (struct dlm_ls * ls , int to_nodeid , int type ,
7271 int len , struct dlm_rcom * * rc_ret ,
73- struct dlm_msg * * msg_ret )
72+ struct dlm_msg * * msg_ret , uint64_t seq )
7473{
7574 int mb_len = sizeof (struct dlm_rcom ) + len ;
7675 struct dlm_msg * msg ;
@@ -84,7 +83,7 @@ static int create_rcom_stateless(struct dlm_ls *ls, int to_nodeid, int type,
8483 return - ENOBUFS ;
8584 }
8685
87- _create_rcom (ls , to_nodeid , type , len , rc_ret , mb , mb_len );
86+ _create_rcom (ls , to_nodeid , type , len , rc_ret , mb , mb_len , seq );
8887 * msg_ret = msg ;
8988 return 0 ;
9089}
@@ -170,7 +169,8 @@ static void disallow_sync_reply(struct dlm_ls *ls)
170169 * node's rcom_config.
171170 */
172171
173- int dlm_rcom_status (struct dlm_ls * ls , int nodeid , uint32_t status_flags )
172+ int dlm_rcom_status (struct dlm_ls * ls , int nodeid , uint32_t status_flags ,
173+ uint64_t seq )
174174{
175175 struct dlm_rcom * rc ;
176176 struct dlm_msg * msg ;
@@ -186,7 +186,8 @@ int dlm_rcom_status(struct dlm_ls *ls, int nodeid, uint32_t status_flags)
186186
187187retry :
188188 error = create_rcom_stateless (ls , nodeid , DLM_RCOM_STATUS ,
189- sizeof (struct rcom_status ), & rc , & msg );
189+ sizeof (struct rcom_status ), & rc , & msg ,
190+ seq );
190191 if (error )
191192 goto out ;
192193
@@ -220,7 +221,8 @@ int dlm_rcom_status(struct dlm_ls *ls, int nodeid, uint32_t status_flags)
220221 return error ;
221222}
222223
223- static void receive_rcom_status (struct dlm_ls * ls , struct dlm_rcom * rc_in )
224+ static void receive_rcom_status (struct dlm_ls * ls , struct dlm_rcom * rc_in ,
225+ uint64_t seq )
224226{
225227 struct dlm_rcom * rc ;
226228 struct rcom_status * rs ;
@@ -251,7 +253,7 @@ static void receive_rcom_status(struct dlm_ls *ls, struct dlm_rcom *rc_in)
251253
252254 do_create :
253255 error = create_rcom_stateless (ls , nodeid , DLM_RCOM_STATUS_REPLY ,
254- len , & rc , & msg );
256+ len , & rc , & msg , seq );
255257 if (error )
256258 return ;
257259
@@ -302,7 +304,8 @@ static void receive_sync_reply(struct dlm_ls *ls, struct dlm_rcom *rc_in)
302304 spin_unlock (& ls -> ls_rcom_spin );
303305}
304306
305- int dlm_rcom_names (struct dlm_ls * ls , int nodeid , char * last_name , int last_len )
307+ int dlm_rcom_names (struct dlm_ls * ls , int nodeid , char * last_name ,
308+ int last_len , uint64_t seq )
306309{
307310 struct dlm_rcom * rc ;
308311 struct dlm_msg * msg ;
@@ -312,7 +315,7 @@ int dlm_rcom_names(struct dlm_ls *ls, int nodeid, char *last_name, int last_len)
312315
313316retry :
314317 error = create_rcom_stateless (ls , nodeid , DLM_RCOM_NAMES , last_len ,
315- & rc , & msg );
318+ & rc , & msg , seq );
316319 if (error )
317320 goto out ;
318321 memcpy (rc -> rc_buf , last_name , last_len );
@@ -330,7 +333,8 @@ int dlm_rcom_names(struct dlm_ls *ls, int nodeid, char *last_name, int last_len)
330333 return error ;
331334}
332335
333- static void receive_rcom_names (struct dlm_ls * ls , struct dlm_rcom * rc_in )
336+ static void receive_rcom_names (struct dlm_ls * ls , struct dlm_rcom * rc_in ,
337+ uint64_t seq )
334338{
335339 struct dlm_rcom * rc ;
336340 int error , inlen , outlen , nodeid ;
@@ -342,7 +346,7 @@ static void receive_rcom_names(struct dlm_ls *ls, struct dlm_rcom *rc_in)
342346 outlen = DLM_MAX_APP_BUFSIZE - sizeof (struct dlm_rcom );
343347
344348 error = create_rcom_stateless (ls , nodeid , DLM_RCOM_NAMES_REPLY , outlen ,
345- & rc , & msg );
349+ & rc , & msg , seq );
346350 if (error )
347351 return ;
348352 rc -> rc_id = rc_in -> rc_id ;
@@ -353,15 +357,15 @@ static void receive_rcom_names(struct dlm_ls *ls, struct dlm_rcom *rc_in)
353357 send_rcom_stateless (msg , rc );
354358}
355359
356- int dlm_send_rcom_lookup (struct dlm_rsb * r , int dir_nodeid )
360+ int dlm_send_rcom_lookup (struct dlm_rsb * r , int dir_nodeid , uint64_t seq )
357361{
358362 struct dlm_rcom * rc ;
359363 struct dlm_mhandle * mh ;
360364 struct dlm_ls * ls = r -> res_ls ;
361365 int error ;
362366
363367 error = create_rcom (ls , dir_nodeid , DLM_RCOM_LOOKUP , r -> res_length ,
364- & rc , & mh );
368+ & rc , & mh , seq );
365369 if (error )
366370 goto out ;
367371 memcpy (rc -> rc_buf , r -> res_name , r -> res_length );
@@ -372,7 +376,8 @@ int dlm_send_rcom_lookup(struct dlm_rsb *r, int dir_nodeid)
372376 return error ;
373377}
374378
375- static void receive_rcom_lookup (struct dlm_ls * ls , struct dlm_rcom * rc_in )
379+ static void receive_rcom_lookup (struct dlm_ls * ls , struct dlm_rcom * rc_in ,
380+ uint64_t seq )
376381{
377382 struct dlm_rcom * rc ;
378383 struct dlm_mhandle * mh ;
@@ -387,7 +392,8 @@ static void receive_rcom_lookup(struct dlm_ls *ls, struct dlm_rcom *rc_in)
387392 return ;
388393 }
389394
390- error = create_rcom (ls , nodeid , DLM_RCOM_LOOKUP_REPLY , 0 , & rc , & mh );
395+ error = create_rcom (ls , nodeid , DLM_RCOM_LOOKUP_REPLY , 0 , & rc , & mh ,
396+ seq );
391397 if (error )
392398 return ;
393399
@@ -437,7 +443,7 @@ static void pack_rcom_lock(struct dlm_rsb *r, struct dlm_lkb *lkb,
437443 memcpy (rl -> rl_lvb , lkb -> lkb_lvbptr , r -> res_ls -> ls_lvblen );
438444}
439445
440- int dlm_send_rcom_lock (struct dlm_rsb * r , struct dlm_lkb * lkb )
446+ int dlm_send_rcom_lock (struct dlm_rsb * r , struct dlm_lkb * lkb , uint64_t seq )
441447{
442448 struct dlm_ls * ls = r -> res_ls ;
443449 struct dlm_rcom * rc ;
@@ -448,7 +454,8 @@ int dlm_send_rcom_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
448454 if (lkb -> lkb_lvbptr )
449455 len += ls -> ls_lvblen ;
450456
451- error = create_rcom (ls , r -> res_nodeid , DLM_RCOM_LOCK , len , & rc , & mh );
457+ error = create_rcom (ls , r -> res_nodeid , DLM_RCOM_LOCK , len , & rc , & mh ,
458+ seq );
452459 if (error )
453460 goto out ;
454461
@@ -462,7 +469,8 @@ int dlm_send_rcom_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
462469}
463470
464471/* needs at least dlm_rcom + rcom_lock */
465- static void receive_rcom_lock (struct dlm_ls * ls , struct dlm_rcom * rc_in )
472+ static void receive_rcom_lock (struct dlm_ls * ls , struct dlm_rcom * rc_in ,
473+ uint64_t seq )
466474{
467475 struct dlm_rcom * rc ;
468476 struct dlm_mhandle * mh ;
@@ -471,7 +479,7 @@ static void receive_rcom_lock(struct dlm_ls *ls, struct dlm_rcom *rc_in)
471479 dlm_recover_master_copy (ls , rc_in );
472480
473481 error = create_rcom (ls , nodeid , DLM_RCOM_LOCK_REPLY ,
474- sizeof (struct rcom_lock ), & rc , & mh );
482+ sizeof (struct rcom_lock ), & rc , & mh , seq );
475483 if (error )
476484 return ;
477485
@@ -620,21 +628,21 @@ void dlm_receive_rcom(struct dlm_ls *ls, struct dlm_rcom *rc, int nodeid)
620628
621629 switch (rc -> rc_type ) {
622630 case cpu_to_le32 (DLM_RCOM_STATUS ):
623- receive_rcom_status (ls , rc );
631+ receive_rcom_status (ls , rc , seq );
624632 break ;
625633
626634 case cpu_to_le32 (DLM_RCOM_NAMES ):
627- receive_rcom_names (ls , rc );
635+ receive_rcom_names (ls , rc , seq );
628636 break ;
629637
630638 case cpu_to_le32 (DLM_RCOM_LOOKUP ):
631- receive_rcom_lookup (ls , rc );
639+ receive_rcom_lookup (ls , rc , seq );
632640 break ;
633641
634642 case cpu_to_le32 (DLM_RCOM_LOCK ):
635643 if (le16_to_cpu (rc -> rc_header .h_length ) < lock_size )
636644 goto Eshort ;
637- receive_rcom_lock (ls , rc );
645+ receive_rcom_lock (ls , rc , seq );
638646 break ;
639647
640648 case cpu_to_le32 (DLM_RCOM_STATUS_REPLY ):
@@ -652,7 +660,7 @@ void dlm_receive_rcom(struct dlm_ls *ls, struct dlm_rcom *rc, int nodeid)
652660 case cpu_to_le32 (DLM_RCOM_LOCK_REPLY ):
653661 if (le16_to_cpu (rc -> rc_header .h_length ) < lock_size )
654662 goto Eshort ;
655- dlm_recover_process_copy (ls , rc );
663+ dlm_recover_process_copy (ls , rc , seq );
656664 break ;
657665
658666 default :
0 commit comments