summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2006-08-23 16:07:31 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2006-08-23 16:07:31 -0400
commit32f105a123804c7882d447f013aeb3530b4d63c0 (patch)
tree8e8006aa63fc31290d3cd1bc5e93b9cd3f9580d7
parentc059f70e357af1adcfc1a9294e44cdd945adb841 (diff)
downloadlinux-3.10-32f105a123804c7882d447f013aeb3530b4d63c0.tar.gz
linux-3.10-32f105a123804c7882d447f013aeb3530b4d63c0.tar.bz2
linux-3.10-32f105a123804c7882d447f013aeb3530b4d63c0.zip
[DLM] down conversion clearing flags
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>
-rw-r--r--fs/dlm/ast.c1
-rw-r--r--fs/dlm/dlm_internal.h2
-rw-r--r--fs/dlm/lock.c9
3 files changed, 7 insertions, 5 deletions
diff --git a/fs/dlm/ast.c b/fs/dlm/ast.c
index a211330cbc4..f91d39cb1e0 100644
--- a/fs/dlm/ast.c
+++ b/fs/dlm/ast.c
@@ -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))) {
diff --git a/fs/dlm/dlm_internal.h b/fs/dlm/dlm_internal.h
index da750998669..1e5cd67e1b7 100644
--- a/fs/dlm/dlm_internal.h
+++ b/fs/dlm/dlm_internal.h
@@ -91,6 +91,8 @@ struct dlm_mhandle;
} \
}
+#define DLM_FAKE_USER_AST ERR_PTR(-EINVAL)
+
struct dlm_direntry {
struct list_head list;
diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c
index 6dcd475826c..67247f0b508 100644
--- a/fs/dlm/lock.c
+++ b/fs/dlm/lock.c
@@ -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
@@ -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);
}
@@ -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;
@@ -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;