Skip to content

Commit c4f4e13

Browse files
Alexander Aringteigland
authored andcommitted
fs: dlm: get recovery sequence number as parameter
This patch removes a read of the ls->ls_recover_seq uint64_t number in _create_rcom(). If the ls->ls_recover_seq is readed the ls_recover_lock need to held. However this number was always readed before when any rcom message is received and it's not necessary to read it again from a per lockspace variable to use it for the replying message. This patch will pass the sequence number as parameter so another read of ls->ls_recover_seq and holding the ls->ls_recover_lock is not required. Signed-off-by: Alexander Aring <[email protected]> Signed-off-by: David Teigland <[email protected]>
1 parent 643f5cf commit c4f4e13

File tree

10 files changed

+99
-85
lines changed

10 files changed

+99
-85
lines changed

fs/dlm/dir.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void dlm_recover_dir_nodeid(struct dlm_ls *ls)
5858
up_read(&ls->ls_root_sem);
5959
}
6060

61-
int dlm_recover_directory(struct dlm_ls *ls)
61+
int dlm_recover_directory(struct dlm_ls *ls, uint64_t seq)
6262
{
6363
struct dlm_member *memb;
6464
char *b, *last_name = NULL;
@@ -90,7 +90,7 @@ int dlm_recover_directory(struct dlm_ls *ls)
9090
}
9191

9292
error = dlm_rcom_names(ls, memb->nodeid,
93-
last_name, last_len);
93+
last_name, last_len, seq);
9494
if (error)
9595
goto out_free;
9696

fs/dlm/dir.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
int dlm_dir_nodeid(struct dlm_rsb *rsb);
1616
int dlm_hash2nodeid(struct dlm_ls *ls, uint32_t hash);
1717
void dlm_recover_dir_nodeid(struct dlm_ls *ls);
18-
int dlm_recover_directory(struct dlm_ls *ls);
18+
int dlm_recover_directory(struct dlm_ls *ls, uint64_t seq);
1919
void dlm_copy_master_names(struct dlm_ls *ls, char *inbuf, int inlen,
2020
char *outbuf, int outlen, int nodeid);
2121

fs/dlm/lock.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5464,7 +5464,8 @@ int dlm_recover_master_copy(struct dlm_ls *ls, struct dlm_rcom *rc)
54645464
}
54655465

54665466
/* needs at least dlm_rcom + rcom_lock */
5467-
int dlm_recover_process_copy(struct dlm_ls *ls, struct dlm_rcom *rc)
5467+
int dlm_recover_process_copy(struct dlm_ls *ls, struct dlm_rcom *rc,
5468+
uint64_t seq)
54685469
{
54695470
struct rcom_lock *rl = (struct rcom_lock *) rc->rc_buf;
54705471
struct dlm_rsb *r;
@@ -5509,7 +5510,7 @@ int dlm_recover_process_copy(struct dlm_ls *ls, struct dlm_rcom *rc)
55095510
lkid, le32_to_cpu(rc->rc_header.h_nodeid), remid,
55105511
result);
55115512

5512-
dlm_send_rcom_lock(r, lkb);
5513+
dlm_send_rcom_lock(r, lkb, seq);
55135514
goto out;
55145515
case -EEXIST:
55155516
case 0:

fs/dlm/lock.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ void dlm_recover_grant(struct dlm_ls *ls);
3737
int dlm_recover_waiters_post(struct dlm_ls *ls);
3838
void dlm_recover_waiters_pre(struct dlm_ls *ls);
3939
int dlm_recover_master_copy(struct dlm_ls *ls, struct dlm_rcom *rc);
40-
int dlm_recover_process_copy(struct dlm_ls *ls, struct dlm_rcom *rc);
40+
int dlm_recover_process_copy(struct dlm_ls *ls, struct dlm_rcom *rc,
41+
uint64_t seq);
4142

4243
int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua, int mode,
4344
uint32_t flags, void *name, unsigned int namelen);

fs/dlm/member.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ static void make_member_array(struct dlm_ls *ls)
449449

450450
/* send a status request to all members just to establish comms connections */
451451

452-
static int ping_members(struct dlm_ls *ls)
452+
static int ping_members(struct dlm_ls *ls, uint64_t seq)
453453
{
454454
struct dlm_member *memb;
455455
int error = 0;
@@ -459,7 +459,7 @@ static int ping_members(struct dlm_ls *ls)
459459
error = -EINTR;
460460
break;
461461
}
462-
error = dlm_rcom_status(ls, memb->nodeid, 0);
462+
error = dlm_rcom_status(ls, memb->nodeid, 0, seq);
463463
if (error)
464464
break;
465465
}
@@ -607,7 +607,7 @@ int dlm_recover_members(struct dlm_ls *ls, struct dlm_recover *rv, int *neg_out)
607607
make_member_array(ls);
608608
*neg_out = neg;
609609

610-
error = ping_members(ls);
610+
error = ping_members(ls, rv->seq);
611611
log_rinfo(ls, "dlm_recover_members %d nodes", ls->ls_num_nodes);
612612
return error;
613613
}

fs/dlm/rcom.c

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ static int rcom_response(struct dlm_ls *ls)
2828
}
2929

3030
static 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

5250
static 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

7170
static 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

187187
retry:
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

313316
retry:
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:

fs/dlm/rcom.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@
1212
#ifndef __RCOM_DOT_H__
1313
#define __RCOM_DOT_H__
1414

15-
int dlm_rcom_status(struct dlm_ls *ls, int nodeid, uint32_t status_flags);
16-
int dlm_rcom_names(struct dlm_ls *ls, int nodeid, char *last_name,int last_len);
17-
int dlm_send_rcom_lookup(struct dlm_rsb *r, int dir_nodeid);
18-
int dlm_send_rcom_lock(struct dlm_rsb *r, struct dlm_lkb *lkb);
15+
int dlm_rcom_status(struct dlm_ls *ls, int nodeid, uint32_t status_flags,
16+
uint64_t seq);
17+
int dlm_rcom_names(struct dlm_ls *ls, int nodeid, char *last_name,
18+
int last_len, uint64_t seq);
19+
int dlm_send_rcom_lookup(struct dlm_rsb *r, int dir_nodeid, uint64_t seq);
20+
int dlm_send_rcom_lock(struct dlm_rsb *r, struct dlm_lkb *lkb, uint64_t seq);
1921
void dlm_receive_rcom(struct dlm_ls *ls, struct dlm_rcom *rc, int nodeid);
2022
int dlm_send_ls_not_ready(int nodeid, struct dlm_rcom *rc_in);
2123

0 commit comments

Comments
 (0)