Skip to content

Commit 3a747f4

Browse files
Alexander Aringteigland
authored andcommitted
dlm: move rsb root_list to ls_recover() stack
Move the rsb root_list from the lockspace to a stack variable since it is now only used by the ls_recover() function. Signed-off-by: Alexander Aring <[email protected]> Signed-off-by: David Teigland <[email protected]>
1 parent aff46e0 commit 3a747f4

File tree

9 files changed

+47
-70
lines changed

9 files changed

+47
-70
lines changed

fs/dlm/dir.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,13 @@ int dlm_dir_nodeid(struct dlm_rsb *r)
4747
return r->res_dir_nodeid;
4848
}
4949

50-
void dlm_recover_dir_nodeid(struct dlm_ls *ls)
50+
void dlm_recover_dir_nodeid(struct dlm_ls *ls, const struct list_head *root_list)
5151
{
5252
struct dlm_rsb *r;
5353

54-
down_read(&ls->ls_root_sem);
55-
list_for_each_entry(r, &ls->ls_root_list, res_root_list) {
54+
list_for_each_entry(r, root_list, res_root_list) {
5655
r->res_dir_nodeid = dlm_hash2nodeid(ls, r->res_hash);
5756
}
58-
up_read(&ls->ls_root_sem);
5957
}
6058

6159
int dlm_recover_directory(struct dlm_ls *ls, uint64_t seq)

fs/dlm/dir.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414

1515
int dlm_dir_nodeid(struct dlm_rsb *rsb);
1616
int dlm_hash2nodeid(struct dlm_ls *ls, uint32_t hash);
17-
void dlm_recover_dir_nodeid(struct dlm_ls *ls);
17+
void dlm_recover_dir_nodeid(struct dlm_ls *ls,
18+
const struct list_head *root_list);
1819
int dlm_recover_directory(struct dlm_ls *ls, uint64_t seq);
1920
void dlm_copy_master_names(struct dlm_ls *ls, const char *inbuf, int inlen,
2021
char *outbuf, int outlen, int nodeid);

fs/dlm/dlm_internal.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -674,10 +674,8 @@ struct dlm_ls {
674674
wait_queue_head_t ls_recover_lock_wait;
675675
spinlock_t ls_clear_proc_locks;
676676

677-
struct list_head ls_root_list; /* root resources */
678-
struct rw_semaphore ls_root_sem; /* protect root_list */
679-
struct list_head ls_masters_list; /* root resources */
680-
rwlock_t ls_masters_lock; /* protect root_list */
677+
struct list_head ls_masters_list; /* root resources */
678+
rwlock_t ls_masters_lock; /* protect root_list */
681679

682680
const struct dlm_lockspace_ops *ls_ops;
683681
void *ls_ops_arg;

fs/dlm/lock.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5227,7 +5227,7 @@ static void purge_dead_list(struct dlm_ls *ls, struct dlm_rsb *r,
52275227

52285228
/* Get rid of locks held by nodes that are gone. */
52295229

5230-
void dlm_recover_purge(struct dlm_ls *ls)
5230+
void dlm_recover_purge(struct dlm_ls *ls, const struct list_head *root_list)
52315231
{
52325232
struct dlm_rsb *r;
52335233
struct dlm_member *memb;
@@ -5246,8 +5246,7 @@ void dlm_recover_purge(struct dlm_ls *ls)
52465246
if (!nodes_count)
52475247
return;
52485248

5249-
down_write(&ls->ls_root_sem);
5250-
list_for_each_entry(r, &ls->ls_root_list, res_root_list) {
5249+
list_for_each_entry(r, root_list, res_root_list) {
52515250
hold_rsb(r);
52525251
lock_rsb(r);
52535252
if (is_master(r)) {
@@ -5262,7 +5261,6 @@ void dlm_recover_purge(struct dlm_ls *ls)
52625261
unhold_rsb(r);
52635262
cond_resched();
52645263
}
5265-
up_write(&ls->ls_root_sem);
52665264

52675265
if (lkb_count)
52685266
log_rinfo(ls, "dlm_recover_purge %u locks for %u nodes",

fs/dlm/lock.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ int dlm_master_lookup(struct dlm_ls *ls, int from_nodeid, const char *name,
3131
int dlm_search_rsb_tree(struct rb_root *tree, const void *name, int len,
3232
struct dlm_rsb **r_ret);
3333

34-
void dlm_recover_purge(struct dlm_ls *ls);
34+
void dlm_recover_purge(struct dlm_ls *ls, const struct list_head *root_list);
3535
void dlm_purge_mstcpy_locks(struct dlm_rsb *r);
3636
void dlm_recover_grant(struct dlm_ls *ls);
3737
int dlm_recover_waiters_post(struct dlm_ls *ls);

fs/dlm/lockspace.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -580,8 +580,6 @@ static int new_lockspace(const char *name, const char *cluster,
580580
ls->ls_recover_list_count = 0;
581581
ls->ls_local_handle = ls;
582582
init_waitqueue_head(&ls->ls_wait_general);
583-
INIT_LIST_HEAD(&ls->ls_root_list);
584-
init_rwsem(&ls->ls_root_sem);
585583
INIT_LIST_HEAD(&ls->ls_masters_list);
586584
rwlock_init(&ls->ls_masters_lock);
587585

fs/dlm/recover.c

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,8 @@ static int recover_master_static(struct dlm_rsb *r, unsigned int *count)
519519
* the correct dir node.
520520
*/
521521

522-
int dlm_recover_masters(struct dlm_ls *ls, uint64_t seq)
522+
int dlm_recover_masters(struct dlm_ls *ls, uint64_t seq,
523+
const struct list_head *root_list)
523524
{
524525
struct dlm_rsb *r;
525526
unsigned int total = 0;
@@ -529,10 +530,8 @@ int dlm_recover_masters(struct dlm_ls *ls, uint64_t seq)
529530

530531
log_rinfo(ls, "dlm_recover_masters");
531532

532-
down_read(&ls->ls_root_sem);
533-
list_for_each_entry(r, &ls->ls_root_list, res_root_list) {
533+
list_for_each_entry(r, root_list, res_root_list) {
534534
if (dlm_recovery_stopped(ls)) {
535-
up_read(&ls->ls_root_sem);
536535
error = -EINTR;
537536
goto out;
538537
}
@@ -546,12 +545,9 @@ int dlm_recover_masters(struct dlm_ls *ls, uint64_t seq)
546545
cond_resched();
547546
total++;
548547

549-
if (error) {
550-
up_read(&ls->ls_root_sem);
548+
if (error)
551549
goto out;
552-
}
553550
}
554-
up_read(&ls->ls_root_sem);
555551

556552
log_rinfo(ls, "dlm_recover_masters %u of %u", count, total);
557553

@@ -656,13 +652,13 @@ static int recover_locks(struct dlm_rsb *r, uint64_t seq)
656652
return error;
657653
}
658654

659-
int dlm_recover_locks(struct dlm_ls *ls, uint64_t seq)
655+
int dlm_recover_locks(struct dlm_ls *ls, uint64_t seq,
656+
const struct list_head *root_list)
660657
{
661658
struct dlm_rsb *r;
662659
int error, count = 0;
663660

664-
down_read(&ls->ls_root_sem);
665-
list_for_each_entry(r, &ls->ls_root_list, res_root_list) {
661+
list_for_each_entry(r, root_list, res_root_list) {
666662
if (is_master(r)) {
667663
rsb_clear_flag(r, RSB_NEW_MASTER);
668664
continue;
@@ -673,19 +669,15 @@ int dlm_recover_locks(struct dlm_ls *ls, uint64_t seq)
673669

674670
if (dlm_recovery_stopped(ls)) {
675671
error = -EINTR;
676-
up_read(&ls->ls_root_sem);
677672
goto out;
678673
}
679674

680675
error = recover_locks(r, seq);
681-
if (error) {
682-
up_read(&ls->ls_root_sem);
676+
if (error)
683677
goto out;
684-
}
685678

686679
count += r->res_recover_locks_count;
687680
}
688-
up_read(&ls->ls_root_sem);
689681

690682
log_rinfo(ls, "dlm_recover_locks %d out", count);
691683

@@ -854,13 +846,12 @@ static void recover_grant(struct dlm_rsb *r)
854846
rsb_set_flag(r, RSB_RECOVER_GRANT);
855847
}
856848

857-
void dlm_recover_rsbs(struct dlm_ls *ls)
849+
void dlm_recover_rsbs(struct dlm_ls *ls, const struct list_head *root_list)
858850
{
859851
struct dlm_rsb *r;
860852
unsigned int count = 0;
861853

862-
down_read(&ls->ls_root_sem);
863-
list_for_each_entry(r, &ls->ls_root_list, res_root_list) {
854+
list_for_each_entry(r, root_list, res_root_list) {
864855
lock_rsb(r);
865856
if (is_master(r)) {
866857
if (rsb_flag(r, RSB_RECOVER_CONVERT))
@@ -881,7 +872,6 @@ void dlm_recover_rsbs(struct dlm_ls *ls)
881872
rsb_clear_flag(r, RSB_NEW_MASTER2);
882873
unlock_rsb(r);
883874
}
884-
up_read(&ls->ls_root_sem);
885875

886876
if (count)
887877
log_rinfo(ls, "dlm_recover_rsbs %d done", count);

fs/dlm/recover.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@ int dlm_recover_members_wait(struct dlm_ls *ls, uint64_t seq);
1919
int dlm_recover_directory_wait(struct dlm_ls *ls, uint64_t seq);
2020
int dlm_recover_locks_wait(struct dlm_ls *ls, uint64_t seq);
2121
int dlm_recover_done_wait(struct dlm_ls *ls, uint64_t seq);
22-
int dlm_recover_masters(struct dlm_ls *ls, uint64_t seq);
22+
int dlm_recover_masters(struct dlm_ls *ls, uint64_t seq,
23+
const struct list_head *root_list);
2324
int dlm_recover_master_reply(struct dlm_ls *ls, const struct dlm_rcom *rc);
24-
int dlm_recover_locks(struct dlm_ls *ls, uint64_t seq);
25+
int dlm_recover_locks(struct dlm_ls *ls, uint64_t seq,
26+
const struct list_head *root_list);
2527
void dlm_recovered_lock(struct dlm_rsb *r);
2628
void dlm_clear_toss(struct dlm_ls *ls);
27-
void dlm_recover_rsbs(struct dlm_ls *ls);
29+
void dlm_recover_rsbs(struct dlm_ls *ls, const struct list_head *root_list);
2830

2931
#endif /* __RECOVER_DOT_H__ */
3032

fs/dlm/recoverd.c

Lines changed: 23 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -62,44 +62,34 @@ static void dlm_release_masters_list(struct dlm_ls *ls)
6262
write_unlock(&ls->ls_masters_lock);
6363
}
6464

65-
static void dlm_create_root_list(struct dlm_ls *ls)
65+
static void dlm_create_root_list(struct dlm_ls *ls, struct list_head *root_list)
6666
{
6767
struct rb_node *n;
6868
struct dlm_rsb *r;
6969
int i;
7070

71-
down_write(&ls->ls_root_sem);
72-
if (!list_empty(&ls->ls_root_list)) {
73-
log_error(ls, "root list not empty");
74-
goto out;
75-
}
76-
7771
for (i = 0; i < ls->ls_rsbtbl_size; i++) {
7872
spin_lock_bh(&ls->ls_rsbtbl[i].lock);
7973
for (n = rb_first(&ls->ls_rsbtbl[i].keep); n; n = rb_next(n)) {
8074
r = rb_entry(n, struct dlm_rsb, res_hashnode);
81-
list_add(&r->res_root_list, &ls->ls_root_list);
75+
list_add(&r->res_root_list, root_list);
8276
dlm_hold_rsb(r);
8377
}
8478

8579
if (!RB_EMPTY_ROOT(&ls->ls_rsbtbl[i].toss))
8680
log_error(ls, "%s toss not empty", __func__);
8781
spin_unlock_bh(&ls->ls_rsbtbl[i].lock);
8882
}
89-
out:
90-
up_write(&ls->ls_root_sem);
9183
}
9284

93-
static void dlm_release_root_list(struct dlm_ls *ls)
85+
static void dlm_release_root_list(struct list_head *root_list)
9486
{
9587
struct dlm_rsb *r, *safe;
9688

97-
down_write(&ls->ls_root_sem);
98-
list_for_each_entry_safe(r, safe, &ls->ls_root_list, res_root_list) {
89+
list_for_each_entry_safe(r, safe, root_list, res_root_list) {
9990
list_del_init(&r->res_root_list);
10091
dlm_put_rsb(r);
10192
}
102-
up_write(&ls->ls_root_sem);
10393
}
10494

10595
/* If the start for which we're re-enabling locking (seq) has been superseded
@@ -131,6 +121,7 @@ static int enable_locking(struct dlm_ls *ls, uint64_t seq)
131121

132122
static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
133123
{
124+
LIST_HEAD(root_list);
134125
unsigned long start;
135126
int error, neg = 0;
136127

@@ -147,7 +138,7 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
147138
* routines.
148139
*/
149140

150-
dlm_create_root_list(ls);
141+
dlm_create_root_list(ls, &root_list);
151142

152143
/*
153144
* Add or remove nodes from the lockspace's ls_nodes list.
@@ -163,7 +154,7 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
163154
goto fail;
164155
}
165156

166-
dlm_recover_dir_nodeid(ls);
157+
dlm_recover_dir_nodeid(ls, &root_list);
167158

168159
/* Create a snapshot of all active rsbs were we are the master of.
169160
* During the barrier between dlm_recover_members_wait() and
@@ -179,7 +170,7 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
179170
error = dlm_create_masters_list(ls);
180171
if (error) {
181172
log_rinfo(ls, "dlm_create_masters_list error %d", error);
182-
goto fail;
173+
goto fail_root_list;
183174
}
184175

185176
ls->ls_recover_dir_sent_res = 0;
@@ -192,7 +183,7 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
192183
if (error) {
193184
log_rinfo(ls, "dlm_recover_members_wait error %d", error);
194185
dlm_release_masters_list(ls);
195-
goto fail;
186+
goto fail_root_list;
196187
}
197188

198189
start = jiffies;
@@ -206,7 +197,7 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
206197
if (error) {
207198
log_rinfo(ls, "dlm_recover_directory error %d", error);
208199
dlm_release_masters_list(ls);
209-
goto fail;
200+
goto fail_root_list;
210201
}
211202

212203
dlm_set_recover_status(ls, DLM_RS_DIR);
@@ -215,7 +206,7 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
215206
if (error) {
216207
log_rinfo(ls, "dlm_recover_directory_wait error %d", error);
217208
dlm_release_masters_list(ls);
218-
goto fail;
209+
goto fail_root_list;
219210
}
220211

221212
dlm_release_masters_list(ls);
@@ -233,43 +224,43 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
233224

234225
if (dlm_recovery_stopped(ls)) {
235226
error = -EINTR;
236-
goto fail;
227+
goto fail_root_list;
237228
}
238229

239230
if (neg || dlm_no_directory(ls)) {
240231
/*
241232
* Clear lkb's for departed nodes.
242233
*/
243234

244-
dlm_recover_purge(ls);
235+
dlm_recover_purge(ls, &root_list);
245236

246237
/*
247238
* Get new master nodeid's for rsb's that were mastered on
248239
* departed nodes.
249240
*/
250241

251-
error = dlm_recover_masters(ls, rv->seq);
242+
error = dlm_recover_masters(ls, rv->seq, &root_list);
252243
if (error) {
253244
log_rinfo(ls, "dlm_recover_masters error %d", error);
254-
goto fail;
245+
goto fail_root_list;
255246
}
256247

257248
/*
258249
* Send our locks on remastered rsb's to the new masters.
259250
*/
260251

261-
error = dlm_recover_locks(ls, rv->seq);
252+
error = dlm_recover_locks(ls, rv->seq, &root_list);
262253
if (error) {
263254
log_rinfo(ls, "dlm_recover_locks error %d", error);
264-
goto fail;
255+
goto fail_root_list;
265256
}
266257

267258
dlm_set_recover_status(ls, DLM_RS_LOCKS);
268259

269260
error = dlm_recover_locks_wait(ls, rv->seq);
270261
if (error) {
271262
log_rinfo(ls, "dlm_recover_locks_wait error %d", error);
272-
goto fail;
263+
goto fail_root_list;
273264
}
274265

275266
log_rinfo(ls, "dlm_recover_locks %u in",
@@ -281,7 +272,7 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
281272
* settings.
282273
*/
283274

284-
dlm_recover_rsbs(ls);
275+
dlm_recover_rsbs(ls, &root_list);
285276
} else {
286277
/*
287278
* Other lockspace members may be going through the "neg" steps
@@ -293,11 +284,11 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
293284
error = dlm_recover_locks_wait(ls, rv->seq);
294285
if (error) {
295286
log_rinfo(ls, "dlm_recover_locks_wait error %d", error);
296-
goto fail;
287+
goto fail_root_list;
297288
}
298289
}
299290

300-
dlm_release_root_list(ls);
291+
dlm_release_root_list(&root_list);
301292

302293
/*
303294
* Purge directory-related requests that are saved in requestqueue.
@@ -346,8 +337,9 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv)
346337

347338
return 0;
348339

340+
fail_root_list:
341+
dlm_release_root_list(&root_list);
349342
fail:
350-
dlm_release_root_list(ls);
351343
mutex_unlock(&ls->ls_recoverd_active);
352344

353345
return error;

0 commit comments

Comments
 (0)