aboutsummaryrefslogtreecommitdiffstats
path: root/fs/dlm
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 /fs/dlm
parentc059f70e357af1adcfc1a9294e44cdd945adb841 (diff)
[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>
Diffstat (limited to 'fs/dlm')
-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 a211330cbc42..f91d39cb1e0b 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)
38 dlm_user_add_ast(lkb, type); 38 dlm_user_add_ast(lkb, type);
39 return; 39 return;
40 } 40 }
41 DLM_ASSERT(lkb->lkb_astaddr != DLM_FAKE_USER_AST, dlm_print_lkb(lkb););
41 42
42 spin_lock(&ast_queue_lock); 43 spin_lock(&ast_queue_lock);
43 if (!(lkb->lkb_ast_type & (AST_COMP | AST_BAST))) { 44 if (!(lkb->lkb_ast_type & (AST_COMP | AST_BAST))) {
diff --git a/fs/dlm/dlm_internal.h b/fs/dlm/dlm_internal.h
index da7509986699..1e5cd67e1b7a 100644
--- a/fs/dlm/dlm_internal.h
+++ b/fs/dlm/dlm_internal.h
@@ -91,6 +91,8 @@ struct dlm_mhandle;
91 } \ 91 } \
92} 92}
93 93
94#define DLM_FAKE_USER_AST ERR_PTR(-EINVAL)
95
94 96
95struct dlm_direntry { 97struct dlm_direntry {
96 struct list_head list; 98 struct list_head list;
diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c
index 6dcd475826c1..67247f0b508a 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,
86 struct dlm_message *ms); 86 struct dlm_message *ms);
87static int receive_extralen(struct dlm_message *ms); 87static int receive_extralen(struct dlm_message *ms);
88 88
89#define FAKE_USER_AST (void*)0xff00ff00
90
91/* 89/*
92 * Lock compatibilty matrix - thanks Steve 90 * Lock compatibilty matrix - thanks Steve
93 * UN = Unlocked state. Not really a state, used as a flag 91 * 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)
2195 if (!error && down_conversion(lkb)) { 2193 if (!error && down_conversion(lkb)) {
2196 remove_from_waiters(lkb); 2194 remove_from_waiters(lkb);
2197 r->res_ls->ls_stub_ms.m_result = 0; 2195 r->res_ls->ls_stub_ms.m_result = 0;
2196 r->res_ls->ls_stub_ms.m_flags = lkb->lkb_flags;
2198 __receive_convert_reply(r, lkb, &r->res_ls->ls_stub_ms); 2197 __receive_convert_reply(r, lkb, &r->res_ls->ls_stub_ms);
2199 } 2198 }
2200 2199
@@ -3615,7 +3614,7 @@ int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua,
3615 lock and that lkb_astparam is the dlm_user_args structure. */ 3614 lock and that lkb_astparam is the dlm_user_args structure. */
3616 3615
3617 error = set_lock_args(mode, &ua->lksb, flags, namelen, parent_lkid, 3616 error = set_lock_args(mode, &ua->lksb, flags, namelen, parent_lkid,
3618 FAKE_USER_AST, ua, FAKE_USER_AST, &args); 3617 DLM_FAKE_USER_AST, ua, DLM_FAKE_USER_AST, &args);
3619 lkb->lkb_flags |= DLM_IFL_USER; 3618 lkb->lkb_flags |= DLM_IFL_USER;
3620 ua->old_mode = DLM_LOCK_IV; 3619 ua->old_mode = DLM_LOCK_IV;
3621 3620
@@ -3686,8 +3685,8 @@ int dlm_user_convert(struct dlm_ls *ls, struct dlm_user_args *ua_tmp,
3686 ua->user_lksb = ua_tmp->user_lksb; 3685 ua->user_lksb = ua_tmp->user_lksb;
3687 ua->old_mode = lkb->lkb_grmode; 3686 ua->old_mode = lkb->lkb_grmode;
3688 3687
3689 error = set_lock_args(mode, &ua->lksb, flags, 0, 0, FAKE_USER_AST, ua, 3688 error = set_lock_args(mode, &ua->lksb, flags, 0, 0, DLM_FAKE_USER_AST,
3690 FAKE_USER_AST, &args); 3689 ua, DLM_FAKE_USER_AST, &args);
3691 if (error) 3690 if (error)
3692 goto out_put; 3691 goto out_put;
3693 3692