diff options
Diffstat (limited to 'fs/dlm/lock.c')
-rw-r--r-- | fs/dlm/lock.c | 38 |
1 files changed, 17 insertions, 21 deletions
diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c index 64e5f3efdd81..04b8c449303f 100644 --- a/fs/dlm/lock.c +++ b/fs/dlm/lock.c | |||
@@ -160,10 +160,10 @@ static const int __quecvt_compat_matrix[8][8] = { | |||
160 | void dlm_print_lkb(struct dlm_lkb *lkb) | 160 | void dlm_print_lkb(struct dlm_lkb *lkb) |
161 | { | 161 | { |
162 | printk(KERN_ERR "lkb: nodeid %d id %x remid %x exflags %x flags %x\n" | 162 | printk(KERN_ERR "lkb: nodeid %d id %x remid %x exflags %x flags %x\n" |
163 | " status %d rqmode %d grmode %d wait_type %d ast_type %d\n", | 163 | " status %d rqmode %d grmode %d wait_type %d\n", |
164 | lkb->lkb_nodeid, lkb->lkb_id, lkb->lkb_remid, lkb->lkb_exflags, | 164 | lkb->lkb_nodeid, lkb->lkb_id, lkb->lkb_remid, lkb->lkb_exflags, |
165 | lkb->lkb_flags, lkb->lkb_status, lkb->lkb_rqmode, | 165 | lkb->lkb_flags, lkb->lkb_status, lkb->lkb_rqmode, |
166 | lkb->lkb_grmode, lkb->lkb_wait_type, lkb->lkb_ast_type); | 166 | lkb->lkb_grmode, lkb->lkb_wait_type); |
167 | } | 167 | } |
168 | 168 | ||
169 | static void dlm_print_rsb(struct dlm_rsb *r) | 169 | static void dlm_print_rsb(struct dlm_rsb *r) |
@@ -305,10 +305,7 @@ static void queue_cast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) | |||
305 | rv = -EDEADLK; | 305 | rv = -EDEADLK; |
306 | } | 306 | } |
307 | 307 | ||
308 | lkb->lkb_lksb->sb_status = rv; | 308 | dlm_add_ast(lkb, DLM_CB_CAST, lkb->lkb_grmode, rv, lkb->lkb_sbflags); |
309 | lkb->lkb_lksb->sb_flags = lkb->lkb_sbflags; | ||
310 | |||
311 | dlm_add_ast(lkb, AST_COMP, lkb->lkb_grmode); | ||
312 | } | 309 | } |
313 | 310 | ||
314 | static inline void queue_cast_overlap(struct dlm_rsb *r, struct dlm_lkb *lkb) | 311 | static inline void queue_cast_overlap(struct dlm_rsb *r, struct dlm_lkb *lkb) |
@@ -319,13 +316,10 @@ static inline void queue_cast_overlap(struct dlm_rsb *r, struct dlm_lkb *lkb) | |||
319 | 316 | ||
320 | static void queue_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rqmode) | 317 | static void queue_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rqmode) |
321 | { | 318 | { |
322 | lkb->lkb_time_bast = ktime_get(); | ||
323 | |||
324 | if (is_master_copy(lkb)) { | 319 | if (is_master_copy(lkb)) { |
325 | lkb->lkb_bastmode = rqmode; /* printed by debugfs */ | ||
326 | send_bast(r, lkb, rqmode); | 320 | send_bast(r, lkb, rqmode); |
327 | } else { | 321 | } else { |
328 | dlm_add_ast(lkb, AST_BAST, rqmode); | 322 | dlm_add_ast(lkb, DLM_CB_BAST, rqmode, 0, 0); |
329 | } | 323 | } |
330 | } | 324 | } |
331 | 325 | ||
@@ -600,6 +594,7 @@ static int create_lkb(struct dlm_ls *ls, struct dlm_lkb **lkb_ret) | |||
600 | INIT_LIST_HEAD(&lkb->lkb_ownqueue); | 594 | INIT_LIST_HEAD(&lkb->lkb_ownqueue); |
601 | INIT_LIST_HEAD(&lkb->lkb_rsb_lookup); | 595 | INIT_LIST_HEAD(&lkb->lkb_rsb_lookup); |
602 | INIT_LIST_HEAD(&lkb->lkb_time_list); | 596 | INIT_LIST_HEAD(&lkb->lkb_time_list); |
597 | INIT_LIST_HEAD(&lkb->lkb_astqueue); | ||
603 | 598 | ||
604 | get_random_bytes(&bucket, sizeof(bucket)); | 599 | get_random_bytes(&bucket, sizeof(bucket)); |
605 | bucket &= (ls->ls_lkbtbl_size - 1); | 600 | bucket &= (ls->ls_lkbtbl_size - 1); |
@@ -2819,9 +2814,9 @@ static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb, | |||
2819 | not from lkb fields */ | 2814 | not from lkb fields */ |
2820 | 2815 | ||
2821 | if (lkb->lkb_bastfn) | 2816 | if (lkb->lkb_bastfn) |
2822 | ms->m_asts |= AST_BAST; | 2817 | ms->m_asts |= DLM_CB_BAST; |
2823 | if (lkb->lkb_astfn) | 2818 | if (lkb->lkb_astfn) |
2824 | ms->m_asts |= AST_COMP; | 2819 | ms->m_asts |= DLM_CB_CAST; |
2825 | 2820 | ||
2826 | /* compare with switch in create_message; send_remove() doesn't | 2821 | /* compare with switch in create_message; send_remove() doesn't |
2827 | use send_args() */ | 2822 | use send_args() */ |
@@ -3122,8 +3117,8 @@ static int receive_request_args(struct dlm_ls *ls, struct dlm_lkb *lkb, | |||
3122 | lkb->lkb_grmode = DLM_LOCK_IV; | 3117 | lkb->lkb_grmode = DLM_LOCK_IV; |
3123 | lkb->lkb_rqmode = ms->m_rqmode; | 3118 | lkb->lkb_rqmode = ms->m_rqmode; |
3124 | 3119 | ||
3125 | lkb->lkb_bastfn = (ms->m_asts & AST_BAST) ? &fake_bastfn : NULL; | 3120 | lkb->lkb_bastfn = (ms->m_asts & DLM_CB_BAST) ? &fake_bastfn : NULL; |
3126 | lkb->lkb_astfn = (ms->m_asts & AST_COMP) ? &fake_astfn : NULL; | 3121 | lkb->lkb_astfn = (ms->m_asts & DLM_CB_CAST) ? &fake_astfn : NULL; |
3127 | 3122 | ||
3128 | if (lkb->lkb_exflags & DLM_LKF_VALBLK) { | 3123 | if (lkb->lkb_exflags & DLM_LKF_VALBLK) { |
3129 | /* lkb was just created so there won't be an lvb yet */ | 3124 | /* lkb was just created so there won't be an lvb yet */ |
@@ -4412,8 +4407,8 @@ static int receive_rcom_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, | |||
4412 | lkb->lkb_grmode = rl->rl_grmode; | 4407 | lkb->lkb_grmode = rl->rl_grmode; |
4413 | /* don't set lkb_status because add_lkb wants to itself */ | 4408 | /* don't set lkb_status because add_lkb wants to itself */ |
4414 | 4409 | ||
4415 | lkb->lkb_bastfn = (rl->rl_asts & AST_BAST) ? &fake_bastfn : NULL; | 4410 | lkb->lkb_bastfn = (rl->rl_asts & DLM_CB_BAST) ? &fake_bastfn : NULL; |
4416 | lkb->lkb_astfn = (rl->rl_asts & AST_COMP) ? &fake_astfn : NULL; | 4411 | lkb->lkb_astfn = (rl->rl_asts & DLM_CB_CAST) ? &fake_astfn : NULL; |
4417 | 4412 | ||
4418 | if (lkb->lkb_exflags & DLM_LKF_VALBLK) { | 4413 | if (lkb->lkb_exflags & DLM_LKF_VALBLK) { |
4419 | int lvblen = rc->rc_header.h_length - sizeof(struct dlm_rcom) - | 4414 | int lvblen = rc->rc_header.h_length - sizeof(struct dlm_rcom) - |
@@ -4589,7 +4584,6 @@ int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua, | |||
4589 | error = set_lock_args(mode, &ua->lksb, flags, namelen, timeout_cs, | 4584 | error = set_lock_args(mode, &ua->lksb, flags, namelen, timeout_cs, |
4590 | fake_astfn, ua, fake_bastfn, &args); | 4585 | fake_astfn, ua, fake_bastfn, &args); |
4591 | lkb->lkb_flags |= DLM_IFL_USER; | 4586 | lkb->lkb_flags |= DLM_IFL_USER; |
4592 | ua->old_mode = DLM_LOCK_IV; | ||
4593 | 4587 | ||
4594 | if (error) { | 4588 | if (error) { |
4595 | __put_lkb(ls, lkb); | 4589 | __put_lkb(ls, lkb); |
@@ -4658,7 +4652,6 @@ int dlm_user_convert(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, | |||
4658 | ua->bastparam = ua_tmp->bastparam; | 4652 | ua->bastparam = ua_tmp->bastparam; |
4659 | ua->bastaddr = ua_tmp->bastaddr; | 4653 | ua->bastaddr = ua_tmp->bastaddr; |
4660 | ua->user_lksb = ua_tmp->user_lksb; | 4654 | ua->user_lksb = ua_tmp->user_lksb; |
4661 | ua->old_mode = lkb->lkb_grmode; | ||
4662 | 4655 | ||
4663 | error = set_lock_args(mode, &ua->lksb, flags, 0, timeout_cs, | 4656 | error = set_lock_args(mode, &ua->lksb, flags, 0, timeout_cs, |
4664 | fake_astfn, ua, fake_bastfn, &args); | 4657 | fake_astfn, ua, fake_bastfn, &args); |
@@ -4917,8 +4910,9 @@ void dlm_clear_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc) | |||
4917 | } | 4910 | } |
4918 | 4911 | ||
4919 | list_for_each_entry_safe(lkb, safe, &proc->asts, lkb_astqueue) { | 4912 | list_for_each_entry_safe(lkb, safe, &proc->asts, lkb_astqueue) { |
4920 | lkb->lkb_ast_type = 0; | 4913 | memset(&lkb->lkb_callbacks, 0, |
4921 | list_del(&lkb->lkb_astqueue); | 4914 | sizeof(struct dlm_callback) * DLM_CALLBACKS_SIZE); |
4915 | list_del_init(&lkb->lkb_astqueue); | ||
4922 | dlm_put_lkb(lkb); | 4916 | dlm_put_lkb(lkb); |
4923 | } | 4917 | } |
4924 | 4918 | ||
@@ -4958,7 +4952,9 @@ static void purge_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc) | |||
4958 | 4952 | ||
4959 | spin_lock(&proc->asts_spin); | 4953 | spin_lock(&proc->asts_spin); |
4960 | list_for_each_entry_safe(lkb, safe, &proc->asts, lkb_astqueue) { | 4954 | list_for_each_entry_safe(lkb, safe, &proc->asts, lkb_astqueue) { |
4961 | list_del(&lkb->lkb_astqueue); | 4955 | memset(&lkb->lkb_callbacks, 0, |
4956 | sizeof(struct dlm_callback) * DLM_CALLBACKS_SIZE); | ||
4957 | list_del_init(&lkb->lkb_astqueue); | ||
4962 | dlm_put_lkb(lkb); | 4958 | dlm_put_lkb(lkb); |
4963 | } | 4959 | } |
4964 | spin_unlock(&proc->asts_spin); | 4960 | spin_unlock(&proc->asts_spin); |