]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
[DLM] down conversion clearing flags
authorDavid Teigland <teigland@redhat.com>
Wed, 23 Aug 2006 20:07:31 +0000 (16:07 -0400)
committerSteven Whitehouse <swhiteho@redhat.com>
Wed, 23 Aug 2006 20:07:31 +0000 (16:07 -0400)
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>
fs/dlm/ast.c
fs/dlm/dlm_internal.h
fs/dlm/lock.c

index a211330cbc422ec2850211fbe72024c4cf05c1cb..f91d39cb1e0bd06e77d0a62b90c87840ca2bba07 100644 (file)
@@ -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))) {
index da7509986699ff2306866c4d6c18575ed664f5ac..1e5cd67e1b7ad27c36c8fb9b243547272c41403b 100644 (file)
@@ -91,6 +91,8 @@ struct dlm_mhandle;
   } \
 }
 
+#define DLM_FAKE_USER_AST ERR_PTR(-EINVAL)
+
 
 struct dlm_direntry {
        struct list_head        list;
index 6dcd475826c185e21ae7512ee3819d411703bc21..67247f0b508a5fe2de76c90283baff19c54cff24 100644 (file)
@@ -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;