Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 38682
b: refs/heads/master
c: 97a35d1
h: refs/heads/master
v: v3
  • Loading branch information
David Teigland authored and Steven Whitehouse committed May 2, 2006
1 parent c4f22a0 commit a6b4332
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 16 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d2d7b8a2a756fb520792ca3db3abdeed9214ae5b
refs/heads/master: 97a35d1e5fab9ff8de27814082b78b2fc9ad94f0
1 change: 1 addition & 0 deletions trunk/fs/dlm/dlm_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,7 @@ enum rsb_flags {
RSB_NEW_MASTER,
RSB_NEW_MASTER2,
RSB_RECOVER_CONVERT,
RSB_LOCKS_PURGED,
};

static inline void rsb_set_flag(struct dlm_rsb *r, enum rsb_flags flag)
Expand Down
42 changes: 28 additions & 14 deletions trunk/fs/dlm/lock.c
Original file line number Diff line number Diff line change
Expand Up @@ -3278,6 +3278,7 @@ static void purge_queue(struct dlm_rsb *r, struct list_head *queue,

list_for_each_entry_safe(lkb, safe, queue, lkb_statequeue) {
if (test(ls, lkb)) {
rsb_set_flag(r, RSB_LOCKS_PURGED);
del_lkb(r, lkb);
/* this put should free the lkb */
if (!dlm_put_lkb(lkb))
Expand Down Expand Up @@ -3334,27 +3335,40 @@ int dlm_purge_locks(struct dlm_ls *ls)
return 0;
}

int dlm_grant_after_purge(struct dlm_ls *ls)
static struct dlm_rsb *find_purged_rsb(struct dlm_ls *ls, int bucket)
{
struct dlm_rsb *r, *r_ret = NULL;

read_lock(&ls->ls_rsbtbl[bucket].lock);
list_for_each_entry(r, &ls->ls_rsbtbl[bucket].list, res_hashchain) {
if (!rsb_flag(r, RSB_LOCKS_PURGED))
continue;
hold_rsb(r);
rsb_clear_flag(r, RSB_LOCKS_PURGED);
r_ret = r;
break;
}
read_unlock(&ls->ls_rsbtbl[bucket].lock);
return r_ret;
}

void dlm_grant_after_purge(struct dlm_ls *ls)
{
struct dlm_rsb *r;
int i;

for (i = 0; i < ls->ls_rsbtbl_size; i++) {
read_lock(&ls->ls_rsbtbl[i].lock);
list_for_each_entry(r, &ls->ls_rsbtbl[i].list, res_hashchain) {
hold_rsb(r);
lock_rsb(r);
if (is_master(r)) {
grant_pending_locks(r);
confirm_master(r, 0);
}
unlock_rsb(r);
put_rsb(r);
r = find_purged_rsb(ls, i);
if (!r)
continue;
lock_rsb(r);
if (is_master(r)) {
grant_pending_locks(r);
confirm_master(r, 0);
}
read_unlock(&ls->ls_rsbtbl[i].lock);
unlock_rsb(r);
put_rsb(r);
}

return 0;
}

static struct dlm_lkb *search_remid_list(struct list_head *head, int nodeid,
Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/dlm/lock.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ void dlm_scan_rsbs(struct dlm_ls *ls);

int dlm_purge_locks(struct dlm_ls *ls);
void dlm_purge_mstcpy_locks(struct dlm_rsb *r);
int dlm_grant_after_purge(struct dlm_ls *ls);
void dlm_grant_after_purge(struct dlm_ls *ls);
int dlm_recover_waiters_post(struct dlm_ls *ls);
void dlm_recover_waiters_pre(struct dlm_ls *ls);
int dlm_recover_master_copy(struct dlm_ls *ls, struct dlm_rcom *rc);
Expand Down

0 comments on commit a6b4332

Please sign in to comment.