Commit 755b5eb8 authored by David Teigland's avatar David Teigland

dlm: limit dir lookup loop

In a rare case we may need to repeat a local resource directory lookup
due to a race with removing the rsb and removing the resdir record.
We'll never need to do more than a single additional lookup, though,
so the infinite loop around the lookup can be removed.  In addition
to being unnecessary, the infinite loop is dangerous since some other
unknown condition may appear causing the loop to never break.
Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
parent 42dc1601
...@@ -1851,7 +1851,7 @@ static void send_blocking_asts_all(struct dlm_rsb *r, struct dlm_lkb *lkb) ...@@ -1851,7 +1851,7 @@ static void send_blocking_asts_all(struct dlm_rsb *r, struct dlm_lkb *lkb)
static int set_master(struct dlm_rsb *r, struct dlm_lkb *lkb) static int set_master(struct dlm_rsb *r, struct dlm_lkb *lkb)
{ {
struct dlm_ls *ls = r->res_ls; struct dlm_ls *ls = r->res_ls;
int error, dir_nodeid, ret_nodeid, our_nodeid = dlm_our_nodeid(); int i, error, dir_nodeid, ret_nodeid, our_nodeid = dlm_our_nodeid();
if (rsb_flag(r, RSB_MASTER_UNCERTAIN)) { if (rsb_flag(r, RSB_MASTER_UNCERTAIN)) {
rsb_clear_flag(r, RSB_MASTER_UNCERTAIN); rsb_clear_flag(r, RSB_MASTER_UNCERTAIN);
...@@ -1885,7 +1885,7 @@ static int set_master(struct dlm_rsb *r, struct dlm_lkb *lkb) ...@@ -1885,7 +1885,7 @@ static int set_master(struct dlm_rsb *r, struct dlm_lkb *lkb)
return 1; return 1;
} }
for (;;) { for (i = 0; i < 2; i++) {
/* It's possible for dlm_scand to remove an old rsb for /* It's possible for dlm_scand to remove an old rsb for
this same resource from the toss list, us to create this same resource from the toss list, us to create
a new one, look up the master locally, and find it a new one, look up the master locally, and find it
...@@ -1899,6 +1899,8 @@ static int set_master(struct dlm_rsb *r, struct dlm_lkb *lkb) ...@@ -1899,6 +1899,8 @@ static int set_master(struct dlm_rsb *r, struct dlm_lkb *lkb)
log_debug(ls, "dir_lookup error %d %s", error, r->res_name); log_debug(ls, "dir_lookup error %d %s", error, r->res_name);
schedule(); schedule();
} }
if (error && error != -EEXIST)
return error;
if (ret_nodeid == our_nodeid) { if (ret_nodeid == our_nodeid) {
r->res_first_lkid = 0; r->res_first_lkid = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment