Skip to content

Commit

Permalink
[DLM] down conversion clearing flags
Browse files Browse the repository at this point in the history
The down-conversion optimization was resulting in the lkb flags being
cleared because the stub message reply had no flags value set.  Copy the
current flags into the stub message so they'll be copied back into the lkb
as part of processing the fake reply.  Also add an assertion to catch this
error more directly if it exists elsewhere.

Signed-off-by: David Teigland <teigland@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
  • Loading branch information
David Teigland authored and Steven Whitehouse committed Aug 23, 2006
1 parent c059f70 commit 32f105a
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 5 deletions.
1 change: 1 addition & 0 deletions fs/dlm/ast.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ void dlm_add_ast(struct dlm_lkb *lkb, int type)
dlm_user_add_ast(lkb, type);
return;
}
DLM_ASSERT(lkb->lkb_astaddr != DLM_FAKE_USER_AST, dlm_print_lkb(lkb););

spin_lock(&ast_queue_lock);
if (!(lkb->lkb_ast_type & (AST_COMP | AST_BAST))) {
Expand Down
2 changes: 2 additions & 0 deletions fs/dlm/dlm_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ struct dlm_mhandle;
} \
}

#define DLM_FAKE_USER_AST ERR_PTR(-EINVAL)


struct dlm_direntry {
struct list_head list;
Expand Down
9 changes: 4 additions & 5 deletions fs/dlm/lock.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,6 @@ static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb,
struct dlm_message *ms);
static int receive_extralen(struct dlm_message *ms);

#define FAKE_USER_AST (void*)0xff00ff00

/*
* Lock compatibilty matrix - thanks Steve
* UN = Unlocked state. Not really a state, used as a flag
Expand Down Expand Up @@ -2195,6 +2193,7 @@ static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb)
if (!error && down_conversion(lkb)) {
remove_from_waiters(lkb);
r->res_ls->ls_stub_ms.m_result = 0;
r->res_ls->ls_stub_ms.m_flags = lkb->lkb_flags;
__receive_convert_reply(r, lkb, &r->res_ls->ls_stub_ms);
}

Expand Down Expand Up @@ -3615,7 +3614,7 @@ int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua,
lock and that lkb_astparam is the dlm_user_args structure. */

error = set_lock_args(mode, &ua->lksb, flags, namelen, parent_lkid,
FAKE_USER_AST, ua, FAKE_USER_AST, &args);
DLM_FAKE_USER_AST, ua, DLM_FAKE_USER_AST, &args);
lkb->lkb_flags |= DLM_IFL_USER;
ua->old_mode = DLM_LOCK_IV;

Expand Down Expand Up @@ -3686,8 +3685,8 @@ int dlm_user_convert(struct dlm_ls *ls, struct dlm_user_args *ua_tmp,
ua->user_lksb = ua_tmp->user_lksb;
ua->old_mode = lkb->lkb_grmode;

error = set_lock_args(mode, &ua->lksb, flags, 0, 0, FAKE_USER_AST, ua,
FAKE_USER_AST, &args);
error = set_lock_args(mode, &ua->lksb, flags, 0, 0, DLM_FAKE_USER_AST,
ua, DLM_FAKE_USER_AST, &args);
if (error)
goto out_put;

Expand Down

0 comments on commit 32f105a

Please sign in to comment.