blob: 9ebeaa6e6903d9be7070debb8c708b25bf228952 [file] [log] [blame]
David Teiglande7fd4172006-01-18 09:30:29 +00001/******************************************************************************
2*******************************************************************************
3**
David Teigland7fe2b312010-02-24 11:08:18 -06004** Copyright (C) 2005-2010 Red Hat, Inc. All rights reserved.
David Teiglande7fd4172006-01-18 09:30:29 +00005**
6** This copyrighted material is made available to anyone wishing to use,
7** modify, copy, or redistribute it subject to the terms and conditions
8** of the GNU General Public License v.2.
9**
10*******************************************************************************
11******************************************************************************/
12
13/* Central locking logic has four stages:
14
15 dlm_lock()
16 dlm_unlock()
17
18 request_lock(ls, lkb)
19 convert_lock(ls, lkb)
20 unlock_lock(ls, lkb)
21 cancel_lock(ls, lkb)
22
23 _request_lock(r, lkb)
24 _convert_lock(r, lkb)
25 _unlock_lock(r, lkb)
26 _cancel_lock(r, lkb)
27
28 do_request(r, lkb)
29 do_convert(r, lkb)
30 do_unlock(r, lkb)
31 do_cancel(r, lkb)
32
33 Stage 1 (lock, unlock) is mainly about checking input args and
34 splitting into one of the four main operations:
35
36 dlm_lock = request_lock
37 dlm_lock+CONVERT = convert_lock
38 dlm_unlock = unlock_lock
39 dlm_unlock+CANCEL = cancel_lock
40
41 Stage 2, xxxx_lock(), just finds and locks the relevant rsb which is
42 provided to the next stage.
43
44 Stage 3, _xxxx_lock(), determines if the operation is local or remote.
45 When remote, it calls send_xxxx(), when local it calls do_xxxx().
46
47 Stage 4, do_xxxx(), is the guts of the operation. It manipulates the
48 given rsb and lkb and queues callbacks.
49
50 For remote operations, send_xxxx() results in the corresponding do_xxxx()
51 function being executed on the remote node. The connecting send/receive
52 calls on local (L) and remote (R) nodes:
53
54 L: send_xxxx() -> R: receive_xxxx()
55 R: do_xxxx()
56 L: receive_xxxx_reply() <- R: send_xxxx_reply()
57*/
David Teigland597d0ca2006-07-12 16:44:04 -050058#include <linux/types.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090059#include <linux/slab.h>
David Teiglande7fd4172006-01-18 09:30:29 +000060#include "dlm_internal.h"
David Teigland597d0ca2006-07-12 16:44:04 -050061#include <linux/dlm_device.h>
David Teiglande7fd4172006-01-18 09:30:29 +000062#include "memory.h"
63#include "lowcomms.h"
64#include "requestqueue.h"
65#include "util.h"
66#include "dir.h"
67#include "member.h"
68#include "lockspace.h"
69#include "ast.h"
70#include "lock.h"
71#include "rcom.h"
72#include "recover.h"
73#include "lvb_table.h"
David Teigland597d0ca2006-07-12 16:44:04 -050074#include "user.h"
David Teiglande7fd4172006-01-18 09:30:29 +000075#include "config.h"
76
77static int send_request(struct dlm_rsb *r, struct dlm_lkb *lkb);
78static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb);
79static int send_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb);
80static int send_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb);
81static int send_grant(struct dlm_rsb *r, struct dlm_lkb *lkb);
82static int send_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int mode);
83static int send_lookup(struct dlm_rsb *r, struct dlm_lkb *lkb);
84static int send_remove(struct dlm_rsb *r);
85static int _request_lock(struct dlm_rsb *r, struct dlm_lkb *lkb);
David Teigland3ae1acf2007-05-18 08:59:31 -050086static int _cancel_lock(struct dlm_rsb *r, struct dlm_lkb *lkb);
David Teiglande7fd4172006-01-18 09:30:29 +000087static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb,
88 struct dlm_message *ms);
89static int receive_extralen(struct dlm_message *ms);
David Teigland84991372007-03-30 15:02:40 -050090static void do_purge(struct dlm_ls *ls, int nodeid, int pid);
David Teigland3ae1acf2007-05-18 08:59:31 -050091static void del_timeout(struct dlm_lkb *lkb);
David Teiglande7fd4172006-01-18 09:30:29 +000092
93/*
94 * Lock compatibilty matrix - thanks Steve
95 * UN = Unlocked state. Not really a state, used as a flag
96 * PD = Padding. Used to make the matrix a nice power of two in size
97 * Other states are the same as the VMS DLM.
98 * Usage: matrix[grmode+1][rqmode+1] (although m[rq+1][gr+1] is the same)
99 */
100
101static const int __dlm_compat_matrix[8][8] = {
102 /* UN NL CR CW PR PW EX PD */
103 {1, 1, 1, 1, 1, 1, 1, 0}, /* UN */
104 {1, 1, 1, 1, 1, 1, 1, 0}, /* NL */
105 {1, 1, 1, 1, 1, 1, 0, 0}, /* CR */
106 {1, 1, 1, 1, 0, 0, 0, 0}, /* CW */
107 {1, 1, 1, 0, 1, 0, 0, 0}, /* PR */
108 {1, 1, 1, 0, 0, 0, 0, 0}, /* PW */
109 {1, 1, 0, 0, 0, 0, 0, 0}, /* EX */
110 {0, 0, 0, 0, 0, 0, 0, 0} /* PD */
111};
112
113/*
114 * This defines the direction of transfer of LVB data.
115 * Granted mode is the row; requested mode is the column.
116 * Usage: matrix[grmode+1][rqmode+1]
117 * 1 = LVB is returned to the caller
118 * 0 = LVB is written to the resource
119 * -1 = nothing happens to the LVB
120 */
121
122const int dlm_lvb_operations[8][8] = {
123 /* UN NL CR CW PR PW EX PD*/
124 { -1, 1, 1, 1, 1, 1, 1, -1 }, /* UN */
125 { -1, 1, 1, 1, 1, 1, 1, 0 }, /* NL */
126 { -1, -1, 1, 1, 1, 1, 1, 0 }, /* CR */
127 { -1, -1, -1, 1, 1, 1, 1, 0 }, /* CW */
128 { -1, -1, -1, -1, 1, 1, 1, 0 }, /* PR */
129 { -1, 0, 0, 0, 0, 0, 1, 0 }, /* PW */
130 { -1, 0, 0, 0, 0, 0, 0, 0 }, /* EX */
131 { -1, 0, 0, 0, 0, 0, 0, 0 } /* PD */
132};
David Teiglande7fd4172006-01-18 09:30:29 +0000133
134#define modes_compat(gr, rq) \
135 __dlm_compat_matrix[(gr)->lkb_grmode + 1][(rq)->lkb_rqmode + 1]
136
137int dlm_modes_compat(int mode1, int mode2)
138{
139 return __dlm_compat_matrix[mode1 + 1][mode2 + 1];
140}
141
142/*
143 * Compatibility matrix for conversions with QUECVT set.
144 * Granted mode is the row; requested mode is the column.
145 * Usage: matrix[grmode+1][rqmode+1]
146 */
147
148static const int __quecvt_compat_matrix[8][8] = {
149 /* UN NL CR CW PR PW EX PD */
150 {0, 0, 0, 0, 0, 0, 0, 0}, /* UN */
151 {0, 0, 1, 1, 1, 1, 1, 0}, /* NL */
152 {0, 0, 0, 1, 1, 1, 1, 0}, /* CR */
153 {0, 0, 0, 0, 1, 1, 1, 0}, /* CW */
154 {0, 0, 0, 1, 0, 1, 1, 0}, /* PR */
155 {0, 0, 0, 0, 0, 0, 1, 0}, /* PW */
156 {0, 0, 0, 0, 0, 0, 0, 0}, /* EX */
157 {0, 0, 0, 0, 0, 0, 0, 0} /* PD */
158};
159
David Teigland597d0ca2006-07-12 16:44:04 -0500160void dlm_print_lkb(struct dlm_lkb *lkb)
David Teiglande7fd4172006-01-18 09:30:29 +0000161{
162 printk(KERN_ERR "lkb: nodeid %d id %x remid %x exflags %x flags %x\n"
David Teigland8304d6f2011-02-21 14:58:21 -0600163 " status %d rqmode %d grmode %d wait_type %d\n",
David Teiglande7fd4172006-01-18 09:30:29 +0000164 lkb->lkb_nodeid, lkb->lkb_id, lkb->lkb_remid, lkb->lkb_exflags,
165 lkb->lkb_flags, lkb->lkb_status, lkb->lkb_rqmode,
David Teigland8304d6f2011-02-21 14:58:21 -0600166 lkb->lkb_grmode, lkb->lkb_wait_type);
David Teiglande7fd4172006-01-18 09:30:29 +0000167}
168
Adrian Bunk170e19a2008-02-13 23:29:38 +0200169static void dlm_print_rsb(struct dlm_rsb *r)
David Teiglande7fd4172006-01-18 09:30:29 +0000170{
171 printk(KERN_ERR "rsb: nodeid %d flags %lx first %x rlc %d name %s\n",
172 r->res_nodeid, r->res_flags, r->res_first_lkid,
173 r->res_recover_locks_count, r->res_name);
174}
175
David Teiglanda345da32006-08-18 11:54:25 -0500176void dlm_dump_rsb(struct dlm_rsb *r)
177{
178 struct dlm_lkb *lkb;
179
180 dlm_print_rsb(r);
181
182 printk(KERN_ERR "rsb: root_list empty %d recover_list empty %d\n",
183 list_empty(&r->res_root_list), list_empty(&r->res_recover_list));
184 printk(KERN_ERR "rsb lookup list\n");
185 list_for_each_entry(lkb, &r->res_lookup, lkb_rsb_lookup)
186 dlm_print_lkb(lkb);
187 printk(KERN_ERR "rsb grant queue:\n");
188 list_for_each_entry(lkb, &r->res_grantqueue, lkb_statequeue)
189 dlm_print_lkb(lkb);
190 printk(KERN_ERR "rsb convert queue:\n");
191 list_for_each_entry(lkb, &r->res_convertqueue, lkb_statequeue)
192 dlm_print_lkb(lkb);
193 printk(KERN_ERR "rsb wait queue:\n");
194 list_for_each_entry(lkb, &r->res_waitqueue, lkb_statequeue)
195 dlm_print_lkb(lkb);
196}
197
David Teiglande7fd4172006-01-18 09:30:29 +0000198/* Threads cannot use the lockspace while it's being recovered */
199
David Teigland85e86ed2007-05-18 08:58:15 -0500200static inline void dlm_lock_recovery(struct dlm_ls *ls)
David Teiglande7fd4172006-01-18 09:30:29 +0000201{
202 down_read(&ls->ls_in_recovery);
203}
204
David Teigland85e86ed2007-05-18 08:58:15 -0500205void dlm_unlock_recovery(struct dlm_ls *ls)
David Teiglande7fd4172006-01-18 09:30:29 +0000206{
207 up_read(&ls->ls_in_recovery);
208}
209
David Teigland85e86ed2007-05-18 08:58:15 -0500210int dlm_lock_recovery_try(struct dlm_ls *ls)
David Teiglande7fd4172006-01-18 09:30:29 +0000211{
212 return down_read_trylock(&ls->ls_in_recovery);
213}
214
215static inline int can_be_queued(struct dlm_lkb *lkb)
216{
217 return !(lkb->lkb_exflags & DLM_LKF_NOQUEUE);
218}
219
220static inline int force_blocking_asts(struct dlm_lkb *lkb)
221{
222 return (lkb->lkb_exflags & DLM_LKF_NOQUEUEBAST);
223}
224
225static inline int is_demoted(struct dlm_lkb *lkb)
226{
227 return (lkb->lkb_sbflags & DLM_SBF_DEMOTED);
228}
229
David Teigland7d3c1fe2007-04-19 10:30:41 -0500230static inline int is_altmode(struct dlm_lkb *lkb)
231{
232 return (lkb->lkb_sbflags & DLM_SBF_ALTMODE);
233}
234
235static inline int is_granted(struct dlm_lkb *lkb)
236{
237 return (lkb->lkb_status == DLM_LKSTS_GRANTED);
238}
239
David Teiglande7fd4172006-01-18 09:30:29 +0000240static inline int is_remote(struct dlm_rsb *r)
241{
242 DLM_ASSERT(r->res_nodeid >= 0, dlm_print_rsb(r););
243 return !!r->res_nodeid;
244}
245
246static inline int is_process_copy(struct dlm_lkb *lkb)
247{
248 return (lkb->lkb_nodeid && !(lkb->lkb_flags & DLM_IFL_MSTCPY));
249}
250
251static inline int is_master_copy(struct dlm_lkb *lkb)
252{
253 if (lkb->lkb_flags & DLM_IFL_MSTCPY)
254 DLM_ASSERT(lkb->lkb_nodeid, dlm_print_lkb(lkb););
David Teigland90135922006-01-20 08:47:07 +0000255 return (lkb->lkb_flags & DLM_IFL_MSTCPY) ? 1 : 0;
David Teiglande7fd4172006-01-18 09:30:29 +0000256}
257
258static inline int middle_conversion(struct dlm_lkb *lkb)
259{
260 if ((lkb->lkb_grmode==DLM_LOCK_PR && lkb->lkb_rqmode==DLM_LOCK_CW) ||
261 (lkb->lkb_rqmode==DLM_LOCK_PR && lkb->lkb_grmode==DLM_LOCK_CW))
David Teigland90135922006-01-20 08:47:07 +0000262 return 1;
263 return 0;
David Teiglande7fd4172006-01-18 09:30:29 +0000264}
265
266static inline int down_conversion(struct dlm_lkb *lkb)
267{
268 return (!middle_conversion(lkb) && lkb->lkb_rqmode < lkb->lkb_grmode);
269}
270
David Teiglandef0c2bb2007-03-28 09:56:46 -0500271static inline int is_overlap_unlock(struct dlm_lkb *lkb)
272{
273 return lkb->lkb_flags & DLM_IFL_OVERLAP_UNLOCK;
274}
275
276static inline int is_overlap_cancel(struct dlm_lkb *lkb)
277{
278 return lkb->lkb_flags & DLM_IFL_OVERLAP_CANCEL;
279}
280
281static inline int is_overlap(struct dlm_lkb *lkb)
282{
283 return (lkb->lkb_flags & (DLM_IFL_OVERLAP_UNLOCK |
284 DLM_IFL_OVERLAP_CANCEL));
285}
286
David Teiglande7fd4172006-01-18 09:30:29 +0000287static void queue_cast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv)
288{
289 if (is_master_copy(lkb))
290 return;
291
David Teigland3ae1acf2007-05-18 08:59:31 -0500292 del_timeout(lkb);
293
David Teiglande7fd4172006-01-18 09:30:29 +0000294 DLM_ASSERT(lkb->lkb_lksb, dlm_print_lkb(lkb););
295
David Teigland3ae1acf2007-05-18 08:59:31 -0500296 /* if the operation was a cancel, then return -DLM_ECANCEL, if a
297 timeout caused the cancel then return -ETIMEDOUT */
298 if (rv == -DLM_ECANCEL && (lkb->lkb_flags & DLM_IFL_TIMEOUT_CANCEL)) {
299 lkb->lkb_flags &= ~DLM_IFL_TIMEOUT_CANCEL;
300 rv = -ETIMEDOUT;
301 }
302
David Teigland8b4021f2007-05-29 08:46:00 -0500303 if (rv == -DLM_ECANCEL && (lkb->lkb_flags & DLM_IFL_DEADLOCK_CANCEL)) {
304 lkb->lkb_flags &= ~DLM_IFL_DEADLOCK_CANCEL;
305 rv = -EDEADLK;
306 }
307
David Teigland8304d6f2011-02-21 14:58:21 -0600308 dlm_add_ast(lkb, DLM_CB_CAST, lkb->lkb_grmode, rv, lkb->lkb_sbflags);
David Teiglande7fd4172006-01-18 09:30:29 +0000309}
310
David Teiglandef0c2bb2007-03-28 09:56:46 -0500311static inline void queue_cast_overlap(struct dlm_rsb *r, struct dlm_lkb *lkb)
312{
313 queue_cast(r, lkb,
314 is_overlap_unlock(lkb) ? -DLM_EUNLOCK : -DLM_ECANCEL);
315}
316
David Teiglande7fd4172006-01-18 09:30:29 +0000317static void queue_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rqmode)
318{
David Teiglandb6fa8792010-02-25 12:20:57 -0600319 if (is_master_copy(lkb)) {
David Teiglande7fd4172006-01-18 09:30:29 +0000320 send_bast(r, lkb, rqmode);
David Teiglandb6fa8792010-02-25 12:20:57 -0600321 } else {
David Teigland8304d6f2011-02-21 14:58:21 -0600322 dlm_add_ast(lkb, DLM_CB_BAST, rqmode, 0, 0);
David Teiglandb6fa8792010-02-25 12:20:57 -0600323 }
David Teiglande7fd4172006-01-18 09:30:29 +0000324}
325
326/*
327 * Basic operations on rsb's and lkb's
328 */
329
David Teigland3881ac02011-07-07 14:05:03 -0500330static int pre_rsb_struct(struct dlm_ls *ls)
331{
332 struct dlm_rsb *r1, *r2;
333 int count = 0;
334
335 spin_lock(&ls->ls_new_rsb_spin);
336 if (ls->ls_new_rsb_count > dlm_config.ci_new_rsb_count / 2) {
337 spin_unlock(&ls->ls_new_rsb_spin);
338 return 0;
339 }
340 spin_unlock(&ls->ls_new_rsb_spin);
341
342 r1 = dlm_allocate_rsb(ls);
343 r2 = dlm_allocate_rsb(ls);
344
345 spin_lock(&ls->ls_new_rsb_spin);
346 if (r1) {
347 list_add(&r1->res_hashchain, &ls->ls_new_rsb);
348 ls->ls_new_rsb_count++;
349 }
350 if (r2) {
351 list_add(&r2->res_hashchain, &ls->ls_new_rsb);
352 ls->ls_new_rsb_count++;
353 }
354 count = ls->ls_new_rsb_count;
355 spin_unlock(&ls->ls_new_rsb_spin);
356
357 if (!count)
358 return -ENOMEM;
359 return 0;
360}
361
362/* If ls->ls_new_rsb is empty, return -EAGAIN, so the caller can
363 unlock any spinlocks, go back and call pre_rsb_struct again.
364 Otherwise, take an rsb off the list and return it. */
365
366static int get_rsb_struct(struct dlm_ls *ls, char *name, int len,
367 struct dlm_rsb **r_ret)
David Teiglande7fd4172006-01-18 09:30:29 +0000368{
369 struct dlm_rsb *r;
David Teigland3881ac02011-07-07 14:05:03 -0500370 int count;
David Teiglande7fd4172006-01-18 09:30:29 +0000371
David Teigland3881ac02011-07-07 14:05:03 -0500372 spin_lock(&ls->ls_new_rsb_spin);
373 if (list_empty(&ls->ls_new_rsb)) {
374 count = ls->ls_new_rsb_count;
375 spin_unlock(&ls->ls_new_rsb_spin);
376 log_debug(ls, "find_rsb retry %d %d %s",
377 count, dlm_config.ci_new_rsb_count, name);
378 return -EAGAIN;
379 }
380
381 r = list_first_entry(&ls->ls_new_rsb, struct dlm_rsb, res_hashchain);
382 list_del(&r->res_hashchain);
383 ls->ls_new_rsb_count--;
384 spin_unlock(&ls->ls_new_rsb_spin);
David Teiglande7fd4172006-01-18 09:30:29 +0000385
386 r->res_ls = ls;
387 r->res_length = len;
388 memcpy(r->res_name, name, len);
David Teigland90135922006-01-20 08:47:07 +0000389 mutex_init(&r->res_mutex);
David Teiglande7fd4172006-01-18 09:30:29 +0000390
David Teigland3881ac02011-07-07 14:05:03 -0500391 INIT_LIST_HEAD(&r->res_hashchain);
David Teiglande7fd4172006-01-18 09:30:29 +0000392 INIT_LIST_HEAD(&r->res_lookup);
393 INIT_LIST_HEAD(&r->res_grantqueue);
394 INIT_LIST_HEAD(&r->res_convertqueue);
395 INIT_LIST_HEAD(&r->res_waitqueue);
396 INIT_LIST_HEAD(&r->res_root_list);
397 INIT_LIST_HEAD(&r->res_recover_list);
398
David Teigland3881ac02011-07-07 14:05:03 -0500399 *r_ret = r;
400 return 0;
David Teiglande7fd4172006-01-18 09:30:29 +0000401}
402
403static int search_rsb_list(struct list_head *head, char *name, int len,
404 unsigned int flags, struct dlm_rsb **r_ret)
405{
406 struct dlm_rsb *r;
407 int error = 0;
408
409 list_for_each_entry(r, head, res_hashchain) {
410 if (len == r->res_length && !memcmp(name, r->res_name, len))
411 goto found;
412 }
Benny Halevy18c60c02008-06-30 19:59:14 +0300413 *r_ret = NULL;
David Teigland597d0ca2006-07-12 16:44:04 -0500414 return -EBADR;
David Teiglande7fd4172006-01-18 09:30:29 +0000415
416 found:
417 if (r->res_nodeid && (flags & R_MASTER))
418 error = -ENOTBLK;
419 *r_ret = r;
420 return error;
421}
422
423static int _search_rsb(struct dlm_ls *ls, char *name, int len, int b,
424 unsigned int flags, struct dlm_rsb **r_ret)
425{
426 struct dlm_rsb *r;
427 int error;
428
429 error = search_rsb_list(&ls->ls_rsbtbl[b].list, name, len, flags, &r);
430 if (!error) {
431 kref_get(&r->res_ref);
432 goto out;
433 }
434 error = search_rsb_list(&ls->ls_rsbtbl[b].toss, name, len, flags, &r);
435 if (error)
436 goto out;
437
438 list_move(&r->res_hashchain, &ls->ls_rsbtbl[b].list);
439
440 if (dlm_no_directory(ls))
441 goto out;
442
443 if (r->res_nodeid == -1) {
444 rsb_clear_flag(r, RSB_MASTER_UNCERTAIN);
445 r->res_first_lkid = 0;
446 } else if (r->res_nodeid > 0) {
447 rsb_set_flag(r, RSB_MASTER_UNCERTAIN);
448 r->res_first_lkid = 0;
449 } else {
450 DLM_ASSERT(r->res_nodeid == 0, dlm_print_rsb(r););
451 DLM_ASSERT(!rsb_flag(r, RSB_MASTER_UNCERTAIN),);
452 }
453 out:
454 *r_ret = r;
455 return error;
456}
457
David Teiglande7fd4172006-01-18 09:30:29 +0000458/*
459 * Find rsb in rsbtbl and potentially create/add one
460 *
461 * Delaying the release of rsb's has a similar benefit to applications keeping
462 * NL locks on an rsb, but without the guarantee that the cached master value
463 * will still be valid when the rsb is reused. Apps aren't always smart enough
464 * to keep NL locks on an rsb that they may lock again shortly; this can lead
465 * to excessive master lookups and removals if we don't delay the release.
466 *
467 * Searching for an rsb means looking through both the normal list and toss
468 * list. When found on the toss list the rsb is moved to the normal list with
469 * ref count of 1; when found on normal list the ref count is incremented.
470 */
471
472static int find_rsb(struct dlm_ls *ls, char *name, int namelen,
473 unsigned int flags, struct dlm_rsb **r_ret)
474{
David Teigland3881ac02011-07-07 14:05:03 -0500475 struct dlm_rsb *r = NULL;
David Teiglande7fd4172006-01-18 09:30:29 +0000476 uint32_t hash, bucket;
David Teigland3881ac02011-07-07 14:05:03 -0500477 int error;
Al Viroef58bcc2008-01-25 23:22:26 -0500478
David Teigland3881ac02011-07-07 14:05:03 -0500479 if (namelen > DLM_RESNAME_MAXLEN) {
480 error = -EINVAL;
Al Viroef58bcc2008-01-25 23:22:26 -0500481 goto out;
David Teigland3881ac02011-07-07 14:05:03 -0500482 }
David Teiglande7fd4172006-01-18 09:30:29 +0000483
484 if (dlm_no_directory(ls))
485 flags |= R_CREATE;
486
487 hash = jhash(name, namelen, 0);
488 bucket = hash & (ls->ls_rsbtbl_size - 1);
489
David Teigland3881ac02011-07-07 14:05:03 -0500490 retry:
491 if (flags & R_CREATE) {
492 error = pre_rsb_struct(ls);
493 if (error < 0)
494 goto out;
495 }
496
497 spin_lock(&ls->ls_rsbtbl[bucket].lock);
498
499 error = _search_rsb(ls, name, namelen, bucket, flags, &r);
David Teiglande7fd4172006-01-18 09:30:29 +0000500 if (!error)
David Teigland3881ac02011-07-07 14:05:03 -0500501 goto out_unlock;
David Teiglande7fd4172006-01-18 09:30:29 +0000502
David Teigland597d0ca2006-07-12 16:44:04 -0500503 if (error == -EBADR && !(flags & R_CREATE))
David Teigland3881ac02011-07-07 14:05:03 -0500504 goto out_unlock;
David Teiglande7fd4172006-01-18 09:30:29 +0000505
506 /* the rsb was found but wasn't a master copy */
507 if (error == -ENOTBLK)
David Teigland3881ac02011-07-07 14:05:03 -0500508 goto out_unlock;
David Teiglande7fd4172006-01-18 09:30:29 +0000509
David Teigland3881ac02011-07-07 14:05:03 -0500510 error = get_rsb_struct(ls, name, namelen, &r);
511 if (error == -EAGAIN) {
512 spin_unlock(&ls->ls_rsbtbl[bucket].lock);
513 goto retry;
514 }
515 if (error)
516 goto out_unlock;
David Teiglande7fd4172006-01-18 09:30:29 +0000517
518 r->res_hash = hash;
519 r->res_bucket = bucket;
520 r->res_nodeid = -1;
521 kref_init(&r->res_ref);
522
523 /* With no directory, the master can be set immediately */
524 if (dlm_no_directory(ls)) {
525 int nodeid = dlm_dir_nodeid(r);
526 if (nodeid == dlm_our_nodeid())
527 nodeid = 0;
528 r->res_nodeid = nodeid;
529 }
David Teiglande7fd4172006-01-18 09:30:29 +0000530 list_add(&r->res_hashchain, &ls->ls_rsbtbl[bucket].list);
David Teiglande7fd4172006-01-18 09:30:29 +0000531 error = 0;
David Teigland3881ac02011-07-07 14:05:03 -0500532 out_unlock:
533 spin_unlock(&ls->ls_rsbtbl[bucket].lock);
David Teiglande7fd4172006-01-18 09:30:29 +0000534 out:
535 *r_ret = r;
536 return error;
537}
538
David Teiglande7fd4172006-01-18 09:30:29 +0000539/* This is only called to add a reference when the code already holds
540 a valid reference to the rsb, so there's no need for locking. */
541
542static inline void hold_rsb(struct dlm_rsb *r)
543{
544 kref_get(&r->res_ref);
545}
546
547void dlm_hold_rsb(struct dlm_rsb *r)
548{
549 hold_rsb(r);
550}
551
552static void toss_rsb(struct kref *kref)
553{
554 struct dlm_rsb *r = container_of(kref, struct dlm_rsb, res_ref);
555 struct dlm_ls *ls = r->res_ls;
556
557 DLM_ASSERT(list_empty(&r->res_root_list), dlm_print_rsb(r););
558 kref_init(&r->res_ref);
559 list_move(&r->res_hashchain, &ls->ls_rsbtbl[r->res_bucket].toss);
560 r->res_toss_time = jiffies;
561 if (r->res_lvbptr) {
David Teigland52bda2b2007-11-07 09:06:49 -0600562 dlm_free_lvb(r->res_lvbptr);
David Teiglande7fd4172006-01-18 09:30:29 +0000563 r->res_lvbptr = NULL;
564 }
565}
566
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300567/* When all references to the rsb are gone it's transferred to
David Teiglande7fd4172006-01-18 09:30:29 +0000568 the tossed list for later disposal. */
569
570static void put_rsb(struct dlm_rsb *r)
571{
572 struct dlm_ls *ls = r->res_ls;
573 uint32_t bucket = r->res_bucket;
574
David Teiglandc7be7612009-01-07 16:50:41 -0600575 spin_lock(&ls->ls_rsbtbl[bucket].lock);
David Teiglande7fd4172006-01-18 09:30:29 +0000576 kref_put(&r->res_ref, toss_rsb);
David Teiglandc7be7612009-01-07 16:50:41 -0600577 spin_unlock(&ls->ls_rsbtbl[bucket].lock);
David Teiglande7fd4172006-01-18 09:30:29 +0000578}
579
580void dlm_put_rsb(struct dlm_rsb *r)
581{
582 put_rsb(r);
583}
584
585/* See comment for unhold_lkb */
586
587static void unhold_rsb(struct dlm_rsb *r)
588{
589 int rv;
590 rv = kref_put(&r->res_ref, toss_rsb);
David Teiglanda345da32006-08-18 11:54:25 -0500591 DLM_ASSERT(!rv, dlm_dump_rsb(r););
David Teiglande7fd4172006-01-18 09:30:29 +0000592}
593
594static void kill_rsb(struct kref *kref)
595{
596 struct dlm_rsb *r = container_of(kref, struct dlm_rsb, res_ref);
597
598 /* All work is done after the return from kref_put() so we
599 can release the write_lock before the remove and free. */
600
David Teiglanda345da32006-08-18 11:54:25 -0500601 DLM_ASSERT(list_empty(&r->res_lookup), dlm_dump_rsb(r););
602 DLM_ASSERT(list_empty(&r->res_grantqueue), dlm_dump_rsb(r););
603 DLM_ASSERT(list_empty(&r->res_convertqueue), dlm_dump_rsb(r););
604 DLM_ASSERT(list_empty(&r->res_waitqueue), dlm_dump_rsb(r););
605 DLM_ASSERT(list_empty(&r->res_root_list), dlm_dump_rsb(r););
606 DLM_ASSERT(list_empty(&r->res_recover_list), dlm_dump_rsb(r););
David Teiglande7fd4172006-01-18 09:30:29 +0000607}
608
609/* Attaching/detaching lkb's from rsb's is for rsb reference counting.
610 The rsb must exist as long as any lkb's for it do. */
611
612static void attach_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb)
613{
614 hold_rsb(r);
615 lkb->lkb_resource = r;
616}
617
618static void detach_lkb(struct dlm_lkb *lkb)
619{
620 if (lkb->lkb_resource) {
621 put_rsb(lkb->lkb_resource);
622 lkb->lkb_resource = NULL;
623 }
624}
625
626static int create_lkb(struct dlm_ls *ls, struct dlm_lkb **lkb_ret)
627{
David Teigland3d6aa672011-07-06 17:00:54 -0500628 struct dlm_lkb *lkb;
629 int rv, id;
David Teiglande7fd4172006-01-18 09:30:29 +0000630
David Teigland52bda2b2007-11-07 09:06:49 -0600631 lkb = dlm_allocate_lkb(ls);
David Teiglande7fd4172006-01-18 09:30:29 +0000632 if (!lkb)
633 return -ENOMEM;
634
635 lkb->lkb_nodeid = -1;
636 lkb->lkb_grmode = DLM_LOCK_IV;
637 kref_init(&lkb->lkb_ref);
David Teigland34e22be2006-07-18 11:24:04 -0500638 INIT_LIST_HEAD(&lkb->lkb_ownqueue);
David Teiglandef0c2bb2007-03-28 09:56:46 -0500639 INIT_LIST_HEAD(&lkb->lkb_rsb_lookup);
David Teigland3ae1acf2007-05-18 08:59:31 -0500640 INIT_LIST_HEAD(&lkb->lkb_time_list);
David Teigland8304d6f2011-02-21 14:58:21 -0600641 INIT_LIST_HEAD(&lkb->lkb_astqueue);
David Teiglande7fd4172006-01-18 09:30:29 +0000642
David Teigland3d6aa672011-07-06 17:00:54 -0500643 retry:
644 rv = idr_pre_get(&ls->ls_lkbidr, GFP_NOFS);
645 if (!rv)
646 return -ENOMEM;
David Teiglande7fd4172006-01-18 09:30:29 +0000647
David Teigland3d6aa672011-07-06 17:00:54 -0500648 spin_lock(&ls->ls_lkbidr_spin);
649 rv = idr_get_new_above(&ls->ls_lkbidr, lkb, 1, &id);
650 if (!rv)
651 lkb->lkb_id = id;
652 spin_unlock(&ls->ls_lkbidr_spin);
David Teiglande7fd4172006-01-18 09:30:29 +0000653
David Teigland3d6aa672011-07-06 17:00:54 -0500654 if (rv == -EAGAIN)
655 goto retry;
David Teiglande7fd4172006-01-18 09:30:29 +0000656
David Teigland3d6aa672011-07-06 17:00:54 -0500657 if (rv < 0) {
658 log_error(ls, "create_lkb idr error %d", rv);
659 return rv;
David Teiglande7fd4172006-01-18 09:30:29 +0000660 }
661
David Teiglande7fd4172006-01-18 09:30:29 +0000662 *lkb_ret = lkb;
663 return 0;
664}
665
David Teiglande7fd4172006-01-18 09:30:29 +0000666static int find_lkb(struct dlm_ls *ls, uint32_t lkid, struct dlm_lkb **lkb_ret)
667{
668 struct dlm_lkb *lkb;
David Teiglande7fd4172006-01-18 09:30:29 +0000669
David Teigland3d6aa672011-07-06 17:00:54 -0500670 spin_lock(&ls->ls_lkbidr_spin);
671 lkb = idr_find(&ls->ls_lkbidr, lkid);
David Teiglande7fd4172006-01-18 09:30:29 +0000672 if (lkb)
673 kref_get(&lkb->lkb_ref);
David Teigland3d6aa672011-07-06 17:00:54 -0500674 spin_unlock(&ls->ls_lkbidr_spin);
David Teiglande7fd4172006-01-18 09:30:29 +0000675
676 *lkb_ret = lkb;
677 return lkb ? 0 : -ENOENT;
678}
679
680static void kill_lkb(struct kref *kref)
681{
682 struct dlm_lkb *lkb = container_of(kref, struct dlm_lkb, lkb_ref);
683
684 /* All work is done after the return from kref_put() so we
685 can release the write_lock before the detach_lkb */
686
687 DLM_ASSERT(!lkb->lkb_status, dlm_print_lkb(lkb););
688}
689
David Teiglandb3f58d82006-02-28 11:16:37 -0500690/* __put_lkb() is used when an lkb may not have an rsb attached to
691 it so we need to provide the lockspace explicitly */
692
693static int __put_lkb(struct dlm_ls *ls, struct dlm_lkb *lkb)
David Teiglande7fd4172006-01-18 09:30:29 +0000694{
David Teigland3d6aa672011-07-06 17:00:54 -0500695 uint32_t lkid = lkb->lkb_id;
David Teiglande7fd4172006-01-18 09:30:29 +0000696
David Teigland3d6aa672011-07-06 17:00:54 -0500697 spin_lock(&ls->ls_lkbidr_spin);
David Teiglande7fd4172006-01-18 09:30:29 +0000698 if (kref_put(&lkb->lkb_ref, kill_lkb)) {
David Teigland3d6aa672011-07-06 17:00:54 -0500699 idr_remove(&ls->ls_lkbidr, lkid);
700 spin_unlock(&ls->ls_lkbidr_spin);
David Teiglande7fd4172006-01-18 09:30:29 +0000701
702 detach_lkb(lkb);
703
704 /* for local/process lkbs, lvbptr points to caller's lksb */
705 if (lkb->lkb_lvbptr && is_master_copy(lkb))
David Teigland52bda2b2007-11-07 09:06:49 -0600706 dlm_free_lvb(lkb->lkb_lvbptr);
707 dlm_free_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +0000708 return 1;
709 } else {
David Teigland3d6aa672011-07-06 17:00:54 -0500710 spin_unlock(&ls->ls_lkbidr_spin);
David Teiglande7fd4172006-01-18 09:30:29 +0000711 return 0;
712 }
713}
714
715int dlm_put_lkb(struct dlm_lkb *lkb)
716{
David Teiglandb3f58d82006-02-28 11:16:37 -0500717 struct dlm_ls *ls;
718
719 DLM_ASSERT(lkb->lkb_resource, dlm_print_lkb(lkb););
720 DLM_ASSERT(lkb->lkb_resource->res_ls, dlm_print_lkb(lkb););
721
722 ls = lkb->lkb_resource->res_ls;
723 return __put_lkb(ls, lkb);
David Teiglande7fd4172006-01-18 09:30:29 +0000724}
725
726/* This is only called to add a reference when the code already holds
727 a valid reference to the lkb, so there's no need for locking. */
728
729static inline void hold_lkb(struct dlm_lkb *lkb)
730{
731 kref_get(&lkb->lkb_ref);
732}
733
734/* This is called when we need to remove a reference and are certain
735 it's not the last ref. e.g. del_lkb is always called between a
736 find_lkb/put_lkb and is always the inverse of a previous add_lkb.
737 put_lkb would work fine, but would involve unnecessary locking */
738
739static inline void unhold_lkb(struct dlm_lkb *lkb)
740{
741 int rv;
742 rv = kref_put(&lkb->lkb_ref, kill_lkb);
743 DLM_ASSERT(!rv, dlm_print_lkb(lkb););
744}
745
746static void lkb_add_ordered(struct list_head *new, struct list_head *head,
747 int mode)
748{
749 struct dlm_lkb *lkb = NULL;
750
751 list_for_each_entry(lkb, head, lkb_statequeue)
752 if (lkb->lkb_rqmode < mode)
753 break;
754
Dan Carpenter99fb19d2010-03-22 15:03:54 +0300755 __list_add(new, lkb->lkb_statequeue.prev, &lkb->lkb_statequeue);
David Teiglande7fd4172006-01-18 09:30:29 +0000756}
757
758/* add/remove lkb to rsb's grant/convert/wait queue */
759
760static void add_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int status)
761{
762 kref_get(&lkb->lkb_ref);
763
764 DLM_ASSERT(!lkb->lkb_status, dlm_print_lkb(lkb););
765
David Teiglandeeda4182008-12-09 14:12:21 -0600766 lkb->lkb_timestamp = ktime_get();
767
David Teiglande7fd4172006-01-18 09:30:29 +0000768 lkb->lkb_status = status;
769
770 switch (status) {
771 case DLM_LKSTS_WAITING:
772 if (lkb->lkb_exflags & DLM_LKF_HEADQUE)
773 list_add(&lkb->lkb_statequeue, &r->res_waitqueue);
774 else
775 list_add_tail(&lkb->lkb_statequeue, &r->res_waitqueue);
776 break;
777 case DLM_LKSTS_GRANTED:
778 /* convention says granted locks kept in order of grmode */
779 lkb_add_ordered(&lkb->lkb_statequeue, &r->res_grantqueue,
780 lkb->lkb_grmode);
781 break;
782 case DLM_LKSTS_CONVERT:
783 if (lkb->lkb_exflags & DLM_LKF_HEADQUE)
784 list_add(&lkb->lkb_statequeue, &r->res_convertqueue);
785 else
786 list_add_tail(&lkb->lkb_statequeue,
787 &r->res_convertqueue);
788 break;
789 default:
790 DLM_ASSERT(0, dlm_print_lkb(lkb); printk("sts=%d\n", status););
791 }
792}
793
794static void del_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb)
795{
796 lkb->lkb_status = 0;
797 list_del(&lkb->lkb_statequeue);
798 unhold_lkb(lkb);
799}
800
801static void move_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int sts)
802{
803 hold_lkb(lkb);
804 del_lkb(r, lkb);
805 add_lkb(r, lkb, sts);
806 unhold_lkb(lkb);
807}
808
David Teiglandef0c2bb2007-03-28 09:56:46 -0500809static int msg_reply_type(int mstype)
810{
811 switch (mstype) {
812 case DLM_MSG_REQUEST:
813 return DLM_MSG_REQUEST_REPLY;
814 case DLM_MSG_CONVERT:
815 return DLM_MSG_CONVERT_REPLY;
816 case DLM_MSG_UNLOCK:
817 return DLM_MSG_UNLOCK_REPLY;
818 case DLM_MSG_CANCEL:
819 return DLM_MSG_CANCEL_REPLY;
820 case DLM_MSG_LOOKUP:
821 return DLM_MSG_LOOKUP_REPLY;
822 }
823 return -1;
824}
825
David Teiglandc6ff6692011-03-28 14:17:26 -0500826static int nodeid_warned(int nodeid, int num_nodes, int *warned)
827{
828 int i;
829
830 for (i = 0; i < num_nodes; i++) {
831 if (!warned[i]) {
832 warned[i] = nodeid;
833 return 0;
834 }
835 if (warned[i] == nodeid)
836 return 1;
837 }
838 return 0;
839}
840
841void dlm_scan_waiters(struct dlm_ls *ls)
842{
843 struct dlm_lkb *lkb;
844 ktime_t zero = ktime_set(0, 0);
845 s64 us;
846 s64 debug_maxus = 0;
847 u32 debug_scanned = 0;
848 u32 debug_expired = 0;
849 int num_nodes = 0;
850 int *warned = NULL;
851
852 if (!dlm_config.ci_waitwarn_us)
853 return;
854
855 mutex_lock(&ls->ls_waiters_mutex);
856
857 list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) {
858 if (ktime_equal(lkb->lkb_wait_time, zero))
859 continue;
860
861 debug_scanned++;
862
863 us = ktime_to_us(ktime_sub(ktime_get(), lkb->lkb_wait_time));
864
865 if (us < dlm_config.ci_waitwarn_us)
866 continue;
867
868 lkb->lkb_wait_time = zero;
869
870 debug_expired++;
871 if (us > debug_maxus)
872 debug_maxus = us;
873
874 if (!num_nodes) {
875 num_nodes = ls->ls_num_nodes;
Jesper Juhl5d708282011-07-10 22:54:31 +0200876 warned = kzalloc(num_nodes * sizeof(int), GFP_KERNEL);
David Teiglandc6ff6692011-03-28 14:17:26 -0500877 }
878 if (!warned)
879 continue;
880 if (nodeid_warned(lkb->lkb_wait_nodeid, num_nodes, warned))
881 continue;
882
883 log_error(ls, "waitwarn %x %lld %d us check connection to "
884 "node %d", lkb->lkb_id, (long long)us,
885 dlm_config.ci_waitwarn_us, lkb->lkb_wait_nodeid);
886 }
887 mutex_unlock(&ls->ls_waiters_mutex);
Jesper Juhl5d708282011-07-10 22:54:31 +0200888 kfree(warned);
David Teiglandc6ff6692011-03-28 14:17:26 -0500889
890 if (debug_expired)
891 log_debug(ls, "scan_waiters %u warn %u over %d us max %lld us",
892 debug_scanned, debug_expired,
893 dlm_config.ci_waitwarn_us, (long long)debug_maxus);
894}
895
David Teiglande7fd4172006-01-18 09:30:29 +0000896/* add/remove lkb from global waiters list of lkb's waiting for
897 a reply from a remote node */
898
David Teiglandc6ff6692011-03-28 14:17:26 -0500899static int add_to_waiters(struct dlm_lkb *lkb, int mstype, int to_nodeid)
David Teiglande7fd4172006-01-18 09:30:29 +0000900{
901 struct dlm_ls *ls = lkb->lkb_resource->res_ls;
David Teiglandef0c2bb2007-03-28 09:56:46 -0500902 int error = 0;
David Teiglande7fd4172006-01-18 09:30:29 +0000903
David Teigland90135922006-01-20 08:47:07 +0000904 mutex_lock(&ls->ls_waiters_mutex);
David Teiglandef0c2bb2007-03-28 09:56:46 -0500905
906 if (is_overlap_unlock(lkb) ||
907 (is_overlap_cancel(lkb) && (mstype == DLM_MSG_CANCEL))) {
908 error = -EINVAL;
David Teiglande7fd4172006-01-18 09:30:29 +0000909 goto out;
910 }
David Teiglandef0c2bb2007-03-28 09:56:46 -0500911
912 if (lkb->lkb_wait_type || is_overlap_cancel(lkb)) {
913 switch (mstype) {
914 case DLM_MSG_UNLOCK:
915 lkb->lkb_flags |= DLM_IFL_OVERLAP_UNLOCK;
916 break;
917 case DLM_MSG_CANCEL:
918 lkb->lkb_flags |= DLM_IFL_OVERLAP_CANCEL;
919 break;
920 default:
921 error = -EBUSY;
922 goto out;
923 }
924 lkb->lkb_wait_count++;
925 hold_lkb(lkb);
926
David Teigland43279e52009-01-28 14:37:54 -0600927 log_debug(ls, "addwait %x cur %d overlap %d count %d f %x",
David Teiglandef0c2bb2007-03-28 09:56:46 -0500928 lkb->lkb_id, lkb->lkb_wait_type, mstype,
929 lkb->lkb_wait_count, lkb->lkb_flags);
930 goto out;
931 }
932
933 DLM_ASSERT(!lkb->lkb_wait_count,
934 dlm_print_lkb(lkb);
935 printk("wait_count %d\n", lkb->lkb_wait_count););
936
937 lkb->lkb_wait_count++;
David Teiglande7fd4172006-01-18 09:30:29 +0000938 lkb->lkb_wait_type = mstype;
David Teiglandc6ff6692011-03-28 14:17:26 -0500939 lkb->lkb_wait_time = ktime_get();
940 lkb->lkb_wait_nodeid = to_nodeid; /* for debugging */
David Teiglandef0c2bb2007-03-28 09:56:46 -0500941 hold_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +0000942 list_add(&lkb->lkb_wait_reply, &ls->ls_waiters);
943 out:
David Teiglandef0c2bb2007-03-28 09:56:46 -0500944 if (error)
David Teigland43279e52009-01-28 14:37:54 -0600945 log_error(ls, "addwait error %x %d flags %x %d %d %s",
David Teiglandef0c2bb2007-03-28 09:56:46 -0500946 lkb->lkb_id, error, lkb->lkb_flags, mstype,
947 lkb->lkb_wait_type, lkb->lkb_resource->res_name);
David Teigland90135922006-01-20 08:47:07 +0000948 mutex_unlock(&ls->ls_waiters_mutex);
David Teiglandef0c2bb2007-03-28 09:56:46 -0500949 return error;
David Teiglande7fd4172006-01-18 09:30:29 +0000950}
951
David Teiglandb790c3b2007-01-24 10:21:33 -0600952/* We clear the RESEND flag because we might be taking an lkb off the waiters
953 list as part of process_requestqueue (e.g. a lookup that has an optimized
954 request reply on the requestqueue) between dlm_recover_waiters_pre() which
955 set RESEND and dlm_recover_waiters_post() */
956
David Teigland43279e52009-01-28 14:37:54 -0600957static int _remove_from_waiters(struct dlm_lkb *lkb, int mstype,
958 struct dlm_message *ms)
David Teiglande7fd4172006-01-18 09:30:29 +0000959{
David Teiglandef0c2bb2007-03-28 09:56:46 -0500960 struct dlm_ls *ls = lkb->lkb_resource->res_ls;
961 int overlap_done = 0;
David Teiglande7fd4172006-01-18 09:30:29 +0000962
David Teiglandef0c2bb2007-03-28 09:56:46 -0500963 if (is_overlap_unlock(lkb) && (mstype == DLM_MSG_UNLOCK_REPLY)) {
David Teigland43279e52009-01-28 14:37:54 -0600964 log_debug(ls, "remwait %x unlock_reply overlap", lkb->lkb_id);
David Teiglandef0c2bb2007-03-28 09:56:46 -0500965 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK;
966 overlap_done = 1;
967 goto out_del;
David Teiglande7fd4172006-01-18 09:30:29 +0000968 }
David Teiglandef0c2bb2007-03-28 09:56:46 -0500969
970 if (is_overlap_cancel(lkb) && (mstype == DLM_MSG_CANCEL_REPLY)) {
David Teigland43279e52009-01-28 14:37:54 -0600971 log_debug(ls, "remwait %x cancel_reply overlap", lkb->lkb_id);
David Teiglandef0c2bb2007-03-28 09:56:46 -0500972 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL;
973 overlap_done = 1;
974 goto out_del;
975 }
976
David Teigland43279e52009-01-28 14:37:54 -0600977 /* Cancel state was preemptively cleared by a successful convert,
978 see next comment, nothing to do. */
979
980 if ((mstype == DLM_MSG_CANCEL_REPLY) &&
981 (lkb->lkb_wait_type != DLM_MSG_CANCEL)) {
982 log_debug(ls, "remwait %x cancel_reply wait_type %d",
983 lkb->lkb_id, lkb->lkb_wait_type);
984 return -1;
985 }
986
987 /* Remove for the convert reply, and premptively remove for the
988 cancel reply. A convert has been granted while there's still
989 an outstanding cancel on it (the cancel is moot and the result
990 in the cancel reply should be 0). We preempt the cancel reply
991 because the app gets the convert result and then can follow up
992 with another op, like convert. This subsequent op would see the
993 lingering state of the cancel and fail with -EBUSY. */
994
995 if ((mstype == DLM_MSG_CONVERT_REPLY) &&
996 (lkb->lkb_wait_type == DLM_MSG_CONVERT) &&
997 is_overlap_cancel(lkb) && ms && !ms->m_result) {
998 log_debug(ls, "remwait %x convert_reply zap overlap_cancel",
999 lkb->lkb_id);
1000 lkb->lkb_wait_type = 0;
1001 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL;
1002 lkb->lkb_wait_count--;
1003 goto out_del;
1004 }
1005
David Teiglandef0c2bb2007-03-28 09:56:46 -05001006 /* N.B. type of reply may not always correspond to type of original
1007 msg due to lookup->request optimization, verify others? */
1008
1009 if (lkb->lkb_wait_type) {
1010 lkb->lkb_wait_type = 0;
1011 goto out_del;
1012 }
1013
David Teigland43279e52009-01-28 14:37:54 -06001014 log_error(ls, "remwait error %x reply %d flags %x no wait_type",
1015 lkb->lkb_id, mstype, lkb->lkb_flags);
David Teiglandef0c2bb2007-03-28 09:56:46 -05001016 return -1;
1017
1018 out_del:
1019 /* the force-unlock/cancel has completed and we haven't recvd a reply
1020 to the op that was in progress prior to the unlock/cancel; we
1021 give up on any reply to the earlier op. FIXME: not sure when/how
1022 this would happen */
1023
1024 if (overlap_done && lkb->lkb_wait_type) {
David Teigland43279e52009-01-28 14:37:54 -06001025 log_error(ls, "remwait error %x reply %d wait_type %d overlap",
David Teiglandef0c2bb2007-03-28 09:56:46 -05001026 lkb->lkb_id, mstype, lkb->lkb_wait_type);
1027 lkb->lkb_wait_count--;
1028 lkb->lkb_wait_type = 0;
1029 }
1030
1031 DLM_ASSERT(lkb->lkb_wait_count, dlm_print_lkb(lkb););
1032
David Teiglandb790c3b2007-01-24 10:21:33 -06001033 lkb->lkb_flags &= ~DLM_IFL_RESEND;
David Teiglandef0c2bb2007-03-28 09:56:46 -05001034 lkb->lkb_wait_count--;
1035 if (!lkb->lkb_wait_count)
1036 list_del_init(&lkb->lkb_wait_reply);
David Teiglande7fd4172006-01-18 09:30:29 +00001037 unhold_lkb(lkb);
David Teiglandef0c2bb2007-03-28 09:56:46 -05001038 return 0;
David Teiglande7fd4172006-01-18 09:30:29 +00001039}
1040
David Teiglandef0c2bb2007-03-28 09:56:46 -05001041static int remove_from_waiters(struct dlm_lkb *lkb, int mstype)
David Teiglande7fd4172006-01-18 09:30:29 +00001042{
1043 struct dlm_ls *ls = lkb->lkb_resource->res_ls;
1044 int error;
1045
David Teigland90135922006-01-20 08:47:07 +00001046 mutex_lock(&ls->ls_waiters_mutex);
David Teigland43279e52009-01-28 14:37:54 -06001047 error = _remove_from_waiters(lkb, mstype, NULL);
David Teigland90135922006-01-20 08:47:07 +00001048 mutex_unlock(&ls->ls_waiters_mutex);
David Teiglande7fd4172006-01-18 09:30:29 +00001049 return error;
1050}
1051
David Teiglandef0c2bb2007-03-28 09:56:46 -05001052/* Handles situations where we might be processing a "fake" or "stub" reply in
1053 which we can't try to take waiters_mutex again. */
1054
1055static int remove_from_waiters_ms(struct dlm_lkb *lkb, struct dlm_message *ms)
1056{
1057 struct dlm_ls *ls = lkb->lkb_resource->res_ls;
1058 int error;
1059
David Teigland2a7ce0e2011-04-04 15:19:59 -05001060 if (ms->m_flags != DLM_IFL_STUB_MS)
David Teiglandef0c2bb2007-03-28 09:56:46 -05001061 mutex_lock(&ls->ls_waiters_mutex);
David Teigland43279e52009-01-28 14:37:54 -06001062 error = _remove_from_waiters(lkb, ms->m_type, ms);
David Teigland2a7ce0e2011-04-04 15:19:59 -05001063 if (ms->m_flags != DLM_IFL_STUB_MS)
David Teiglandef0c2bb2007-03-28 09:56:46 -05001064 mutex_unlock(&ls->ls_waiters_mutex);
1065 return error;
1066}
1067
David Teiglande7fd4172006-01-18 09:30:29 +00001068static void dir_remove(struct dlm_rsb *r)
1069{
1070 int to_nodeid;
1071
1072 if (dlm_no_directory(r->res_ls))
1073 return;
1074
1075 to_nodeid = dlm_dir_nodeid(r);
1076 if (to_nodeid != dlm_our_nodeid())
1077 send_remove(r);
1078 else
1079 dlm_dir_remove_entry(r->res_ls, to_nodeid,
1080 r->res_name, r->res_length);
1081}
1082
1083/* FIXME: shouldn't this be able to exit as soon as one non-due rsb is
1084 found since they are in order of newest to oldest? */
1085
1086static int shrink_bucket(struct dlm_ls *ls, int b)
1087{
1088 struct dlm_rsb *r;
1089 int count = 0, found;
1090
1091 for (;;) {
David Teigland90135922006-01-20 08:47:07 +00001092 found = 0;
David Teiglandc7be7612009-01-07 16:50:41 -06001093 spin_lock(&ls->ls_rsbtbl[b].lock);
David Teiglande7fd4172006-01-18 09:30:29 +00001094 list_for_each_entry_reverse(r, &ls->ls_rsbtbl[b].toss,
1095 res_hashchain) {
1096 if (!time_after_eq(jiffies, r->res_toss_time +
David Teigland68c817a2007-01-09 09:41:48 -06001097 dlm_config.ci_toss_secs * HZ))
David Teiglande7fd4172006-01-18 09:30:29 +00001098 continue;
David Teigland90135922006-01-20 08:47:07 +00001099 found = 1;
David Teiglande7fd4172006-01-18 09:30:29 +00001100 break;
1101 }
1102
1103 if (!found) {
David Teiglandc7be7612009-01-07 16:50:41 -06001104 spin_unlock(&ls->ls_rsbtbl[b].lock);
David Teiglande7fd4172006-01-18 09:30:29 +00001105 break;
1106 }
1107
1108 if (kref_put(&r->res_ref, kill_rsb)) {
1109 list_del(&r->res_hashchain);
David Teiglandc7be7612009-01-07 16:50:41 -06001110 spin_unlock(&ls->ls_rsbtbl[b].lock);
David Teiglande7fd4172006-01-18 09:30:29 +00001111
1112 if (is_master(r))
1113 dir_remove(r);
David Teigland52bda2b2007-11-07 09:06:49 -06001114 dlm_free_rsb(r);
David Teiglande7fd4172006-01-18 09:30:29 +00001115 count++;
1116 } else {
David Teiglandc7be7612009-01-07 16:50:41 -06001117 spin_unlock(&ls->ls_rsbtbl[b].lock);
David Teiglande7fd4172006-01-18 09:30:29 +00001118 log_error(ls, "tossed rsb in use %s", r->res_name);
1119 }
1120 }
1121
1122 return count;
1123}
1124
1125void dlm_scan_rsbs(struct dlm_ls *ls)
1126{
1127 int i;
1128
David Teiglande7fd4172006-01-18 09:30:29 +00001129 for (i = 0; i < ls->ls_rsbtbl_size; i++) {
1130 shrink_bucket(ls, i);
David Teigland85e86ed2007-05-18 08:58:15 -05001131 if (dlm_locking_stopped(ls))
1132 break;
David Teiglande7fd4172006-01-18 09:30:29 +00001133 cond_resched();
1134 }
1135}
1136
David Teigland3ae1acf2007-05-18 08:59:31 -05001137static void add_timeout(struct dlm_lkb *lkb)
1138{
1139 struct dlm_ls *ls = lkb->lkb_resource->res_ls;
1140
David Teiglandeeda4182008-12-09 14:12:21 -06001141 if (is_master_copy(lkb))
David Teigland3ae1acf2007-05-18 08:59:31 -05001142 return;
David Teigland3ae1acf2007-05-18 08:59:31 -05001143
1144 if (test_bit(LSFL_TIMEWARN, &ls->ls_flags) &&
1145 !(lkb->lkb_exflags & DLM_LKF_NODLCKWT)) {
1146 lkb->lkb_flags |= DLM_IFL_WATCH_TIMEWARN;
1147 goto add_it;
1148 }
David Teigland84d8cd62007-05-29 08:44:23 -05001149 if (lkb->lkb_exflags & DLM_LKF_TIMEOUT)
1150 goto add_it;
David Teigland3ae1acf2007-05-18 08:59:31 -05001151 return;
1152
1153 add_it:
1154 DLM_ASSERT(list_empty(&lkb->lkb_time_list), dlm_print_lkb(lkb););
1155 mutex_lock(&ls->ls_timeout_mutex);
1156 hold_lkb(lkb);
David Teigland3ae1acf2007-05-18 08:59:31 -05001157 list_add_tail(&lkb->lkb_time_list, &ls->ls_timeout);
1158 mutex_unlock(&ls->ls_timeout_mutex);
1159}
1160
1161static void del_timeout(struct dlm_lkb *lkb)
1162{
1163 struct dlm_ls *ls = lkb->lkb_resource->res_ls;
1164
1165 mutex_lock(&ls->ls_timeout_mutex);
1166 if (!list_empty(&lkb->lkb_time_list)) {
1167 list_del_init(&lkb->lkb_time_list);
1168 unhold_lkb(lkb);
1169 }
1170 mutex_unlock(&ls->ls_timeout_mutex);
1171}
1172
1173/* FIXME: is it safe to look at lkb_exflags, lkb_flags, lkb_timestamp, and
1174 lkb_lksb_timeout without lock_rsb? Note: we can't lock timeout_mutex
1175 and then lock rsb because of lock ordering in add_timeout. We may need
1176 to specify some special timeout-related bits in the lkb that are just to
1177 be accessed under the timeout_mutex. */
1178
1179void dlm_scan_timeout(struct dlm_ls *ls)
1180{
1181 struct dlm_rsb *r;
1182 struct dlm_lkb *lkb;
1183 int do_cancel, do_warn;
David Teiglandeeda4182008-12-09 14:12:21 -06001184 s64 wait_us;
David Teigland3ae1acf2007-05-18 08:59:31 -05001185
1186 for (;;) {
1187 if (dlm_locking_stopped(ls))
1188 break;
1189
1190 do_cancel = 0;
1191 do_warn = 0;
1192 mutex_lock(&ls->ls_timeout_mutex);
1193 list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) {
1194
David Teiglandeeda4182008-12-09 14:12:21 -06001195 wait_us = ktime_to_us(ktime_sub(ktime_get(),
1196 lkb->lkb_timestamp));
1197
David Teigland3ae1acf2007-05-18 08:59:31 -05001198 if ((lkb->lkb_exflags & DLM_LKF_TIMEOUT) &&
David Teiglandeeda4182008-12-09 14:12:21 -06001199 wait_us >= (lkb->lkb_timeout_cs * 10000))
David Teigland3ae1acf2007-05-18 08:59:31 -05001200 do_cancel = 1;
1201
1202 if ((lkb->lkb_flags & DLM_IFL_WATCH_TIMEWARN) &&
David Teiglandeeda4182008-12-09 14:12:21 -06001203 wait_us >= dlm_config.ci_timewarn_cs * 10000)
David Teigland3ae1acf2007-05-18 08:59:31 -05001204 do_warn = 1;
1205
1206 if (!do_cancel && !do_warn)
1207 continue;
1208 hold_lkb(lkb);
1209 break;
1210 }
1211 mutex_unlock(&ls->ls_timeout_mutex);
1212
1213 if (!do_cancel && !do_warn)
1214 break;
1215
1216 r = lkb->lkb_resource;
1217 hold_rsb(r);
1218 lock_rsb(r);
1219
1220 if (do_warn) {
1221 /* clear flag so we only warn once */
1222 lkb->lkb_flags &= ~DLM_IFL_WATCH_TIMEWARN;
1223 if (!(lkb->lkb_exflags & DLM_LKF_TIMEOUT))
1224 del_timeout(lkb);
1225 dlm_timeout_warn(lkb);
1226 }
1227
1228 if (do_cancel) {
Steven Whitehouseb3cab7b2007-05-29 11:14:21 +01001229 log_debug(ls, "timeout cancel %x node %d %s",
David Teigland639aca42007-05-18 16:02:57 -05001230 lkb->lkb_id, lkb->lkb_nodeid, r->res_name);
David Teigland3ae1acf2007-05-18 08:59:31 -05001231 lkb->lkb_flags &= ~DLM_IFL_WATCH_TIMEWARN;
1232 lkb->lkb_flags |= DLM_IFL_TIMEOUT_CANCEL;
1233 del_timeout(lkb);
1234 _cancel_lock(r, lkb);
1235 }
1236
1237 unlock_rsb(r);
1238 unhold_rsb(r);
1239 dlm_put_lkb(lkb);
1240 }
1241}
1242
1243/* This is only called by dlm_recoverd, and we rely on dlm_ls_stop() stopping
1244 dlm_recoverd before checking/setting ls_recover_begin. */
1245
1246void dlm_adjust_timeouts(struct dlm_ls *ls)
1247{
1248 struct dlm_lkb *lkb;
David Teiglandeeda4182008-12-09 14:12:21 -06001249 u64 adj_us = jiffies_to_usecs(jiffies - ls->ls_recover_begin);
David Teigland3ae1acf2007-05-18 08:59:31 -05001250
1251 ls->ls_recover_begin = 0;
1252 mutex_lock(&ls->ls_timeout_mutex);
1253 list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list)
David Teiglandeeda4182008-12-09 14:12:21 -06001254 lkb->lkb_timestamp = ktime_add_us(lkb->lkb_timestamp, adj_us);
David Teigland3ae1acf2007-05-18 08:59:31 -05001255 mutex_unlock(&ls->ls_timeout_mutex);
David Teiglandc6ff6692011-03-28 14:17:26 -05001256
1257 if (!dlm_config.ci_waitwarn_us)
1258 return;
1259
1260 mutex_lock(&ls->ls_waiters_mutex);
1261 list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) {
1262 if (ktime_to_us(lkb->lkb_wait_time))
1263 lkb->lkb_wait_time = ktime_get();
1264 }
1265 mutex_unlock(&ls->ls_waiters_mutex);
David Teigland3ae1acf2007-05-18 08:59:31 -05001266}
1267
David Teiglande7fd4172006-01-18 09:30:29 +00001268/* lkb is master or local copy */
1269
1270static void set_lvb_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
1271{
1272 int b, len = r->res_ls->ls_lvblen;
1273
1274 /* b=1 lvb returned to caller
1275 b=0 lvb written to rsb or invalidated
1276 b=-1 do nothing */
1277
1278 b = dlm_lvb_operations[lkb->lkb_grmode + 1][lkb->lkb_rqmode + 1];
1279
1280 if (b == 1) {
1281 if (!lkb->lkb_lvbptr)
1282 return;
1283
1284 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK))
1285 return;
1286
1287 if (!r->res_lvbptr)
1288 return;
1289
1290 memcpy(lkb->lkb_lvbptr, r->res_lvbptr, len);
1291 lkb->lkb_lvbseq = r->res_lvbseq;
1292
1293 } else if (b == 0) {
1294 if (lkb->lkb_exflags & DLM_LKF_IVVALBLK) {
1295 rsb_set_flag(r, RSB_VALNOTVALID);
1296 return;
1297 }
1298
1299 if (!lkb->lkb_lvbptr)
1300 return;
1301
1302 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK))
1303 return;
1304
1305 if (!r->res_lvbptr)
David Teigland52bda2b2007-11-07 09:06:49 -06001306 r->res_lvbptr = dlm_allocate_lvb(r->res_ls);
David Teiglande7fd4172006-01-18 09:30:29 +00001307
1308 if (!r->res_lvbptr)
1309 return;
1310
1311 memcpy(r->res_lvbptr, lkb->lkb_lvbptr, len);
1312 r->res_lvbseq++;
1313 lkb->lkb_lvbseq = r->res_lvbseq;
1314 rsb_clear_flag(r, RSB_VALNOTVALID);
1315 }
1316
1317 if (rsb_flag(r, RSB_VALNOTVALID))
1318 lkb->lkb_sbflags |= DLM_SBF_VALNOTVALID;
1319}
1320
1321static void set_lvb_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb)
1322{
1323 if (lkb->lkb_grmode < DLM_LOCK_PW)
1324 return;
1325
1326 if (lkb->lkb_exflags & DLM_LKF_IVVALBLK) {
1327 rsb_set_flag(r, RSB_VALNOTVALID);
1328 return;
1329 }
1330
1331 if (!lkb->lkb_lvbptr)
1332 return;
1333
1334 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK))
1335 return;
1336
1337 if (!r->res_lvbptr)
David Teigland52bda2b2007-11-07 09:06:49 -06001338 r->res_lvbptr = dlm_allocate_lvb(r->res_ls);
David Teiglande7fd4172006-01-18 09:30:29 +00001339
1340 if (!r->res_lvbptr)
1341 return;
1342
1343 memcpy(r->res_lvbptr, lkb->lkb_lvbptr, r->res_ls->ls_lvblen);
1344 r->res_lvbseq++;
1345 rsb_clear_flag(r, RSB_VALNOTVALID);
1346}
1347
1348/* lkb is process copy (pc) */
1349
1350static void set_lvb_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb,
1351 struct dlm_message *ms)
1352{
1353 int b;
1354
1355 if (!lkb->lkb_lvbptr)
1356 return;
1357
1358 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK))
1359 return;
1360
David Teigland597d0ca2006-07-12 16:44:04 -05001361 b = dlm_lvb_operations[lkb->lkb_grmode + 1][lkb->lkb_rqmode + 1];
David Teiglande7fd4172006-01-18 09:30:29 +00001362 if (b == 1) {
1363 int len = receive_extralen(ms);
Al Viroa9cc9152008-01-26 00:02:29 -05001364 if (len > DLM_RESNAME_MAXLEN)
1365 len = DLM_RESNAME_MAXLEN;
David Teiglande7fd4172006-01-18 09:30:29 +00001366 memcpy(lkb->lkb_lvbptr, ms->m_extra, len);
1367 lkb->lkb_lvbseq = ms->m_lvbseq;
1368 }
1369}
1370
1371/* Manipulate lkb's on rsb's convert/granted/waiting queues
1372 remove_lock -- used for unlock, removes lkb from granted
1373 revert_lock -- used for cancel, moves lkb from convert to granted
1374 grant_lock -- used for request and convert, adds lkb to granted or
1375 moves lkb from convert or waiting to granted
1376
1377 Each of these is used for master or local copy lkb's. There is
1378 also a _pc() variation used to make the corresponding change on
1379 a process copy (pc) lkb. */
1380
1381static void _remove_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
1382{
1383 del_lkb(r, lkb);
1384 lkb->lkb_grmode = DLM_LOCK_IV;
1385 /* this unhold undoes the original ref from create_lkb()
1386 so this leads to the lkb being freed */
1387 unhold_lkb(lkb);
1388}
1389
1390static void remove_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
1391{
1392 set_lvb_unlock(r, lkb);
1393 _remove_lock(r, lkb);
1394}
1395
1396static void remove_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb)
1397{
1398 _remove_lock(r, lkb);
1399}
1400
David Teiglandef0c2bb2007-03-28 09:56:46 -05001401/* returns: 0 did nothing
1402 1 moved lock to granted
1403 -1 removed lock */
1404
1405static int revert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
David Teiglande7fd4172006-01-18 09:30:29 +00001406{
David Teiglandef0c2bb2007-03-28 09:56:46 -05001407 int rv = 0;
1408
David Teiglande7fd4172006-01-18 09:30:29 +00001409 lkb->lkb_rqmode = DLM_LOCK_IV;
1410
1411 switch (lkb->lkb_status) {
David Teigland597d0ca2006-07-12 16:44:04 -05001412 case DLM_LKSTS_GRANTED:
1413 break;
David Teiglande7fd4172006-01-18 09:30:29 +00001414 case DLM_LKSTS_CONVERT:
1415 move_lkb(r, lkb, DLM_LKSTS_GRANTED);
David Teiglandef0c2bb2007-03-28 09:56:46 -05001416 rv = 1;
David Teiglande7fd4172006-01-18 09:30:29 +00001417 break;
1418 case DLM_LKSTS_WAITING:
1419 del_lkb(r, lkb);
1420 lkb->lkb_grmode = DLM_LOCK_IV;
1421 /* this unhold undoes the original ref from create_lkb()
1422 so this leads to the lkb being freed */
1423 unhold_lkb(lkb);
David Teiglandef0c2bb2007-03-28 09:56:46 -05001424 rv = -1;
David Teiglande7fd4172006-01-18 09:30:29 +00001425 break;
1426 default:
1427 log_print("invalid status for revert %d", lkb->lkb_status);
1428 }
David Teiglandef0c2bb2007-03-28 09:56:46 -05001429 return rv;
David Teiglande7fd4172006-01-18 09:30:29 +00001430}
1431
David Teiglandef0c2bb2007-03-28 09:56:46 -05001432static int revert_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb)
David Teiglande7fd4172006-01-18 09:30:29 +00001433{
David Teiglandef0c2bb2007-03-28 09:56:46 -05001434 return revert_lock(r, lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00001435}
1436
1437static void _grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
1438{
1439 if (lkb->lkb_grmode != lkb->lkb_rqmode) {
1440 lkb->lkb_grmode = lkb->lkb_rqmode;
1441 if (lkb->lkb_status)
1442 move_lkb(r, lkb, DLM_LKSTS_GRANTED);
1443 else
1444 add_lkb(r, lkb, DLM_LKSTS_GRANTED);
1445 }
1446
1447 lkb->lkb_rqmode = DLM_LOCK_IV;
David Teiglande7fd4172006-01-18 09:30:29 +00001448}
1449
1450static void grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
1451{
1452 set_lvb_lock(r, lkb);
1453 _grant_lock(r, lkb);
1454 lkb->lkb_highbast = 0;
1455}
1456
1457static void grant_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb,
1458 struct dlm_message *ms)
1459{
1460 set_lvb_lock_pc(r, lkb, ms);
1461 _grant_lock(r, lkb);
1462}
1463
1464/* called by grant_pending_locks() which means an async grant message must
1465 be sent to the requesting node in addition to granting the lock if the
1466 lkb belongs to a remote node. */
1467
1468static void grant_lock_pending(struct dlm_rsb *r, struct dlm_lkb *lkb)
1469{
1470 grant_lock(r, lkb);
1471 if (is_master_copy(lkb))
1472 send_grant(r, lkb);
1473 else
1474 queue_cast(r, lkb, 0);
1475}
1476
David Teigland7d3c1fe2007-04-19 10:30:41 -05001477/* The special CONVDEADLK, ALTPR and ALTCW flags allow the master to
1478 change the granted/requested modes. We're munging things accordingly in
1479 the process copy.
1480 CONVDEADLK: our grmode may have been forced down to NL to resolve a
1481 conversion deadlock
1482 ALTPR/ALTCW: our rqmode may have been changed to PR or CW to become
1483 compatible with other granted locks */
1484
David Teigland2a7ce0e2011-04-04 15:19:59 -05001485static void munge_demoted(struct dlm_lkb *lkb)
David Teigland7d3c1fe2007-04-19 10:30:41 -05001486{
David Teigland7d3c1fe2007-04-19 10:30:41 -05001487 if (lkb->lkb_rqmode == DLM_LOCK_IV || lkb->lkb_grmode == DLM_LOCK_IV) {
1488 log_print("munge_demoted %x invalid modes gr %d rq %d",
1489 lkb->lkb_id, lkb->lkb_grmode, lkb->lkb_rqmode);
1490 return;
1491 }
1492
1493 lkb->lkb_grmode = DLM_LOCK_NL;
1494}
1495
1496static void munge_altmode(struct dlm_lkb *lkb, struct dlm_message *ms)
1497{
1498 if (ms->m_type != DLM_MSG_REQUEST_REPLY &&
1499 ms->m_type != DLM_MSG_GRANT) {
1500 log_print("munge_altmode %x invalid reply type %d",
1501 lkb->lkb_id, ms->m_type);
1502 return;
1503 }
1504
1505 if (lkb->lkb_exflags & DLM_LKF_ALTPR)
1506 lkb->lkb_rqmode = DLM_LOCK_PR;
1507 else if (lkb->lkb_exflags & DLM_LKF_ALTCW)
1508 lkb->lkb_rqmode = DLM_LOCK_CW;
1509 else {
1510 log_print("munge_altmode invalid exflags %x", lkb->lkb_exflags);
1511 dlm_print_lkb(lkb);
1512 }
1513}
1514
David Teiglande7fd4172006-01-18 09:30:29 +00001515static inline int first_in_list(struct dlm_lkb *lkb, struct list_head *head)
1516{
1517 struct dlm_lkb *first = list_entry(head->next, struct dlm_lkb,
1518 lkb_statequeue);
1519 if (lkb->lkb_id == first->lkb_id)
David Teigland90135922006-01-20 08:47:07 +00001520 return 1;
David Teiglande7fd4172006-01-18 09:30:29 +00001521
David Teigland90135922006-01-20 08:47:07 +00001522 return 0;
David Teiglande7fd4172006-01-18 09:30:29 +00001523}
1524
David Teiglande7fd4172006-01-18 09:30:29 +00001525/* Check if the given lkb conflicts with another lkb on the queue. */
1526
1527static int queue_conflict(struct list_head *head, struct dlm_lkb *lkb)
1528{
1529 struct dlm_lkb *this;
1530
1531 list_for_each_entry(this, head, lkb_statequeue) {
1532 if (this == lkb)
1533 continue;
David Teigland3bcd3682006-02-23 09:56:38 +00001534 if (!modes_compat(this, lkb))
David Teigland90135922006-01-20 08:47:07 +00001535 return 1;
David Teiglande7fd4172006-01-18 09:30:29 +00001536 }
David Teigland90135922006-01-20 08:47:07 +00001537 return 0;
David Teiglande7fd4172006-01-18 09:30:29 +00001538}
1539
1540/*
1541 * "A conversion deadlock arises with a pair of lock requests in the converting
1542 * queue for one resource. The granted mode of each lock blocks the requested
1543 * mode of the other lock."
1544 *
David Teiglandc85d65e2007-05-18 09:01:26 -05001545 * Part 2: if the granted mode of lkb is preventing an earlier lkb in the
1546 * convert queue from being granted, then deadlk/demote lkb.
David Teiglande7fd4172006-01-18 09:30:29 +00001547 *
1548 * Example:
1549 * Granted Queue: empty
1550 * Convert Queue: NL->EX (first lock)
1551 * PR->EX (second lock)
1552 *
1553 * The first lock can't be granted because of the granted mode of the second
1554 * lock and the second lock can't be granted because it's not first in the
David Teiglandc85d65e2007-05-18 09:01:26 -05001555 * list. We either cancel lkb's conversion (PR->EX) and return EDEADLK, or we
1556 * demote the granted mode of lkb (from PR to NL) if it has the CONVDEADLK
1557 * flag set and return DEMOTED in the lksb flags.
David Teiglande7fd4172006-01-18 09:30:29 +00001558 *
David Teiglandc85d65e2007-05-18 09:01:26 -05001559 * Originally, this function detected conv-deadlk in a more limited scope:
1560 * - if !modes_compat(lkb1, lkb2) && !modes_compat(lkb2, lkb1), or
1561 * - if lkb1 was the first entry in the queue (not just earlier), and was
1562 * blocked by the granted mode of lkb2, and there was nothing on the
1563 * granted queue preventing lkb1 from being granted immediately, i.e.
1564 * lkb2 was the only thing preventing lkb1 from being granted.
1565 *
1566 * That second condition meant we'd only say there was conv-deadlk if
1567 * resolving it (by demotion) would lead to the first lock on the convert
1568 * queue being granted right away. It allowed conversion deadlocks to exist
1569 * between locks on the convert queue while they couldn't be granted anyway.
1570 *
1571 * Now, we detect and take action on conversion deadlocks immediately when
1572 * they're created, even if they may not be immediately consequential. If
1573 * lkb1 exists anywhere in the convert queue and lkb2 comes in with a granted
1574 * mode that would prevent lkb1's conversion from being granted, we do a
1575 * deadlk/demote on lkb2 right away and don't let it onto the convert queue.
1576 * I think this means that the lkb_is_ahead condition below should always
1577 * be zero, i.e. there will never be conv-deadlk between two locks that are
1578 * both already on the convert queue.
David Teiglande7fd4172006-01-18 09:30:29 +00001579 */
1580
David Teiglandc85d65e2007-05-18 09:01:26 -05001581static int conversion_deadlock_detect(struct dlm_rsb *r, struct dlm_lkb *lkb2)
David Teiglande7fd4172006-01-18 09:30:29 +00001582{
David Teiglandc85d65e2007-05-18 09:01:26 -05001583 struct dlm_lkb *lkb1;
1584 int lkb_is_ahead = 0;
David Teiglande7fd4172006-01-18 09:30:29 +00001585
David Teiglandc85d65e2007-05-18 09:01:26 -05001586 list_for_each_entry(lkb1, &r->res_convertqueue, lkb_statequeue) {
1587 if (lkb1 == lkb2) {
1588 lkb_is_ahead = 1;
David Teiglande7fd4172006-01-18 09:30:29 +00001589 continue;
1590 }
1591
David Teiglandc85d65e2007-05-18 09:01:26 -05001592 if (!lkb_is_ahead) {
1593 if (!modes_compat(lkb2, lkb1))
1594 return 1;
1595 } else {
1596 if (!modes_compat(lkb2, lkb1) &&
1597 !modes_compat(lkb1, lkb2))
1598 return 1;
1599 }
David Teiglande7fd4172006-01-18 09:30:29 +00001600 }
David Teigland90135922006-01-20 08:47:07 +00001601 return 0;
David Teiglande7fd4172006-01-18 09:30:29 +00001602}
1603
1604/*
1605 * Return 1 if the lock can be granted, 0 otherwise.
1606 * Also detect and resolve conversion deadlocks.
1607 *
1608 * lkb is the lock to be granted
1609 *
1610 * now is 1 if the function is being called in the context of the
1611 * immediate request, it is 0 if called later, after the lock has been
1612 * queued.
1613 *
1614 * References are from chapter 6 of "VAXcluster Principles" by Roy Davis
1615 */
1616
1617static int _can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now)
1618{
1619 int8_t conv = (lkb->lkb_grmode != DLM_LOCK_IV);
1620
1621 /*
1622 * 6-10: Version 5.4 introduced an option to address the phenomenon of
1623 * a new request for a NL mode lock being blocked.
1624 *
1625 * 6-11: If the optional EXPEDITE flag is used with the new NL mode
1626 * request, then it would be granted. In essence, the use of this flag
1627 * tells the Lock Manager to expedite theis request by not considering
1628 * what may be in the CONVERTING or WAITING queues... As of this
1629 * writing, the EXPEDITE flag can be used only with new requests for NL
1630 * mode locks. This flag is not valid for conversion requests.
1631 *
1632 * A shortcut. Earlier checks return an error if EXPEDITE is used in a
1633 * conversion or used with a non-NL requested mode. We also know an
1634 * EXPEDITE request is always granted immediately, so now must always
1635 * be 1. The full condition to grant an expedite request: (now &&
1636 * !conv && lkb->rqmode == DLM_LOCK_NL && (flags & EXPEDITE)) can
1637 * therefore be shortened to just checking the flag.
1638 */
1639
1640 if (lkb->lkb_exflags & DLM_LKF_EXPEDITE)
David Teigland90135922006-01-20 08:47:07 +00001641 return 1;
David Teiglande7fd4172006-01-18 09:30:29 +00001642
1643 /*
1644 * A shortcut. Without this, !queue_conflict(grantqueue, lkb) would be
1645 * added to the remaining conditions.
1646 */
1647
1648 if (queue_conflict(&r->res_grantqueue, lkb))
1649 goto out;
1650
1651 /*
1652 * 6-3: By default, a conversion request is immediately granted if the
1653 * requested mode is compatible with the modes of all other granted
1654 * locks
1655 */
1656
1657 if (queue_conflict(&r->res_convertqueue, lkb))
1658 goto out;
1659
1660 /*
1661 * 6-5: But the default algorithm for deciding whether to grant or
1662 * queue conversion requests does not by itself guarantee that such
1663 * requests are serviced on a "first come first serve" basis. This, in
1664 * turn, can lead to a phenomenon known as "indefinate postponement".
1665 *
1666 * 6-7: This issue is dealt with by using the optional QUECVT flag with
1667 * the system service employed to request a lock conversion. This flag
1668 * forces certain conversion requests to be queued, even if they are
1669 * compatible with the granted modes of other locks on the same
1670 * resource. Thus, the use of this flag results in conversion requests
1671 * being ordered on a "first come first servce" basis.
1672 *
1673 * DCT: This condition is all about new conversions being able to occur
1674 * "in place" while the lock remains on the granted queue (assuming
1675 * nothing else conflicts.) IOW if QUECVT isn't set, a conversion
1676 * doesn't _have_ to go onto the convert queue where it's processed in
1677 * order. The "now" variable is necessary to distinguish converts
1678 * being received and processed for the first time now, because once a
1679 * convert is moved to the conversion queue the condition below applies
1680 * requiring fifo granting.
1681 */
1682
1683 if (now && conv && !(lkb->lkb_exflags & DLM_LKF_QUECVT))
David Teigland90135922006-01-20 08:47:07 +00001684 return 1;
David Teiglande7fd4172006-01-18 09:30:29 +00001685
1686 /*
David Teigland3bcd3682006-02-23 09:56:38 +00001687 * The NOORDER flag is set to avoid the standard vms rules on grant
1688 * order.
David Teiglande7fd4172006-01-18 09:30:29 +00001689 */
1690
1691 if (lkb->lkb_exflags & DLM_LKF_NOORDER)
David Teigland90135922006-01-20 08:47:07 +00001692 return 1;
David Teiglande7fd4172006-01-18 09:30:29 +00001693
1694 /*
1695 * 6-3: Once in that queue [CONVERTING], a conversion request cannot be
1696 * granted until all other conversion requests ahead of it are granted
1697 * and/or canceled.
1698 */
1699
1700 if (!now && conv && first_in_list(lkb, &r->res_convertqueue))
David Teigland90135922006-01-20 08:47:07 +00001701 return 1;
David Teiglande7fd4172006-01-18 09:30:29 +00001702
1703 /*
1704 * 6-4: By default, a new request is immediately granted only if all
1705 * three of the following conditions are satisfied when the request is
1706 * issued:
1707 * - The queue of ungranted conversion requests for the resource is
1708 * empty.
1709 * - The queue of ungranted new requests for the resource is empty.
1710 * - The mode of the new request is compatible with the most
1711 * restrictive mode of all granted locks on the resource.
1712 */
1713
1714 if (now && !conv && list_empty(&r->res_convertqueue) &&
1715 list_empty(&r->res_waitqueue))
David Teigland90135922006-01-20 08:47:07 +00001716 return 1;
David Teiglande7fd4172006-01-18 09:30:29 +00001717
1718 /*
1719 * 6-4: Once a lock request is in the queue of ungranted new requests,
1720 * it cannot be granted until the queue of ungranted conversion
1721 * requests is empty, all ungranted new requests ahead of it are
1722 * granted and/or canceled, and it is compatible with the granted mode
1723 * of the most restrictive lock granted on the resource.
1724 */
1725
1726 if (!now && !conv && list_empty(&r->res_convertqueue) &&
1727 first_in_list(lkb, &r->res_waitqueue))
David Teigland90135922006-01-20 08:47:07 +00001728 return 1;
David Teiglande7fd4172006-01-18 09:30:29 +00001729 out:
David Teigland90135922006-01-20 08:47:07 +00001730 return 0;
David Teiglande7fd4172006-01-18 09:30:29 +00001731}
1732
David Teiglandc85d65e2007-05-18 09:01:26 -05001733static int can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now,
1734 int *err)
David Teiglande7fd4172006-01-18 09:30:29 +00001735{
David Teiglande7fd4172006-01-18 09:30:29 +00001736 int rv;
1737 int8_t alt = 0, rqmode = lkb->lkb_rqmode;
David Teiglandc85d65e2007-05-18 09:01:26 -05001738 int8_t is_convert = (lkb->lkb_grmode != DLM_LOCK_IV);
1739
1740 if (err)
1741 *err = 0;
David Teiglande7fd4172006-01-18 09:30:29 +00001742
1743 rv = _can_be_granted(r, lkb, now);
1744 if (rv)
1745 goto out;
1746
David Teiglandc85d65e2007-05-18 09:01:26 -05001747 /*
1748 * The CONVDEADLK flag is non-standard and tells the dlm to resolve
1749 * conversion deadlocks by demoting grmode to NL, otherwise the dlm
1750 * cancels one of the locks.
1751 */
David Teiglande7fd4172006-01-18 09:30:29 +00001752
David Teiglandc85d65e2007-05-18 09:01:26 -05001753 if (is_convert && can_be_queued(lkb) &&
1754 conversion_deadlock_detect(r, lkb)) {
1755 if (lkb->lkb_exflags & DLM_LKF_CONVDEADLK) {
1756 lkb->lkb_grmode = DLM_LOCK_NL;
1757 lkb->lkb_sbflags |= DLM_SBF_DEMOTED;
1758 } else if (!(lkb->lkb_exflags & DLM_LKF_NODLCKWT)) {
1759 if (err)
1760 *err = -EDEADLK;
1761 else {
1762 log_print("can_be_granted deadlock %x now %d",
1763 lkb->lkb_id, now);
1764 dlm_dump_rsb(r);
1765 }
1766 }
1767 goto out;
1768 }
1769
1770 /*
1771 * The ALTPR and ALTCW flags are non-standard and tell the dlm to try
1772 * to grant a request in a mode other than the normal rqmode. It's a
1773 * simple way to provide a big optimization to applications that can
1774 * use them.
1775 */
1776
1777 if (rqmode != DLM_LOCK_PR && (lkb->lkb_exflags & DLM_LKF_ALTPR))
David Teiglande7fd4172006-01-18 09:30:29 +00001778 alt = DLM_LOCK_PR;
David Teiglandc85d65e2007-05-18 09:01:26 -05001779 else if (rqmode != DLM_LOCK_CW && (lkb->lkb_exflags & DLM_LKF_ALTCW))
David Teiglande7fd4172006-01-18 09:30:29 +00001780 alt = DLM_LOCK_CW;
1781
1782 if (alt) {
1783 lkb->lkb_rqmode = alt;
1784 rv = _can_be_granted(r, lkb, now);
1785 if (rv)
1786 lkb->lkb_sbflags |= DLM_SBF_ALTMODE;
1787 else
1788 lkb->lkb_rqmode = rqmode;
1789 }
1790 out:
1791 return rv;
1792}
1793
David Teiglandc85d65e2007-05-18 09:01:26 -05001794/* FIXME: I don't think that can_be_granted() can/will demote or find deadlock
1795 for locks pending on the convert list. Once verified (watch for these
1796 log_prints), we should be able to just call _can_be_granted() and not
1797 bother with the demote/deadlk cases here (and there's no easy way to deal
1798 with a deadlk here, we'd have to generate something like grant_lock with
1799 the deadlk error.) */
1800
David Teigland36509252007-08-07 09:44:48 -05001801/* Returns the highest requested mode of all blocked conversions; sets
1802 cw if there's a blocked conversion to DLM_LOCK_CW. */
David Teiglandc85d65e2007-05-18 09:01:26 -05001803
David Teigland36509252007-08-07 09:44:48 -05001804static int grant_pending_convert(struct dlm_rsb *r, int high, int *cw)
David Teiglande7fd4172006-01-18 09:30:29 +00001805{
1806 struct dlm_lkb *lkb, *s;
1807 int hi, demoted, quit, grant_restart, demote_restart;
David Teiglandc85d65e2007-05-18 09:01:26 -05001808 int deadlk;
David Teiglande7fd4172006-01-18 09:30:29 +00001809
1810 quit = 0;
1811 restart:
1812 grant_restart = 0;
1813 demote_restart = 0;
1814 hi = DLM_LOCK_IV;
1815
1816 list_for_each_entry_safe(lkb, s, &r->res_convertqueue, lkb_statequeue) {
1817 demoted = is_demoted(lkb);
David Teiglandc85d65e2007-05-18 09:01:26 -05001818 deadlk = 0;
1819
1820 if (can_be_granted(r, lkb, 0, &deadlk)) {
David Teiglande7fd4172006-01-18 09:30:29 +00001821 grant_lock_pending(r, lkb);
1822 grant_restart = 1;
David Teiglandc85d65e2007-05-18 09:01:26 -05001823 continue;
David Teiglande7fd4172006-01-18 09:30:29 +00001824 }
David Teiglandc85d65e2007-05-18 09:01:26 -05001825
1826 if (!demoted && is_demoted(lkb)) {
1827 log_print("WARN: pending demoted %x node %d %s",
1828 lkb->lkb_id, lkb->lkb_nodeid, r->res_name);
1829 demote_restart = 1;
1830 continue;
1831 }
1832
1833 if (deadlk) {
1834 log_print("WARN: pending deadlock %x node %d %s",
1835 lkb->lkb_id, lkb->lkb_nodeid, r->res_name);
1836 dlm_dump_rsb(r);
1837 continue;
1838 }
1839
1840 hi = max_t(int, lkb->lkb_rqmode, hi);
David Teigland36509252007-08-07 09:44:48 -05001841
1842 if (cw && lkb->lkb_rqmode == DLM_LOCK_CW)
1843 *cw = 1;
David Teiglande7fd4172006-01-18 09:30:29 +00001844 }
1845
1846 if (grant_restart)
1847 goto restart;
1848 if (demote_restart && !quit) {
1849 quit = 1;
1850 goto restart;
1851 }
1852
1853 return max_t(int, high, hi);
1854}
1855
David Teigland36509252007-08-07 09:44:48 -05001856static int grant_pending_wait(struct dlm_rsb *r, int high, int *cw)
David Teiglande7fd4172006-01-18 09:30:29 +00001857{
1858 struct dlm_lkb *lkb, *s;
1859
1860 list_for_each_entry_safe(lkb, s, &r->res_waitqueue, lkb_statequeue) {
David Teiglandc85d65e2007-05-18 09:01:26 -05001861 if (can_be_granted(r, lkb, 0, NULL))
David Teiglande7fd4172006-01-18 09:30:29 +00001862 grant_lock_pending(r, lkb);
David Teigland36509252007-08-07 09:44:48 -05001863 else {
David Teiglande7fd4172006-01-18 09:30:29 +00001864 high = max_t(int, lkb->lkb_rqmode, high);
David Teigland36509252007-08-07 09:44:48 -05001865 if (lkb->lkb_rqmode == DLM_LOCK_CW)
1866 *cw = 1;
1867 }
David Teiglande7fd4172006-01-18 09:30:29 +00001868 }
1869
1870 return high;
1871}
1872
David Teigland36509252007-08-07 09:44:48 -05001873/* cw of 1 means there's a lock with a rqmode of DLM_LOCK_CW that's blocked
1874 on either the convert or waiting queue.
1875 high is the largest rqmode of all locks blocked on the convert or
1876 waiting queue. */
1877
1878static int lock_requires_bast(struct dlm_lkb *gr, int high, int cw)
1879{
1880 if (gr->lkb_grmode == DLM_LOCK_PR && cw) {
1881 if (gr->lkb_highbast < DLM_LOCK_EX)
1882 return 1;
1883 return 0;
1884 }
1885
1886 if (gr->lkb_highbast < high &&
1887 !__dlm_compat_matrix[gr->lkb_grmode+1][high+1])
1888 return 1;
1889 return 0;
1890}
1891
David Teiglande7fd4172006-01-18 09:30:29 +00001892static void grant_pending_locks(struct dlm_rsb *r)
1893{
1894 struct dlm_lkb *lkb, *s;
1895 int high = DLM_LOCK_IV;
David Teigland36509252007-08-07 09:44:48 -05001896 int cw = 0;
David Teiglande7fd4172006-01-18 09:30:29 +00001897
David Teiglanda345da32006-08-18 11:54:25 -05001898 DLM_ASSERT(is_master(r), dlm_dump_rsb(r););
David Teiglande7fd4172006-01-18 09:30:29 +00001899
David Teigland36509252007-08-07 09:44:48 -05001900 high = grant_pending_convert(r, high, &cw);
1901 high = grant_pending_wait(r, high, &cw);
David Teiglande7fd4172006-01-18 09:30:29 +00001902
1903 if (high == DLM_LOCK_IV)
1904 return;
1905
1906 /*
1907 * If there are locks left on the wait/convert queue then send blocking
1908 * ASTs to granted locks based on the largest requested mode (high)
David Teigland36509252007-08-07 09:44:48 -05001909 * found above.
David Teiglande7fd4172006-01-18 09:30:29 +00001910 */
1911
1912 list_for_each_entry_safe(lkb, s, &r->res_grantqueue, lkb_statequeue) {
David Teiglande5dae542008-02-06 00:35:45 -06001913 if (lkb->lkb_bastfn && lock_requires_bast(lkb, high, cw)) {
David Teigland329fc4c2008-05-20 12:18:10 -05001914 if (cw && high == DLM_LOCK_PR &&
1915 lkb->lkb_grmode == DLM_LOCK_PR)
David Teigland36509252007-08-07 09:44:48 -05001916 queue_bast(r, lkb, DLM_LOCK_CW);
1917 else
1918 queue_bast(r, lkb, high);
David Teiglande7fd4172006-01-18 09:30:29 +00001919 lkb->lkb_highbast = high;
1920 }
1921 }
1922}
1923
David Teigland36509252007-08-07 09:44:48 -05001924static int modes_require_bast(struct dlm_lkb *gr, struct dlm_lkb *rq)
1925{
1926 if ((gr->lkb_grmode == DLM_LOCK_PR && rq->lkb_rqmode == DLM_LOCK_CW) ||
1927 (gr->lkb_grmode == DLM_LOCK_CW && rq->lkb_rqmode == DLM_LOCK_PR)) {
1928 if (gr->lkb_highbast < DLM_LOCK_EX)
1929 return 1;
1930 return 0;
1931 }
1932
1933 if (gr->lkb_highbast < rq->lkb_rqmode && !modes_compat(gr, rq))
1934 return 1;
1935 return 0;
1936}
1937
David Teiglande7fd4172006-01-18 09:30:29 +00001938static void send_bast_queue(struct dlm_rsb *r, struct list_head *head,
1939 struct dlm_lkb *lkb)
1940{
1941 struct dlm_lkb *gr;
1942
1943 list_for_each_entry(gr, head, lkb_statequeue) {
Steven Whitehouse314dd2a2010-09-03 10:07:48 -05001944 /* skip self when sending basts to convertqueue */
1945 if (gr == lkb)
1946 continue;
David Teiglande5dae542008-02-06 00:35:45 -06001947 if (gr->lkb_bastfn && modes_require_bast(gr, lkb)) {
David Teiglande7fd4172006-01-18 09:30:29 +00001948 queue_bast(r, gr, lkb->lkb_rqmode);
1949 gr->lkb_highbast = lkb->lkb_rqmode;
1950 }
1951 }
1952}
1953
1954static void send_blocking_asts(struct dlm_rsb *r, struct dlm_lkb *lkb)
1955{
1956 send_bast_queue(r, &r->res_grantqueue, lkb);
1957}
1958
1959static void send_blocking_asts_all(struct dlm_rsb *r, struct dlm_lkb *lkb)
1960{
1961 send_bast_queue(r, &r->res_grantqueue, lkb);
1962 send_bast_queue(r, &r->res_convertqueue, lkb);
1963}
1964
1965/* set_master(r, lkb) -- set the master nodeid of a resource
1966
1967 The purpose of this function is to set the nodeid field in the given
1968 lkb using the nodeid field in the given rsb. If the rsb's nodeid is
1969 known, it can just be copied to the lkb and the function will return
1970 0. If the rsb's nodeid is _not_ known, it needs to be looked up
1971 before it can be copied to the lkb.
1972
1973 When the rsb nodeid is being looked up remotely, the initial lkb
1974 causing the lookup is kept on the ls_waiters list waiting for the
1975 lookup reply. Other lkb's waiting for the same rsb lookup are kept
1976 on the rsb's res_lookup list until the master is verified.
1977
1978 Return values:
1979 0: nodeid is set in rsb/lkb and the caller should go ahead and use it
1980 1: the rsb master is not available and the lkb has been placed on
1981 a wait queue
1982*/
1983
1984static int set_master(struct dlm_rsb *r, struct dlm_lkb *lkb)
1985{
1986 struct dlm_ls *ls = r->res_ls;
David Teigland755b5eb2008-01-09 10:37:39 -06001987 int i, error, dir_nodeid, ret_nodeid, our_nodeid = dlm_our_nodeid();
David Teiglande7fd4172006-01-18 09:30:29 +00001988
1989 if (rsb_flag(r, RSB_MASTER_UNCERTAIN)) {
1990 rsb_clear_flag(r, RSB_MASTER_UNCERTAIN);
1991 r->res_first_lkid = lkb->lkb_id;
1992 lkb->lkb_nodeid = r->res_nodeid;
1993 return 0;
1994 }
1995
1996 if (r->res_first_lkid && r->res_first_lkid != lkb->lkb_id) {
1997 list_add_tail(&lkb->lkb_rsb_lookup, &r->res_lookup);
1998 return 1;
1999 }
2000
2001 if (r->res_nodeid == 0) {
2002 lkb->lkb_nodeid = 0;
2003 return 0;
2004 }
2005
2006 if (r->res_nodeid > 0) {
2007 lkb->lkb_nodeid = r->res_nodeid;
2008 return 0;
2009 }
2010
David Teiglanda345da32006-08-18 11:54:25 -05002011 DLM_ASSERT(r->res_nodeid == -1, dlm_dump_rsb(r););
David Teiglande7fd4172006-01-18 09:30:29 +00002012
2013 dir_nodeid = dlm_dir_nodeid(r);
2014
2015 if (dir_nodeid != our_nodeid) {
2016 r->res_first_lkid = lkb->lkb_id;
2017 send_lookup(r, lkb);
2018 return 1;
2019 }
2020
David Teigland755b5eb2008-01-09 10:37:39 -06002021 for (i = 0; i < 2; i++) {
David Teiglande7fd4172006-01-18 09:30:29 +00002022 /* It's possible for dlm_scand to remove an old rsb for
2023 this same resource from the toss list, us to create
2024 a new one, look up the master locally, and find it
2025 already exists just before dlm_scand does the
2026 dir_remove() on the previous rsb. */
2027
2028 error = dlm_dir_lookup(ls, our_nodeid, r->res_name,
2029 r->res_length, &ret_nodeid);
2030 if (!error)
2031 break;
2032 log_debug(ls, "dir_lookup error %d %s", error, r->res_name);
2033 schedule();
2034 }
David Teigland755b5eb2008-01-09 10:37:39 -06002035 if (error && error != -EEXIST)
2036 return error;
David Teiglande7fd4172006-01-18 09:30:29 +00002037
2038 if (ret_nodeid == our_nodeid) {
2039 r->res_first_lkid = 0;
2040 r->res_nodeid = 0;
2041 lkb->lkb_nodeid = 0;
2042 } else {
2043 r->res_first_lkid = lkb->lkb_id;
2044 r->res_nodeid = ret_nodeid;
2045 lkb->lkb_nodeid = ret_nodeid;
2046 }
2047 return 0;
2048}
2049
2050static void process_lookup_list(struct dlm_rsb *r)
2051{
2052 struct dlm_lkb *lkb, *safe;
2053
2054 list_for_each_entry_safe(lkb, safe, &r->res_lookup, lkb_rsb_lookup) {
David Teiglandef0c2bb2007-03-28 09:56:46 -05002055 list_del_init(&lkb->lkb_rsb_lookup);
David Teiglande7fd4172006-01-18 09:30:29 +00002056 _request_lock(r, lkb);
2057 schedule();
2058 }
2059}
2060
2061/* confirm_master -- confirm (or deny) an rsb's master nodeid */
2062
2063static void confirm_master(struct dlm_rsb *r, int error)
2064{
2065 struct dlm_lkb *lkb;
2066
2067 if (!r->res_first_lkid)
2068 return;
2069
2070 switch (error) {
2071 case 0:
2072 case -EINPROGRESS:
2073 r->res_first_lkid = 0;
2074 process_lookup_list(r);
2075 break;
2076
2077 case -EAGAIN:
David Teiglandaec64e12008-01-08 15:37:47 -06002078 case -EBADR:
2079 case -ENOTBLK:
2080 /* the remote request failed and won't be retried (it was
2081 a NOQUEUE, or has been canceled/unlocked); make a waiting
2082 lkb the first_lkid */
David Teiglande7fd4172006-01-18 09:30:29 +00002083
2084 r->res_first_lkid = 0;
2085
2086 if (!list_empty(&r->res_lookup)) {
2087 lkb = list_entry(r->res_lookup.next, struct dlm_lkb,
2088 lkb_rsb_lookup);
David Teiglandef0c2bb2007-03-28 09:56:46 -05002089 list_del_init(&lkb->lkb_rsb_lookup);
David Teiglande7fd4172006-01-18 09:30:29 +00002090 r->res_first_lkid = lkb->lkb_id;
2091 _request_lock(r, lkb);
David Teigland761b9d32008-02-21 11:25:42 -06002092 }
David Teiglande7fd4172006-01-18 09:30:29 +00002093 break;
2094
2095 default:
2096 log_error(r->res_ls, "confirm_master unknown error %d", error);
2097 }
2098}
2099
2100static int set_lock_args(int mode, struct dlm_lksb *lksb, uint32_t flags,
David Teiglande5dae542008-02-06 00:35:45 -06002101 int namelen, unsigned long timeout_cs,
2102 void (*ast) (void *astparam),
2103 void *astparam,
2104 void (*bast) (void *astparam, int mode),
2105 struct dlm_args *args)
David Teiglande7fd4172006-01-18 09:30:29 +00002106{
2107 int rv = -EINVAL;
2108
2109 /* check for invalid arg usage */
2110
2111 if (mode < 0 || mode > DLM_LOCK_EX)
2112 goto out;
2113
2114 if (!(flags & DLM_LKF_CONVERT) && (namelen > DLM_RESNAME_MAXLEN))
2115 goto out;
2116
2117 if (flags & DLM_LKF_CANCEL)
2118 goto out;
2119
2120 if (flags & DLM_LKF_QUECVT && !(flags & DLM_LKF_CONVERT))
2121 goto out;
2122
2123 if (flags & DLM_LKF_CONVDEADLK && !(flags & DLM_LKF_CONVERT))
2124 goto out;
2125
2126 if (flags & DLM_LKF_CONVDEADLK && flags & DLM_LKF_NOQUEUE)
2127 goto out;
2128
2129 if (flags & DLM_LKF_EXPEDITE && flags & DLM_LKF_CONVERT)
2130 goto out;
2131
2132 if (flags & DLM_LKF_EXPEDITE && flags & DLM_LKF_QUECVT)
2133 goto out;
2134
2135 if (flags & DLM_LKF_EXPEDITE && flags & DLM_LKF_NOQUEUE)
2136 goto out;
2137
2138 if (flags & DLM_LKF_EXPEDITE && mode != DLM_LOCK_NL)
2139 goto out;
2140
2141 if (!ast || !lksb)
2142 goto out;
2143
2144 if (flags & DLM_LKF_VALBLK && !lksb->sb_lvbptr)
2145 goto out;
2146
David Teiglande7fd4172006-01-18 09:30:29 +00002147 if (flags & DLM_LKF_CONVERT && !lksb->sb_lkid)
2148 goto out;
2149
2150 /* these args will be copied to the lkb in validate_lock_args,
2151 it cannot be done now because when converting locks, fields in
2152 an active lkb cannot be modified before locking the rsb */
2153
2154 args->flags = flags;
David Teiglande5dae542008-02-06 00:35:45 -06002155 args->astfn = ast;
2156 args->astparam = astparam;
2157 args->bastfn = bast;
David Teiglandd7db9232007-05-18 09:00:32 -05002158 args->timeout = timeout_cs;
David Teiglande7fd4172006-01-18 09:30:29 +00002159 args->mode = mode;
2160 args->lksb = lksb;
David Teiglande7fd4172006-01-18 09:30:29 +00002161 rv = 0;
2162 out:
2163 return rv;
2164}
2165
2166static int set_unlock_args(uint32_t flags, void *astarg, struct dlm_args *args)
2167{
2168 if (flags & ~(DLM_LKF_CANCEL | DLM_LKF_VALBLK | DLM_LKF_IVVALBLK |
2169 DLM_LKF_FORCEUNLOCK))
2170 return -EINVAL;
2171
David Teiglandef0c2bb2007-03-28 09:56:46 -05002172 if (flags & DLM_LKF_CANCEL && flags & DLM_LKF_FORCEUNLOCK)
2173 return -EINVAL;
2174
David Teiglande7fd4172006-01-18 09:30:29 +00002175 args->flags = flags;
David Teiglande5dae542008-02-06 00:35:45 -06002176 args->astparam = astarg;
David Teiglande7fd4172006-01-18 09:30:29 +00002177 return 0;
2178}
2179
2180static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb,
2181 struct dlm_args *args)
2182{
2183 int rv = -EINVAL;
2184
2185 if (args->flags & DLM_LKF_CONVERT) {
2186 if (lkb->lkb_flags & DLM_IFL_MSTCPY)
2187 goto out;
2188
2189 if (args->flags & DLM_LKF_QUECVT &&
2190 !__quecvt_compat_matrix[lkb->lkb_grmode+1][args->mode+1])
2191 goto out;
2192
2193 rv = -EBUSY;
2194 if (lkb->lkb_status != DLM_LKSTS_GRANTED)
2195 goto out;
2196
2197 if (lkb->lkb_wait_type)
2198 goto out;
David Teiglandef0c2bb2007-03-28 09:56:46 -05002199
2200 if (is_overlap(lkb))
2201 goto out;
David Teiglande7fd4172006-01-18 09:30:29 +00002202 }
2203
2204 lkb->lkb_exflags = args->flags;
2205 lkb->lkb_sbflags = 0;
David Teiglande5dae542008-02-06 00:35:45 -06002206 lkb->lkb_astfn = args->astfn;
David Teiglande7fd4172006-01-18 09:30:29 +00002207 lkb->lkb_astparam = args->astparam;
David Teiglande5dae542008-02-06 00:35:45 -06002208 lkb->lkb_bastfn = args->bastfn;
David Teiglande7fd4172006-01-18 09:30:29 +00002209 lkb->lkb_rqmode = args->mode;
2210 lkb->lkb_lksb = args->lksb;
2211 lkb->lkb_lvbptr = args->lksb->sb_lvbptr;
2212 lkb->lkb_ownpid = (int) current->pid;
David Teiglandd7db9232007-05-18 09:00:32 -05002213 lkb->lkb_timeout_cs = args->timeout;
David Teiglande7fd4172006-01-18 09:30:29 +00002214 rv = 0;
2215 out:
David Teigland43279e52009-01-28 14:37:54 -06002216 if (rv)
2217 log_debug(ls, "validate_lock_args %d %x %x %x %d %d %s",
2218 rv, lkb->lkb_id, lkb->lkb_flags, args->flags,
2219 lkb->lkb_status, lkb->lkb_wait_type,
2220 lkb->lkb_resource->res_name);
David Teiglande7fd4172006-01-18 09:30:29 +00002221 return rv;
2222}
2223
David Teiglandef0c2bb2007-03-28 09:56:46 -05002224/* when dlm_unlock() sees -EBUSY with CANCEL/FORCEUNLOCK it returns 0
2225 for success */
2226
2227/* note: it's valid for lkb_nodeid/res_nodeid to be -1 when we get here
2228 because there may be a lookup in progress and it's valid to do
2229 cancel/unlockf on it */
2230
David Teiglande7fd4172006-01-18 09:30:29 +00002231static int validate_unlock_args(struct dlm_lkb *lkb, struct dlm_args *args)
2232{
David Teiglandef0c2bb2007-03-28 09:56:46 -05002233 struct dlm_ls *ls = lkb->lkb_resource->res_ls;
David Teiglande7fd4172006-01-18 09:30:29 +00002234 int rv = -EINVAL;
2235
David Teiglandef0c2bb2007-03-28 09:56:46 -05002236 if (lkb->lkb_flags & DLM_IFL_MSTCPY) {
2237 log_error(ls, "unlock on MSTCPY %x", lkb->lkb_id);
2238 dlm_print_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00002239 goto out;
David Teiglandef0c2bb2007-03-28 09:56:46 -05002240 }
David Teiglande7fd4172006-01-18 09:30:29 +00002241
David Teiglandef0c2bb2007-03-28 09:56:46 -05002242 /* an lkb may still exist even though the lock is EOL'ed due to a
2243 cancel, unlock or failed noqueue request; an app can't use these
2244 locks; return same error as if the lkid had not been found at all */
2245
2246 if (lkb->lkb_flags & DLM_IFL_ENDOFLIFE) {
2247 log_debug(ls, "unlock on ENDOFLIFE %x", lkb->lkb_id);
2248 rv = -ENOENT;
2249 goto out;
2250 }
2251
2252 /* an lkb may be waiting for an rsb lookup to complete where the
2253 lookup was initiated by another lock */
2254
David Teigland42dc1602008-01-09 10:30:45 -06002255 if (!list_empty(&lkb->lkb_rsb_lookup)) {
2256 if (args->flags & (DLM_LKF_CANCEL | DLM_LKF_FORCEUNLOCK)) {
David Teiglandef0c2bb2007-03-28 09:56:46 -05002257 log_debug(ls, "unlock on rsb_lookup %x", lkb->lkb_id);
2258 list_del_init(&lkb->lkb_rsb_lookup);
2259 queue_cast(lkb->lkb_resource, lkb,
2260 args->flags & DLM_LKF_CANCEL ?
2261 -DLM_ECANCEL : -DLM_EUNLOCK);
2262 unhold_lkb(lkb); /* undoes create_lkb() */
David Teiglandef0c2bb2007-03-28 09:56:46 -05002263 }
David Teigland42dc1602008-01-09 10:30:45 -06002264 /* caller changes -EBUSY to 0 for CANCEL and FORCEUNLOCK */
2265 rv = -EBUSY;
2266 goto out;
David Teiglandef0c2bb2007-03-28 09:56:46 -05002267 }
2268
2269 /* cancel not allowed with another cancel/unlock in progress */
2270
2271 if (args->flags & DLM_LKF_CANCEL) {
2272 if (lkb->lkb_exflags & DLM_LKF_CANCEL)
2273 goto out;
2274
2275 if (is_overlap(lkb))
2276 goto out;
2277
David Teigland3ae1acf2007-05-18 08:59:31 -05002278 /* don't let scand try to do a cancel */
2279 del_timeout(lkb);
2280
David Teiglandef0c2bb2007-03-28 09:56:46 -05002281 if (lkb->lkb_flags & DLM_IFL_RESEND) {
2282 lkb->lkb_flags |= DLM_IFL_OVERLAP_CANCEL;
2283 rv = -EBUSY;
2284 goto out;
2285 }
2286
David Teiglanda536e382009-02-27 15:23:28 -06002287 /* there's nothing to cancel */
2288 if (lkb->lkb_status == DLM_LKSTS_GRANTED &&
2289 !lkb->lkb_wait_type) {
2290 rv = -EBUSY;
2291 goto out;
2292 }
2293
David Teiglandef0c2bb2007-03-28 09:56:46 -05002294 switch (lkb->lkb_wait_type) {
2295 case DLM_MSG_LOOKUP:
2296 case DLM_MSG_REQUEST:
2297 lkb->lkb_flags |= DLM_IFL_OVERLAP_CANCEL;
2298 rv = -EBUSY;
2299 goto out;
2300 case DLM_MSG_UNLOCK:
2301 case DLM_MSG_CANCEL:
2302 goto out;
2303 }
2304 /* add_to_waiters() will set OVERLAP_CANCEL */
David Teiglande7fd4172006-01-18 09:30:29 +00002305 goto out_ok;
David Teiglandef0c2bb2007-03-28 09:56:46 -05002306 }
David Teiglande7fd4172006-01-18 09:30:29 +00002307
David Teiglandef0c2bb2007-03-28 09:56:46 -05002308 /* do we need to allow a force-unlock if there's a normal unlock
2309 already in progress? in what conditions could the normal unlock
2310 fail such that we'd want to send a force-unlock to be sure? */
David Teiglande7fd4172006-01-18 09:30:29 +00002311
David Teiglandef0c2bb2007-03-28 09:56:46 -05002312 if (args->flags & DLM_LKF_FORCEUNLOCK) {
2313 if (lkb->lkb_exflags & DLM_LKF_FORCEUNLOCK)
2314 goto out;
David Teiglande7fd4172006-01-18 09:30:29 +00002315
David Teiglandef0c2bb2007-03-28 09:56:46 -05002316 if (is_overlap_unlock(lkb))
2317 goto out;
2318
David Teigland3ae1acf2007-05-18 08:59:31 -05002319 /* don't let scand try to do a cancel */
2320 del_timeout(lkb);
2321
David Teiglandef0c2bb2007-03-28 09:56:46 -05002322 if (lkb->lkb_flags & DLM_IFL_RESEND) {
2323 lkb->lkb_flags |= DLM_IFL_OVERLAP_UNLOCK;
2324 rv = -EBUSY;
2325 goto out;
2326 }
2327
2328 switch (lkb->lkb_wait_type) {
2329 case DLM_MSG_LOOKUP:
2330 case DLM_MSG_REQUEST:
2331 lkb->lkb_flags |= DLM_IFL_OVERLAP_UNLOCK;
2332 rv = -EBUSY;
2333 goto out;
2334 case DLM_MSG_UNLOCK:
2335 goto out;
2336 }
2337 /* add_to_waiters() will set OVERLAP_UNLOCK */
2338 goto out_ok;
2339 }
2340
2341 /* normal unlock not allowed if there's any op in progress */
David Teiglande7fd4172006-01-18 09:30:29 +00002342 rv = -EBUSY;
David Teiglandef0c2bb2007-03-28 09:56:46 -05002343 if (lkb->lkb_wait_type || lkb->lkb_wait_count)
David Teiglande7fd4172006-01-18 09:30:29 +00002344 goto out;
2345
2346 out_ok:
David Teiglandef0c2bb2007-03-28 09:56:46 -05002347 /* an overlapping op shouldn't blow away exflags from other op */
2348 lkb->lkb_exflags |= args->flags;
David Teiglande7fd4172006-01-18 09:30:29 +00002349 lkb->lkb_sbflags = 0;
2350 lkb->lkb_astparam = args->astparam;
David Teiglande7fd4172006-01-18 09:30:29 +00002351 rv = 0;
2352 out:
David Teiglandef0c2bb2007-03-28 09:56:46 -05002353 if (rv)
2354 log_debug(ls, "validate_unlock_args %d %x %x %x %x %d %s", rv,
2355 lkb->lkb_id, lkb->lkb_flags, lkb->lkb_exflags,
2356 args->flags, lkb->lkb_wait_type,
2357 lkb->lkb_resource->res_name);
David Teiglande7fd4172006-01-18 09:30:29 +00002358 return rv;
2359}
2360
2361/*
2362 * Four stage 4 varieties:
2363 * do_request(), do_convert(), do_unlock(), do_cancel()
2364 * These are called on the master node for the given lock and
2365 * from the central locking logic.
2366 */
2367
2368static int do_request(struct dlm_rsb *r, struct dlm_lkb *lkb)
2369{
2370 int error = 0;
2371
David Teiglandc85d65e2007-05-18 09:01:26 -05002372 if (can_be_granted(r, lkb, 1, NULL)) {
David Teiglande7fd4172006-01-18 09:30:29 +00002373 grant_lock(r, lkb);
2374 queue_cast(r, lkb, 0);
2375 goto out;
2376 }
2377
2378 if (can_be_queued(lkb)) {
2379 error = -EINPROGRESS;
2380 add_lkb(r, lkb, DLM_LKSTS_WAITING);
David Teigland3ae1acf2007-05-18 08:59:31 -05002381 add_timeout(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00002382 goto out;
2383 }
2384
2385 error = -EAGAIN;
David Teiglande7fd4172006-01-18 09:30:29 +00002386 queue_cast(r, lkb, -EAGAIN);
David Teiglande7fd4172006-01-18 09:30:29 +00002387 out:
2388 return error;
2389}
2390
David Teiglandcf6620a2010-02-24 11:59:23 -06002391static void do_request_effects(struct dlm_rsb *r, struct dlm_lkb *lkb,
2392 int error)
2393{
2394 switch (error) {
2395 case -EAGAIN:
2396 if (force_blocking_asts(lkb))
2397 send_blocking_asts_all(r, lkb);
2398 break;
2399 case -EINPROGRESS:
2400 send_blocking_asts(r, lkb);
2401 break;
2402 }
2403}
2404
David Teiglande7fd4172006-01-18 09:30:29 +00002405static int do_convert(struct dlm_rsb *r, struct dlm_lkb *lkb)
2406{
2407 int error = 0;
David Teiglandc85d65e2007-05-18 09:01:26 -05002408 int deadlk = 0;
David Teiglande7fd4172006-01-18 09:30:29 +00002409
2410 /* changing an existing lock may allow others to be granted */
2411
David Teiglandc85d65e2007-05-18 09:01:26 -05002412 if (can_be_granted(r, lkb, 1, &deadlk)) {
David Teiglande7fd4172006-01-18 09:30:29 +00002413 grant_lock(r, lkb);
2414 queue_cast(r, lkb, 0);
David Teiglande7fd4172006-01-18 09:30:29 +00002415 goto out;
2416 }
2417
David Teiglandc85d65e2007-05-18 09:01:26 -05002418 /* can_be_granted() detected that this lock would block in a conversion
2419 deadlock, so we leave it on the granted queue and return EDEADLK in
2420 the ast for the convert. */
2421
2422 if (deadlk) {
2423 /* it's left on the granted queue */
2424 log_debug(r->res_ls, "deadlock %x node %d sts%d g%d r%d %s",
2425 lkb->lkb_id, lkb->lkb_nodeid, lkb->lkb_status,
2426 lkb->lkb_grmode, lkb->lkb_rqmode, r->res_name);
2427 revert_lock(r, lkb);
2428 queue_cast(r, lkb, -EDEADLK);
2429 error = -EDEADLK;
2430 goto out;
2431 }
2432
David Teigland7d3c1fe2007-04-19 10:30:41 -05002433 /* is_demoted() means the can_be_granted() above set the grmode
2434 to NL, and left us on the granted queue. This auto-demotion
2435 (due to CONVDEADLK) might mean other locks, and/or this lock, are
2436 now grantable. We have to try to grant other converting locks
2437 before we try again to grant this one. */
2438
2439 if (is_demoted(lkb)) {
David Teigland36509252007-08-07 09:44:48 -05002440 grant_pending_convert(r, DLM_LOCK_IV, NULL);
David Teigland7d3c1fe2007-04-19 10:30:41 -05002441 if (_can_be_granted(r, lkb, 1)) {
2442 grant_lock(r, lkb);
2443 queue_cast(r, lkb, 0);
David Teigland7d3c1fe2007-04-19 10:30:41 -05002444 goto out;
2445 }
2446 /* else fall through and move to convert queue */
2447 }
2448
2449 if (can_be_queued(lkb)) {
David Teiglande7fd4172006-01-18 09:30:29 +00002450 error = -EINPROGRESS;
2451 del_lkb(r, lkb);
2452 add_lkb(r, lkb, DLM_LKSTS_CONVERT);
David Teigland3ae1acf2007-05-18 08:59:31 -05002453 add_timeout(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00002454 goto out;
2455 }
2456
2457 error = -EAGAIN;
David Teiglande7fd4172006-01-18 09:30:29 +00002458 queue_cast(r, lkb, -EAGAIN);
David Teiglande7fd4172006-01-18 09:30:29 +00002459 out:
2460 return error;
2461}
2462
David Teiglandcf6620a2010-02-24 11:59:23 -06002463static void do_convert_effects(struct dlm_rsb *r, struct dlm_lkb *lkb,
2464 int error)
2465{
2466 switch (error) {
2467 case 0:
2468 grant_pending_locks(r);
2469 /* grant_pending_locks also sends basts */
2470 break;
2471 case -EAGAIN:
2472 if (force_blocking_asts(lkb))
2473 send_blocking_asts_all(r, lkb);
2474 break;
2475 case -EINPROGRESS:
2476 send_blocking_asts(r, lkb);
2477 break;
2478 }
2479}
2480
David Teiglande7fd4172006-01-18 09:30:29 +00002481static int do_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb)
2482{
2483 remove_lock(r, lkb);
2484 queue_cast(r, lkb, -DLM_EUNLOCK);
David Teiglande7fd4172006-01-18 09:30:29 +00002485 return -DLM_EUNLOCK;
2486}
2487
David Teiglandcf6620a2010-02-24 11:59:23 -06002488static void do_unlock_effects(struct dlm_rsb *r, struct dlm_lkb *lkb,
2489 int error)
2490{
2491 grant_pending_locks(r);
2492}
2493
David Teiglandef0c2bb2007-03-28 09:56:46 -05002494/* returns: 0 did nothing, -DLM_ECANCEL canceled lock */
Steven Whitehouse907b9bc2006-09-25 09:26:04 -04002495
David Teiglande7fd4172006-01-18 09:30:29 +00002496static int do_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb)
2497{
David Teiglandef0c2bb2007-03-28 09:56:46 -05002498 int error;
2499
2500 error = revert_lock(r, lkb);
2501 if (error) {
2502 queue_cast(r, lkb, -DLM_ECANCEL);
David Teiglandef0c2bb2007-03-28 09:56:46 -05002503 return -DLM_ECANCEL;
2504 }
2505 return 0;
David Teiglande7fd4172006-01-18 09:30:29 +00002506}
2507
David Teiglandcf6620a2010-02-24 11:59:23 -06002508static void do_cancel_effects(struct dlm_rsb *r, struct dlm_lkb *lkb,
2509 int error)
2510{
2511 if (error)
2512 grant_pending_locks(r);
2513}
2514
David Teiglande7fd4172006-01-18 09:30:29 +00002515/*
2516 * Four stage 3 varieties:
2517 * _request_lock(), _convert_lock(), _unlock_lock(), _cancel_lock()
2518 */
2519
2520/* add a new lkb to a possibly new rsb, called by requesting process */
2521
2522static int _request_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
2523{
2524 int error;
2525
2526 /* set_master: sets lkb nodeid from r */
2527
2528 error = set_master(r, lkb);
2529 if (error < 0)
2530 goto out;
2531 if (error) {
2532 error = 0;
2533 goto out;
2534 }
2535
David Teiglandcf6620a2010-02-24 11:59:23 -06002536 if (is_remote(r)) {
David Teiglande7fd4172006-01-18 09:30:29 +00002537 /* receive_request() calls do_request() on remote node */
2538 error = send_request(r, lkb);
David Teiglandcf6620a2010-02-24 11:59:23 -06002539 } else {
David Teiglande7fd4172006-01-18 09:30:29 +00002540 error = do_request(r, lkb);
David Teiglandcf6620a2010-02-24 11:59:23 -06002541 /* for remote locks the request_reply is sent
2542 between do_request and do_request_effects */
2543 do_request_effects(r, lkb, error);
2544 }
David Teiglande7fd4172006-01-18 09:30:29 +00002545 out:
2546 return error;
2547}
2548
David Teigland3bcd3682006-02-23 09:56:38 +00002549/* change some property of an existing lkb, e.g. mode */
David Teiglande7fd4172006-01-18 09:30:29 +00002550
2551static int _convert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
2552{
2553 int error;
2554
David Teiglandcf6620a2010-02-24 11:59:23 -06002555 if (is_remote(r)) {
David Teiglande7fd4172006-01-18 09:30:29 +00002556 /* receive_convert() calls do_convert() on remote node */
2557 error = send_convert(r, lkb);
David Teiglandcf6620a2010-02-24 11:59:23 -06002558 } else {
David Teiglande7fd4172006-01-18 09:30:29 +00002559 error = do_convert(r, lkb);
David Teiglandcf6620a2010-02-24 11:59:23 -06002560 /* for remote locks the convert_reply is sent
2561 between do_convert and do_convert_effects */
2562 do_convert_effects(r, lkb, error);
2563 }
David Teiglande7fd4172006-01-18 09:30:29 +00002564
2565 return error;
2566}
2567
2568/* remove an existing lkb from the granted queue */
2569
2570static int _unlock_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
2571{
2572 int error;
2573
David Teiglandcf6620a2010-02-24 11:59:23 -06002574 if (is_remote(r)) {
David Teiglande7fd4172006-01-18 09:30:29 +00002575 /* receive_unlock() calls do_unlock() on remote node */
2576 error = send_unlock(r, lkb);
David Teiglandcf6620a2010-02-24 11:59:23 -06002577 } else {
David Teiglande7fd4172006-01-18 09:30:29 +00002578 error = do_unlock(r, lkb);
David Teiglandcf6620a2010-02-24 11:59:23 -06002579 /* for remote locks the unlock_reply is sent
2580 between do_unlock and do_unlock_effects */
2581 do_unlock_effects(r, lkb, error);
2582 }
David Teiglande7fd4172006-01-18 09:30:29 +00002583
2584 return error;
2585}
2586
2587/* remove an existing lkb from the convert or wait queue */
2588
2589static int _cancel_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
2590{
2591 int error;
2592
David Teiglandcf6620a2010-02-24 11:59:23 -06002593 if (is_remote(r)) {
David Teiglande7fd4172006-01-18 09:30:29 +00002594 /* receive_cancel() calls do_cancel() on remote node */
2595 error = send_cancel(r, lkb);
David Teiglandcf6620a2010-02-24 11:59:23 -06002596 } else {
David Teiglande7fd4172006-01-18 09:30:29 +00002597 error = do_cancel(r, lkb);
David Teiglandcf6620a2010-02-24 11:59:23 -06002598 /* for remote locks the cancel_reply is sent
2599 between do_cancel and do_cancel_effects */
2600 do_cancel_effects(r, lkb, error);
2601 }
David Teiglande7fd4172006-01-18 09:30:29 +00002602
2603 return error;
2604}
2605
2606/*
2607 * Four stage 2 varieties:
2608 * request_lock(), convert_lock(), unlock_lock(), cancel_lock()
2609 */
2610
2611static int request_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, char *name,
2612 int len, struct dlm_args *args)
2613{
2614 struct dlm_rsb *r;
2615 int error;
2616
2617 error = validate_lock_args(ls, lkb, args);
2618 if (error)
2619 goto out;
2620
2621 error = find_rsb(ls, name, len, R_CREATE, &r);
2622 if (error)
2623 goto out;
2624
2625 lock_rsb(r);
2626
2627 attach_lkb(r, lkb);
2628 lkb->lkb_lksb->sb_lkid = lkb->lkb_id;
2629
2630 error = _request_lock(r, lkb);
2631
2632 unlock_rsb(r);
2633 put_rsb(r);
2634
2635 out:
2636 return error;
2637}
2638
2639static int convert_lock(struct dlm_ls *ls, struct dlm_lkb *lkb,
2640 struct dlm_args *args)
2641{
2642 struct dlm_rsb *r;
2643 int error;
2644
2645 r = lkb->lkb_resource;
2646
2647 hold_rsb(r);
2648 lock_rsb(r);
2649
2650 error = validate_lock_args(ls, lkb, args);
2651 if (error)
2652 goto out;
2653
2654 error = _convert_lock(r, lkb);
2655 out:
2656 unlock_rsb(r);
2657 put_rsb(r);
2658 return error;
2659}
2660
2661static int unlock_lock(struct dlm_ls *ls, struct dlm_lkb *lkb,
2662 struct dlm_args *args)
2663{
2664 struct dlm_rsb *r;
2665 int error;
2666
2667 r = lkb->lkb_resource;
2668
2669 hold_rsb(r);
2670 lock_rsb(r);
2671
2672 error = validate_unlock_args(lkb, args);
2673 if (error)
2674 goto out;
2675
2676 error = _unlock_lock(r, lkb);
2677 out:
2678 unlock_rsb(r);
2679 put_rsb(r);
2680 return error;
2681}
2682
2683static int cancel_lock(struct dlm_ls *ls, struct dlm_lkb *lkb,
2684 struct dlm_args *args)
2685{
2686 struct dlm_rsb *r;
2687 int error;
2688
2689 r = lkb->lkb_resource;
2690
2691 hold_rsb(r);
2692 lock_rsb(r);
2693
2694 error = validate_unlock_args(lkb, args);
2695 if (error)
2696 goto out;
2697
2698 error = _cancel_lock(r, lkb);
2699 out:
2700 unlock_rsb(r);
2701 put_rsb(r);
2702 return error;
2703}
2704
2705/*
2706 * Two stage 1 varieties: dlm_lock() and dlm_unlock()
2707 */
2708
2709int dlm_lock(dlm_lockspace_t *lockspace,
2710 int mode,
2711 struct dlm_lksb *lksb,
2712 uint32_t flags,
2713 void *name,
2714 unsigned int namelen,
2715 uint32_t parent_lkid,
2716 void (*ast) (void *astarg),
2717 void *astarg,
David Teigland3bcd3682006-02-23 09:56:38 +00002718 void (*bast) (void *astarg, int mode))
David Teiglande7fd4172006-01-18 09:30:29 +00002719{
2720 struct dlm_ls *ls;
2721 struct dlm_lkb *lkb;
2722 struct dlm_args args;
2723 int error, convert = flags & DLM_LKF_CONVERT;
2724
2725 ls = dlm_find_lockspace_local(lockspace);
2726 if (!ls)
2727 return -EINVAL;
2728
David Teigland85e86ed2007-05-18 08:58:15 -05002729 dlm_lock_recovery(ls);
David Teiglande7fd4172006-01-18 09:30:29 +00002730
2731 if (convert)
2732 error = find_lkb(ls, lksb->sb_lkid, &lkb);
2733 else
2734 error = create_lkb(ls, &lkb);
2735
2736 if (error)
2737 goto out;
2738
David Teiglandd7db9232007-05-18 09:00:32 -05002739 error = set_lock_args(mode, lksb, flags, namelen, 0, ast,
David Teigland3bcd3682006-02-23 09:56:38 +00002740 astarg, bast, &args);
David Teiglande7fd4172006-01-18 09:30:29 +00002741 if (error)
2742 goto out_put;
2743
2744 if (convert)
2745 error = convert_lock(ls, lkb, &args);
2746 else
2747 error = request_lock(ls, lkb, name, namelen, &args);
2748
2749 if (error == -EINPROGRESS)
2750 error = 0;
2751 out_put:
2752 if (convert || error)
David Teiglandb3f58d82006-02-28 11:16:37 -05002753 __put_lkb(ls, lkb);
David Teiglandc85d65e2007-05-18 09:01:26 -05002754 if (error == -EAGAIN || error == -EDEADLK)
David Teiglande7fd4172006-01-18 09:30:29 +00002755 error = 0;
2756 out:
David Teigland85e86ed2007-05-18 08:58:15 -05002757 dlm_unlock_recovery(ls);
David Teiglande7fd4172006-01-18 09:30:29 +00002758 dlm_put_lockspace(ls);
2759 return error;
2760}
2761
2762int dlm_unlock(dlm_lockspace_t *lockspace,
2763 uint32_t lkid,
2764 uint32_t flags,
2765 struct dlm_lksb *lksb,
2766 void *astarg)
2767{
2768 struct dlm_ls *ls;
2769 struct dlm_lkb *lkb;
2770 struct dlm_args args;
2771 int error;
2772
2773 ls = dlm_find_lockspace_local(lockspace);
2774 if (!ls)
2775 return -EINVAL;
2776
David Teigland85e86ed2007-05-18 08:58:15 -05002777 dlm_lock_recovery(ls);
David Teiglande7fd4172006-01-18 09:30:29 +00002778
2779 error = find_lkb(ls, lkid, &lkb);
2780 if (error)
2781 goto out;
2782
2783 error = set_unlock_args(flags, astarg, &args);
2784 if (error)
2785 goto out_put;
2786
2787 if (flags & DLM_LKF_CANCEL)
2788 error = cancel_lock(ls, lkb, &args);
2789 else
2790 error = unlock_lock(ls, lkb, &args);
2791
2792 if (error == -DLM_EUNLOCK || error == -DLM_ECANCEL)
2793 error = 0;
David Teiglandef0c2bb2007-03-28 09:56:46 -05002794 if (error == -EBUSY && (flags & (DLM_LKF_CANCEL | DLM_LKF_FORCEUNLOCK)))
2795 error = 0;
David Teiglande7fd4172006-01-18 09:30:29 +00002796 out_put:
David Teiglandb3f58d82006-02-28 11:16:37 -05002797 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00002798 out:
David Teigland85e86ed2007-05-18 08:58:15 -05002799 dlm_unlock_recovery(ls);
David Teiglande7fd4172006-01-18 09:30:29 +00002800 dlm_put_lockspace(ls);
2801 return error;
2802}
2803
2804/*
2805 * send/receive routines for remote operations and replies
2806 *
2807 * send_args
2808 * send_common
2809 * send_request receive_request
2810 * send_convert receive_convert
2811 * send_unlock receive_unlock
2812 * send_cancel receive_cancel
2813 * send_grant receive_grant
2814 * send_bast receive_bast
2815 * send_lookup receive_lookup
2816 * send_remove receive_remove
2817 *
2818 * send_common_reply
2819 * receive_request_reply send_request_reply
2820 * receive_convert_reply send_convert_reply
2821 * receive_unlock_reply send_unlock_reply
2822 * receive_cancel_reply send_cancel_reply
2823 * receive_lookup_reply send_lookup_reply
2824 */
2825
David Teigland7e4dac32007-04-02 09:06:41 -05002826static int _create_message(struct dlm_ls *ls, int mb_len,
2827 int to_nodeid, int mstype,
2828 struct dlm_message **ms_ret,
2829 struct dlm_mhandle **mh_ret)
2830{
2831 struct dlm_message *ms;
2832 struct dlm_mhandle *mh;
2833 char *mb;
2834
2835 /* get_buffer gives us a message handle (mh) that we need to
2836 pass into lowcomms_commit and a message buffer (mb) that we
2837 write our data into */
2838
David Teigland573c24c2009-11-30 16:34:43 -06002839 mh = dlm_lowcomms_get_buffer(to_nodeid, mb_len, GFP_NOFS, &mb);
David Teigland7e4dac32007-04-02 09:06:41 -05002840 if (!mh)
2841 return -ENOBUFS;
2842
2843 memset(mb, 0, mb_len);
2844
2845 ms = (struct dlm_message *) mb;
2846
2847 ms->m_header.h_version = (DLM_HEADER_MAJOR | DLM_HEADER_MINOR);
2848 ms->m_header.h_lockspace = ls->ls_global_id;
2849 ms->m_header.h_nodeid = dlm_our_nodeid();
2850 ms->m_header.h_length = mb_len;
2851 ms->m_header.h_cmd = DLM_MSG;
2852
2853 ms->m_type = mstype;
2854
2855 *mh_ret = mh;
2856 *ms_ret = ms;
2857 return 0;
2858}
2859
David Teiglande7fd4172006-01-18 09:30:29 +00002860static int create_message(struct dlm_rsb *r, struct dlm_lkb *lkb,
2861 int to_nodeid, int mstype,
2862 struct dlm_message **ms_ret,
2863 struct dlm_mhandle **mh_ret)
2864{
David Teiglande7fd4172006-01-18 09:30:29 +00002865 int mb_len = sizeof(struct dlm_message);
2866
2867 switch (mstype) {
2868 case DLM_MSG_REQUEST:
2869 case DLM_MSG_LOOKUP:
2870 case DLM_MSG_REMOVE:
2871 mb_len += r->res_length;
2872 break;
2873 case DLM_MSG_CONVERT:
2874 case DLM_MSG_UNLOCK:
2875 case DLM_MSG_REQUEST_REPLY:
2876 case DLM_MSG_CONVERT_REPLY:
2877 case DLM_MSG_GRANT:
2878 if (lkb && lkb->lkb_lvbptr)
2879 mb_len += r->res_ls->ls_lvblen;
2880 break;
2881 }
2882
David Teigland7e4dac32007-04-02 09:06:41 -05002883 return _create_message(r->res_ls, mb_len, to_nodeid, mstype,
2884 ms_ret, mh_ret);
David Teiglande7fd4172006-01-18 09:30:29 +00002885}
2886
2887/* further lowcomms enhancements or alternate implementations may make
2888 the return value from this function useful at some point */
2889
2890static int send_message(struct dlm_mhandle *mh, struct dlm_message *ms)
2891{
2892 dlm_message_out(ms);
2893 dlm_lowcomms_commit_buffer(mh);
2894 return 0;
2895}
2896
2897static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb,
2898 struct dlm_message *ms)
2899{
2900 ms->m_nodeid = lkb->lkb_nodeid;
2901 ms->m_pid = lkb->lkb_ownpid;
2902 ms->m_lkid = lkb->lkb_id;
2903 ms->m_remid = lkb->lkb_remid;
2904 ms->m_exflags = lkb->lkb_exflags;
2905 ms->m_sbflags = lkb->lkb_sbflags;
2906 ms->m_flags = lkb->lkb_flags;
2907 ms->m_lvbseq = lkb->lkb_lvbseq;
2908 ms->m_status = lkb->lkb_status;
2909 ms->m_grmode = lkb->lkb_grmode;
2910 ms->m_rqmode = lkb->lkb_rqmode;
2911 ms->m_hash = r->res_hash;
2912
2913 /* m_result and m_bastmode are set from function args,
2914 not from lkb fields */
2915
David Teiglande5dae542008-02-06 00:35:45 -06002916 if (lkb->lkb_bastfn)
David Teigland8304d6f2011-02-21 14:58:21 -06002917 ms->m_asts |= DLM_CB_BAST;
David Teiglande5dae542008-02-06 00:35:45 -06002918 if (lkb->lkb_astfn)
David Teigland8304d6f2011-02-21 14:58:21 -06002919 ms->m_asts |= DLM_CB_CAST;
David Teiglande7fd4172006-01-18 09:30:29 +00002920
David Teiglandda49f362006-12-13 10:38:45 -06002921 /* compare with switch in create_message; send_remove() doesn't
2922 use send_args() */
2923
2924 switch (ms->m_type) {
2925 case DLM_MSG_REQUEST:
2926 case DLM_MSG_LOOKUP:
David Teiglande7fd4172006-01-18 09:30:29 +00002927 memcpy(ms->m_extra, r->res_name, r->res_length);
David Teiglandda49f362006-12-13 10:38:45 -06002928 break;
2929 case DLM_MSG_CONVERT:
2930 case DLM_MSG_UNLOCK:
2931 case DLM_MSG_REQUEST_REPLY:
2932 case DLM_MSG_CONVERT_REPLY:
2933 case DLM_MSG_GRANT:
2934 if (!lkb->lkb_lvbptr)
2935 break;
David Teiglande7fd4172006-01-18 09:30:29 +00002936 memcpy(ms->m_extra, lkb->lkb_lvbptr, r->res_ls->ls_lvblen);
David Teiglandda49f362006-12-13 10:38:45 -06002937 break;
2938 }
David Teiglande7fd4172006-01-18 09:30:29 +00002939}
2940
2941static int send_common(struct dlm_rsb *r, struct dlm_lkb *lkb, int mstype)
2942{
2943 struct dlm_message *ms;
2944 struct dlm_mhandle *mh;
2945 int to_nodeid, error;
2946
David Teiglandc6ff6692011-03-28 14:17:26 -05002947 to_nodeid = r->res_nodeid;
2948
2949 error = add_to_waiters(lkb, mstype, to_nodeid);
David Teiglandef0c2bb2007-03-28 09:56:46 -05002950 if (error)
2951 return error;
David Teiglande7fd4172006-01-18 09:30:29 +00002952
David Teiglande7fd4172006-01-18 09:30:29 +00002953 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh);
2954 if (error)
2955 goto fail;
2956
2957 send_args(r, lkb, ms);
2958
2959 error = send_message(mh, ms);
2960 if (error)
2961 goto fail;
2962 return 0;
2963
2964 fail:
David Teiglandef0c2bb2007-03-28 09:56:46 -05002965 remove_from_waiters(lkb, msg_reply_type(mstype));
David Teiglande7fd4172006-01-18 09:30:29 +00002966 return error;
2967}
2968
2969static int send_request(struct dlm_rsb *r, struct dlm_lkb *lkb)
2970{
2971 return send_common(r, lkb, DLM_MSG_REQUEST);
2972}
2973
2974static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb)
2975{
2976 int error;
2977
2978 error = send_common(r, lkb, DLM_MSG_CONVERT);
2979
2980 /* down conversions go without a reply from the master */
2981 if (!error && down_conversion(lkb)) {
David Teiglandef0c2bb2007-03-28 09:56:46 -05002982 remove_from_waiters(lkb, DLM_MSG_CONVERT_REPLY);
David Teigland2a7ce0e2011-04-04 15:19:59 -05002983 r->res_ls->ls_stub_ms.m_flags = DLM_IFL_STUB_MS;
David Teiglandef0c2bb2007-03-28 09:56:46 -05002984 r->res_ls->ls_stub_ms.m_type = DLM_MSG_CONVERT_REPLY;
David Teiglande7fd4172006-01-18 09:30:29 +00002985 r->res_ls->ls_stub_ms.m_result = 0;
2986 __receive_convert_reply(r, lkb, &r->res_ls->ls_stub_ms);
2987 }
2988
2989 return error;
2990}
2991
2992/* FIXME: if this lkb is the only lock we hold on the rsb, then set
2993 MASTER_UNCERTAIN to force the next request on the rsb to confirm
2994 that the master is still correct. */
2995
2996static int send_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb)
2997{
2998 return send_common(r, lkb, DLM_MSG_UNLOCK);
2999}
3000
3001static int send_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb)
3002{
3003 return send_common(r, lkb, DLM_MSG_CANCEL);
3004}
3005
3006static int send_grant(struct dlm_rsb *r, struct dlm_lkb *lkb)
3007{
3008 struct dlm_message *ms;
3009 struct dlm_mhandle *mh;
3010 int to_nodeid, error;
3011
3012 to_nodeid = lkb->lkb_nodeid;
3013
3014 error = create_message(r, lkb, to_nodeid, DLM_MSG_GRANT, &ms, &mh);
3015 if (error)
3016 goto out;
3017
3018 send_args(r, lkb, ms);
3019
3020 ms->m_result = 0;
3021
3022 error = send_message(mh, ms);
3023 out:
3024 return error;
3025}
3026
3027static int send_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int mode)
3028{
3029 struct dlm_message *ms;
3030 struct dlm_mhandle *mh;
3031 int to_nodeid, error;
3032
3033 to_nodeid = lkb->lkb_nodeid;
3034
3035 error = create_message(r, NULL, to_nodeid, DLM_MSG_BAST, &ms, &mh);
3036 if (error)
3037 goto out;
3038
3039 send_args(r, lkb, ms);
3040
3041 ms->m_bastmode = mode;
3042
3043 error = send_message(mh, ms);
3044 out:
3045 return error;
3046}
3047
3048static int send_lookup(struct dlm_rsb *r, struct dlm_lkb *lkb)
3049{
3050 struct dlm_message *ms;
3051 struct dlm_mhandle *mh;
3052 int to_nodeid, error;
3053
David Teiglandc6ff6692011-03-28 14:17:26 -05003054 to_nodeid = dlm_dir_nodeid(r);
3055
3056 error = add_to_waiters(lkb, DLM_MSG_LOOKUP, to_nodeid);
David Teiglandef0c2bb2007-03-28 09:56:46 -05003057 if (error)
3058 return error;
David Teiglande7fd4172006-01-18 09:30:29 +00003059
David Teiglande7fd4172006-01-18 09:30:29 +00003060 error = create_message(r, NULL, to_nodeid, DLM_MSG_LOOKUP, &ms, &mh);
3061 if (error)
3062 goto fail;
3063
3064 send_args(r, lkb, ms);
3065
3066 error = send_message(mh, ms);
3067 if (error)
3068 goto fail;
3069 return 0;
3070
3071 fail:
David Teiglandef0c2bb2007-03-28 09:56:46 -05003072 remove_from_waiters(lkb, DLM_MSG_LOOKUP_REPLY);
David Teiglande7fd4172006-01-18 09:30:29 +00003073 return error;
3074}
3075
3076static int send_remove(struct dlm_rsb *r)
3077{
3078 struct dlm_message *ms;
3079 struct dlm_mhandle *mh;
3080 int to_nodeid, error;
3081
3082 to_nodeid = dlm_dir_nodeid(r);
3083
3084 error = create_message(r, NULL, to_nodeid, DLM_MSG_REMOVE, &ms, &mh);
3085 if (error)
3086 goto out;
3087
3088 memcpy(ms->m_extra, r->res_name, r->res_length);
3089 ms->m_hash = r->res_hash;
3090
3091 error = send_message(mh, ms);
3092 out:
3093 return error;
3094}
3095
3096static int send_common_reply(struct dlm_rsb *r, struct dlm_lkb *lkb,
3097 int mstype, int rv)
3098{
3099 struct dlm_message *ms;
3100 struct dlm_mhandle *mh;
3101 int to_nodeid, error;
3102
3103 to_nodeid = lkb->lkb_nodeid;
3104
3105 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh);
3106 if (error)
3107 goto out;
3108
3109 send_args(r, lkb, ms);
3110
3111 ms->m_result = rv;
3112
3113 error = send_message(mh, ms);
3114 out:
3115 return error;
3116}
3117
3118static int send_request_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv)
3119{
3120 return send_common_reply(r, lkb, DLM_MSG_REQUEST_REPLY, rv);
3121}
3122
3123static int send_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv)
3124{
3125 return send_common_reply(r, lkb, DLM_MSG_CONVERT_REPLY, rv);
3126}
3127
3128static int send_unlock_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv)
3129{
3130 return send_common_reply(r, lkb, DLM_MSG_UNLOCK_REPLY, rv);
3131}
3132
3133static int send_cancel_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv)
3134{
3135 return send_common_reply(r, lkb, DLM_MSG_CANCEL_REPLY, rv);
3136}
3137
3138static int send_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms_in,
3139 int ret_nodeid, int rv)
3140{
3141 struct dlm_rsb *r = &ls->ls_stub_rsb;
3142 struct dlm_message *ms;
3143 struct dlm_mhandle *mh;
3144 int error, nodeid = ms_in->m_header.h_nodeid;
3145
3146 error = create_message(r, NULL, nodeid, DLM_MSG_LOOKUP_REPLY, &ms, &mh);
3147 if (error)
3148 goto out;
3149
3150 ms->m_lkid = ms_in->m_lkid;
3151 ms->m_result = rv;
3152 ms->m_nodeid = ret_nodeid;
3153
3154 error = send_message(mh, ms);
3155 out:
3156 return error;
3157}
3158
3159/* which args we save from a received message depends heavily on the type
3160 of message, unlike the send side where we can safely send everything about
3161 the lkb for any type of message */
3162
3163static void receive_flags(struct dlm_lkb *lkb, struct dlm_message *ms)
3164{
3165 lkb->lkb_exflags = ms->m_exflags;
David Teigland6f90a8b12006-11-10 14:16:27 -06003166 lkb->lkb_sbflags = ms->m_sbflags;
David Teiglande7fd4172006-01-18 09:30:29 +00003167 lkb->lkb_flags = (lkb->lkb_flags & 0xFFFF0000) |
3168 (ms->m_flags & 0x0000FFFF);
3169}
3170
3171static void receive_flags_reply(struct dlm_lkb *lkb, struct dlm_message *ms)
3172{
David Teigland2a7ce0e2011-04-04 15:19:59 -05003173 if (ms->m_flags == DLM_IFL_STUB_MS)
3174 return;
3175
David Teiglande7fd4172006-01-18 09:30:29 +00003176 lkb->lkb_sbflags = ms->m_sbflags;
3177 lkb->lkb_flags = (lkb->lkb_flags & 0xFFFF0000) |
3178 (ms->m_flags & 0x0000FFFF);
3179}
3180
3181static int receive_extralen(struct dlm_message *ms)
3182{
3183 return (ms->m_header.h_length - sizeof(struct dlm_message));
3184}
3185
David Teiglande7fd4172006-01-18 09:30:29 +00003186static int receive_lvb(struct dlm_ls *ls, struct dlm_lkb *lkb,
3187 struct dlm_message *ms)
3188{
3189 int len;
3190
3191 if (lkb->lkb_exflags & DLM_LKF_VALBLK) {
3192 if (!lkb->lkb_lvbptr)
David Teigland52bda2b2007-11-07 09:06:49 -06003193 lkb->lkb_lvbptr = dlm_allocate_lvb(ls);
David Teiglande7fd4172006-01-18 09:30:29 +00003194 if (!lkb->lkb_lvbptr)
3195 return -ENOMEM;
3196 len = receive_extralen(ms);
Al Viroa9cc9152008-01-26 00:02:29 -05003197 if (len > DLM_RESNAME_MAXLEN)
3198 len = DLM_RESNAME_MAXLEN;
David Teiglande7fd4172006-01-18 09:30:29 +00003199 memcpy(lkb->lkb_lvbptr, ms->m_extra, len);
3200 }
3201 return 0;
3202}
3203
David Teiglande5dae542008-02-06 00:35:45 -06003204static void fake_bastfn(void *astparam, int mode)
3205{
3206 log_print("fake_bastfn should not be called");
3207}
3208
3209static void fake_astfn(void *astparam)
3210{
3211 log_print("fake_astfn should not be called");
3212}
3213
David Teiglande7fd4172006-01-18 09:30:29 +00003214static int receive_request_args(struct dlm_ls *ls, struct dlm_lkb *lkb,
3215 struct dlm_message *ms)
3216{
3217 lkb->lkb_nodeid = ms->m_header.h_nodeid;
3218 lkb->lkb_ownpid = ms->m_pid;
3219 lkb->lkb_remid = ms->m_lkid;
3220 lkb->lkb_grmode = DLM_LOCK_IV;
3221 lkb->lkb_rqmode = ms->m_rqmode;
David Teiglande5dae542008-02-06 00:35:45 -06003222
David Teigland8304d6f2011-02-21 14:58:21 -06003223 lkb->lkb_bastfn = (ms->m_asts & DLM_CB_BAST) ? &fake_bastfn : NULL;
3224 lkb->lkb_astfn = (ms->m_asts & DLM_CB_CAST) ? &fake_astfn : NULL;
David Teiglande7fd4172006-01-18 09:30:29 +00003225
David Teigland8d07fd52006-12-13 10:39:20 -06003226 if (lkb->lkb_exflags & DLM_LKF_VALBLK) {
3227 /* lkb was just created so there won't be an lvb yet */
David Teigland52bda2b2007-11-07 09:06:49 -06003228 lkb->lkb_lvbptr = dlm_allocate_lvb(ls);
David Teigland8d07fd52006-12-13 10:39:20 -06003229 if (!lkb->lkb_lvbptr)
3230 return -ENOMEM;
3231 }
David Teiglande7fd4172006-01-18 09:30:29 +00003232
3233 return 0;
3234}
3235
3236static int receive_convert_args(struct dlm_ls *ls, struct dlm_lkb *lkb,
3237 struct dlm_message *ms)
3238{
David Teiglande7fd4172006-01-18 09:30:29 +00003239 if (lkb->lkb_status != DLM_LKSTS_GRANTED)
3240 return -EBUSY;
3241
David Teiglande7fd4172006-01-18 09:30:29 +00003242 if (receive_lvb(ls, lkb, ms))
3243 return -ENOMEM;
3244
3245 lkb->lkb_rqmode = ms->m_rqmode;
3246 lkb->lkb_lvbseq = ms->m_lvbseq;
3247
3248 return 0;
3249}
3250
3251static int receive_unlock_args(struct dlm_ls *ls, struct dlm_lkb *lkb,
3252 struct dlm_message *ms)
3253{
David Teiglande7fd4172006-01-18 09:30:29 +00003254 if (receive_lvb(ls, lkb, ms))
3255 return -ENOMEM;
3256 return 0;
3257}
3258
3259/* We fill in the stub-lkb fields with the info that send_xxxx_reply()
3260 uses to send a reply and that the remote end uses to process the reply. */
3261
3262static void setup_stub_lkb(struct dlm_ls *ls, struct dlm_message *ms)
3263{
3264 struct dlm_lkb *lkb = &ls->ls_stub_lkb;
3265 lkb->lkb_nodeid = ms->m_header.h_nodeid;
3266 lkb->lkb_remid = ms->m_lkid;
3267}
3268
David Teiglandc54e04b2008-01-09 09:59:41 -06003269/* This is called after the rsb is locked so that we can safely inspect
3270 fields in the lkb. */
3271
3272static int validate_message(struct dlm_lkb *lkb, struct dlm_message *ms)
3273{
3274 int from = ms->m_header.h_nodeid;
3275 int error = 0;
3276
3277 switch (ms->m_type) {
3278 case DLM_MSG_CONVERT:
3279 case DLM_MSG_UNLOCK:
3280 case DLM_MSG_CANCEL:
3281 if (!is_master_copy(lkb) || lkb->lkb_nodeid != from)
3282 error = -EINVAL;
3283 break;
3284
3285 case DLM_MSG_CONVERT_REPLY:
3286 case DLM_MSG_UNLOCK_REPLY:
3287 case DLM_MSG_CANCEL_REPLY:
3288 case DLM_MSG_GRANT:
3289 case DLM_MSG_BAST:
3290 if (!is_process_copy(lkb) || lkb->lkb_nodeid != from)
3291 error = -EINVAL;
3292 break;
3293
3294 case DLM_MSG_REQUEST_REPLY:
3295 if (!is_process_copy(lkb))
3296 error = -EINVAL;
3297 else if (lkb->lkb_nodeid != -1 && lkb->lkb_nodeid != from)
3298 error = -EINVAL;
3299 break;
3300
3301 default:
3302 error = -EINVAL;
3303 }
3304
3305 if (error)
3306 log_error(lkb->lkb_resource->res_ls,
3307 "ignore invalid message %d from %d %x %x %x %d",
3308 ms->m_type, from, lkb->lkb_id, lkb->lkb_remid,
3309 lkb->lkb_flags, lkb->lkb_nodeid);
3310 return error;
3311}
3312
David Teiglande7fd4172006-01-18 09:30:29 +00003313static void receive_request(struct dlm_ls *ls, struct dlm_message *ms)
3314{
3315 struct dlm_lkb *lkb;
3316 struct dlm_rsb *r;
3317 int error, namelen;
3318
3319 error = create_lkb(ls, &lkb);
3320 if (error)
3321 goto fail;
3322
3323 receive_flags(lkb, ms);
3324 lkb->lkb_flags |= DLM_IFL_MSTCPY;
3325 error = receive_request_args(ls, lkb, ms);
3326 if (error) {
David Teiglandb3f58d82006-02-28 11:16:37 -05003327 __put_lkb(ls, lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003328 goto fail;
3329 }
3330
3331 namelen = receive_extralen(ms);
3332
3333 error = find_rsb(ls, ms->m_extra, namelen, R_MASTER, &r);
3334 if (error) {
David Teiglandb3f58d82006-02-28 11:16:37 -05003335 __put_lkb(ls, lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003336 goto fail;
3337 }
3338
3339 lock_rsb(r);
3340
3341 attach_lkb(r, lkb);
3342 error = do_request(r, lkb);
3343 send_request_reply(r, lkb, error);
David Teiglandcf6620a2010-02-24 11:59:23 -06003344 do_request_effects(r, lkb, error);
David Teiglande7fd4172006-01-18 09:30:29 +00003345
3346 unlock_rsb(r);
3347 put_rsb(r);
3348
3349 if (error == -EINPROGRESS)
3350 error = 0;
3351 if (error)
David Teiglandb3f58d82006-02-28 11:16:37 -05003352 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003353 return;
3354
3355 fail:
3356 setup_stub_lkb(ls, ms);
3357 send_request_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error);
3358}
3359
3360static void receive_convert(struct dlm_ls *ls, struct dlm_message *ms)
3361{
3362 struct dlm_lkb *lkb;
3363 struct dlm_rsb *r;
David Teigland90135922006-01-20 08:47:07 +00003364 int error, reply = 1;
David Teiglande7fd4172006-01-18 09:30:29 +00003365
3366 error = find_lkb(ls, ms->m_remid, &lkb);
3367 if (error)
3368 goto fail;
3369
3370 r = lkb->lkb_resource;
3371
3372 hold_rsb(r);
3373 lock_rsb(r);
3374
David Teiglandc54e04b2008-01-09 09:59:41 -06003375 error = validate_message(lkb, ms);
3376 if (error)
3377 goto out;
3378
David Teiglande7fd4172006-01-18 09:30:29 +00003379 receive_flags(lkb, ms);
David Teiglandcf6620a2010-02-24 11:59:23 -06003380
David Teiglande7fd4172006-01-18 09:30:29 +00003381 error = receive_convert_args(ls, lkb, ms);
David Teiglandcf6620a2010-02-24 11:59:23 -06003382 if (error) {
3383 send_convert_reply(r, lkb, error);
3384 goto out;
3385 }
3386
David Teiglande7fd4172006-01-18 09:30:29 +00003387 reply = !down_conversion(lkb);
3388
3389 error = do_convert(r, lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003390 if (reply)
3391 send_convert_reply(r, lkb, error);
David Teiglandcf6620a2010-02-24 11:59:23 -06003392 do_convert_effects(r, lkb, error);
David Teiglandc54e04b2008-01-09 09:59:41 -06003393 out:
David Teiglande7fd4172006-01-18 09:30:29 +00003394 unlock_rsb(r);
3395 put_rsb(r);
David Teiglandb3f58d82006-02-28 11:16:37 -05003396 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003397 return;
3398
3399 fail:
3400 setup_stub_lkb(ls, ms);
3401 send_convert_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error);
3402}
3403
3404static void receive_unlock(struct dlm_ls *ls, struct dlm_message *ms)
3405{
3406 struct dlm_lkb *lkb;
3407 struct dlm_rsb *r;
3408 int error;
3409
3410 error = find_lkb(ls, ms->m_remid, &lkb);
3411 if (error)
3412 goto fail;
3413
3414 r = lkb->lkb_resource;
3415
3416 hold_rsb(r);
3417 lock_rsb(r);
3418
David Teiglandc54e04b2008-01-09 09:59:41 -06003419 error = validate_message(lkb, ms);
David Teiglande7fd4172006-01-18 09:30:29 +00003420 if (error)
3421 goto out;
3422
David Teiglandc54e04b2008-01-09 09:59:41 -06003423 receive_flags(lkb, ms);
David Teiglandcf6620a2010-02-24 11:59:23 -06003424
David Teiglandc54e04b2008-01-09 09:59:41 -06003425 error = receive_unlock_args(ls, lkb, ms);
David Teiglandcf6620a2010-02-24 11:59:23 -06003426 if (error) {
3427 send_unlock_reply(r, lkb, error);
3428 goto out;
3429 }
David Teiglande7fd4172006-01-18 09:30:29 +00003430
David Teiglandc54e04b2008-01-09 09:59:41 -06003431 error = do_unlock(r, lkb);
David Teiglandc54e04b2008-01-09 09:59:41 -06003432 send_unlock_reply(r, lkb, error);
David Teiglandcf6620a2010-02-24 11:59:23 -06003433 do_unlock_effects(r, lkb, error);
David Teiglandc54e04b2008-01-09 09:59:41 -06003434 out:
David Teiglande7fd4172006-01-18 09:30:29 +00003435 unlock_rsb(r);
3436 put_rsb(r);
David Teiglandb3f58d82006-02-28 11:16:37 -05003437 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003438 return;
3439
3440 fail:
3441 setup_stub_lkb(ls, ms);
3442 send_unlock_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error);
3443}
3444
3445static void receive_cancel(struct dlm_ls *ls, struct dlm_message *ms)
3446{
3447 struct dlm_lkb *lkb;
3448 struct dlm_rsb *r;
3449 int error;
3450
3451 error = find_lkb(ls, ms->m_remid, &lkb);
3452 if (error)
3453 goto fail;
3454
3455 receive_flags(lkb, ms);
3456
3457 r = lkb->lkb_resource;
3458
3459 hold_rsb(r);
3460 lock_rsb(r);
3461
David Teiglandc54e04b2008-01-09 09:59:41 -06003462 error = validate_message(lkb, ms);
3463 if (error)
3464 goto out;
3465
David Teiglande7fd4172006-01-18 09:30:29 +00003466 error = do_cancel(r, lkb);
3467 send_cancel_reply(r, lkb, error);
David Teiglandcf6620a2010-02-24 11:59:23 -06003468 do_cancel_effects(r, lkb, error);
David Teiglandc54e04b2008-01-09 09:59:41 -06003469 out:
David Teiglande7fd4172006-01-18 09:30:29 +00003470 unlock_rsb(r);
3471 put_rsb(r);
David Teiglandb3f58d82006-02-28 11:16:37 -05003472 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003473 return;
3474
3475 fail:
3476 setup_stub_lkb(ls, ms);
3477 send_cancel_reply(&ls->ls_stub_rsb, &ls->ls_stub_lkb, error);
3478}
3479
3480static void receive_grant(struct dlm_ls *ls, struct dlm_message *ms)
3481{
3482 struct dlm_lkb *lkb;
3483 struct dlm_rsb *r;
3484 int error;
3485
3486 error = find_lkb(ls, ms->m_remid, &lkb);
3487 if (error) {
David Teiglandc54e04b2008-01-09 09:59:41 -06003488 log_debug(ls, "receive_grant from %d no lkb %x",
3489 ms->m_header.h_nodeid, ms->m_remid);
David Teiglande7fd4172006-01-18 09:30:29 +00003490 return;
3491 }
David Teiglande7fd4172006-01-18 09:30:29 +00003492
3493 r = lkb->lkb_resource;
3494
3495 hold_rsb(r);
3496 lock_rsb(r);
3497
David Teiglandc54e04b2008-01-09 09:59:41 -06003498 error = validate_message(lkb, ms);
3499 if (error)
3500 goto out;
3501
David Teiglande7fd4172006-01-18 09:30:29 +00003502 receive_flags_reply(lkb, ms);
David Teigland7d3c1fe2007-04-19 10:30:41 -05003503 if (is_altmode(lkb))
3504 munge_altmode(lkb, ms);
David Teiglande7fd4172006-01-18 09:30:29 +00003505 grant_lock_pc(r, lkb, ms);
3506 queue_cast(r, lkb, 0);
David Teiglandc54e04b2008-01-09 09:59:41 -06003507 out:
David Teiglande7fd4172006-01-18 09:30:29 +00003508 unlock_rsb(r);
3509 put_rsb(r);
David Teiglandb3f58d82006-02-28 11:16:37 -05003510 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003511}
3512
3513static void receive_bast(struct dlm_ls *ls, struct dlm_message *ms)
3514{
3515 struct dlm_lkb *lkb;
3516 struct dlm_rsb *r;
3517 int error;
3518
3519 error = find_lkb(ls, ms->m_remid, &lkb);
3520 if (error) {
David Teiglandc54e04b2008-01-09 09:59:41 -06003521 log_debug(ls, "receive_bast from %d no lkb %x",
3522 ms->m_header.h_nodeid, ms->m_remid);
David Teiglande7fd4172006-01-18 09:30:29 +00003523 return;
3524 }
David Teiglande7fd4172006-01-18 09:30:29 +00003525
3526 r = lkb->lkb_resource;
3527
3528 hold_rsb(r);
3529 lock_rsb(r);
3530
David Teiglandc54e04b2008-01-09 09:59:41 -06003531 error = validate_message(lkb, ms);
3532 if (error)
3533 goto out;
David Teiglande7fd4172006-01-18 09:30:29 +00003534
David Teiglandc54e04b2008-01-09 09:59:41 -06003535 queue_bast(r, lkb, ms->m_bastmode);
3536 out:
David Teiglande7fd4172006-01-18 09:30:29 +00003537 unlock_rsb(r);
3538 put_rsb(r);
David Teiglandb3f58d82006-02-28 11:16:37 -05003539 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003540}
3541
3542static void receive_lookup(struct dlm_ls *ls, struct dlm_message *ms)
3543{
3544 int len, error, ret_nodeid, dir_nodeid, from_nodeid, our_nodeid;
3545
3546 from_nodeid = ms->m_header.h_nodeid;
3547 our_nodeid = dlm_our_nodeid();
3548
3549 len = receive_extralen(ms);
3550
3551 dir_nodeid = dlm_hash2nodeid(ls, ms->m_hash);
3552 if (dir_nodeid != our_nodeid) {
3553 log_error(ls, "lookup dir_nodeid %d from %d",
3554 dir_nodeid, from_nodeid);
3555 error = -EINVAL;
3556 ret_nodeid = -1;
3557 goto out;
3558 }
3559
3560 error = dlm_dir_lookup(ls, from_nodeid, ms->m_extra, len, &ret_nodeid);
3561
3562 /* Optimization: we're master so treat lookup as a request */
3563 if (!error && ret_nodeid == our_nodeid) {
3564 receive_request(ls, ms);
3565 return;
3566 }
3567 out:
3568 send_lookup_reply(ls, ms, ret_nodeid, error);
3569}
3570
3571static void receive_remove(struct dlm_ls *ls, struct dlm_message *ms)
3572{
3573 int len, dir_nodeid, from_nodeid;
3574
3575 from_nodeid = ms->m_header.h_nodeid;
3576
3577 len = receive_extralen(ms);
3578
3579 dir_nodeid = dlm_hash2nodeid(ls, ms->m_hash);
3580 if (dir_nodeid != dlm_our_nodeid()) {
3581 log_error(ls, "remove dir entry dir_nodeid %d from %d",
3582 dir_nodeid, from_nodeid);
3583 return;
3584 }
3585
3586 dlm_dir_remove_entry(ls, from_nodeid, ms->m_extra, len);
3587}
3588
David Teigland84991372007-03-30 15:02:40 -05003589static void receive_purge(struct dlm_ls *ls, struct dlm_message *ms)
3590{
3591 do_purge(ls, ms->m_nodeid, ms->m_pid);
3592}
3593
David Teiglande7fd4172006-01-18 09:30:29 +00003594static void receive_request_reply(struct dlm_ls *ls, struct dlm_message *ms)
3595{
3596 struct dlm_lkb *lkb;
3597 struct dlm_rsb *r;
David Teiglandef0c2bb2007-03-28 09:56:46 -05003598 int error, mstype, result;
David Teiglande7fd4172006-01-18 09:30:29 +00003599
3600 error = find_lkb(ls, ms->m_remid, &lkb);
3601 if (error) {
David Teiglandc54e04b2008-01-09 09:59:41 -06003602 log_debug(ls, "receive_request_reply from %d no lkb %x",
3603 ms->m_header.h_nodeid, ms->m_remid);
David Teiglande7fd4172006-01-18 09:30:29 +00003604 return;
3605 }
David Teiglande7fd4172006-01-18 09:30:29 +00003606
David Teiglande7fd4172006-01-18 09:30:29 +00003607 r = lkb->lkb_resource;
3608 hold_rsb(r);
3609 lock_rsb(r);
3610
David Teiglandc54e04b2008-01-09 09:59:41 -06003611 error = validate_message(lkb, ms);
3612 if (error)
3613 goto out;
3614
David Teiglandef0c2bb2007-03-28 09:56:46 -05003615 mstype = lkb->lkb_wait_type;
3616 error = remove_from_waiters(lkb, DLM_MSG_REQUEST_REPLY);
3617 if (error)
3618 goto out;
3619
David Teiglande7fd4172006-01-18 09:30:29 +00003620 /* Optimization: the dir node was also the master, so it took our
3621 lookup as a request and sent request reply instead of lookup reply */
3622 if (mstype == DLM_MSG_LOOKUP) {
3623 r->res_nodeid = ms->m_header.h_nodeid;
3624 lkb->lkb_nodeid = r->res_nodeid;
3625 }
3626
David Teiglandef0c2bb2007-03-28 09:56:46 -05003627 /* this is the value returned from do_request() on the master */
3628 result = ms->m_result;
3629
3630 switch (result) {
David Teiglande7fd4172006-01-18 09:30:29 +00003631 case -EAGAIN:
David Teiglandef0c2bb2007-03-28 09:56:46 -05003632 /* request would block (be queued) on remote master */
David Teiglande7fd4172006-01-18 09:30:29 +00003633 queue_cast(r, lkb, -EAGAIN);
3634 confirm_master(r, -EAGAIN);
David Teiglandef0c2bb2007-03-28 09:56:46 -05003635 unhold_lkb(lkb); /* undoes create_lkb() */
David Teiglande7fd4172006-01-18 09:30:29 +00003636 break;
3637
3638 case -EINPROGRESS:
3639 case 0:
3640 /* request was queued or granted on remote master */
3641 receive_flags_reply(lkb, ms);
3642 lkb->lkb_remid = ms->m_lkid;
David Teigland7d3c1fe2007-04-19 10:30:41 -05003643 if (is_altmode(lkb))
3644 munge_altmode(lkb, ms);
David Teigland3ae1acf2007-05-18 08:59:31 -05003645 if (result) {
David Teiglande7fd4172006-01-18 09:30:29 +00003646 add_lkb(r, lkb, DLM_LKSTS_WAITING);
David Teigland3ae1acf2007-05-18 08:59:31 -05003647 add_timeout(lkb);
3648 } else {
David Teiglande7fd4172006-01-18 09:30:29 +00003649 grant_lock_pc(r, lkb, ms);
3650 queue_cast(r, lkb, 0);
3651 }
David Teiglandef0c2bb2007-03-28 09:56:46 -05003652 confirm_master(r, result);
David Teiglande7fd4172006-01-18 09:30:29 +00003653 break;
3654
David Teigland597d0ca2006-07-12 16:44:04 -05003655 case -EBADR:
David Teiglande7fd4172006-01-18 09:30:29 +00003656 case -ENOTBLK:
3657 /* find_rsb failed to find rsb or rsb wasn't master */
David Teiglandef0c2bb2007-03-28 09:56:46 -05003658 log_debug(ls, "receive_request_reply %x %x master diff %d %d",
3659 lkb->lkb_id, lkb->lkb_flags, r->res_nodeid, result);
David Teiglande7fd4172006-01-18 09:30:29 +00003660 r->res_nodeid = -1;
3661 lkb->lkb_nodeid = -1;
David Teiglandef0c2bb2007-03-28 09:56:46 -05003662
3663 if (is_overlap(lkb)) {
3664 /* we'll ignore error in cancel/unlock reply */
3665 queue_cast_overlap(r, lkb);
David Teiglandaec64e12008-01-08 15:37:47 -06003666 confirm_master(r, result);
David Teiglandef0c2bb2007-03-28 09:56:46 -05003667 unhold_lkb(lkb); /* undoes create_lkb() */
3668 } else
3669 _request_lock(r, lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003670 break;
3671
3672 default:
David Teiglandef0c2bb2007-03-28 09:56:46 -05003673 log_error(ls, "receive_request_reply %x error %d",
3674 lkb->lkb_id, result);
David Teiglande7fd4172006-01-18 09:30:29 +00003675 }
3676
David Teiglandef0c2bb2007-03-28 09:56:46 -05003677 if (is_overlap_unlock(lkb) && (result == 0 || result == -EINPROGRESS)) {
3678 log_debug(ls, "receive_request_reply %x result %d unlock",
3679 lkb->lkb_id, result);
3680 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK;
3681 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL;
3682 send_unlock(r, lkb);
3683 } else if (is_overlap_cancel(lkb) && (result == -EINPROGRESS)) {
3684 log_debug(ls, "receive_request_reply %x cancel", lkb->lkb_id);
3685 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK;
3686 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL;
3687 send_cancel(r, lkb);
3688 } else {
3689 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL;
3690 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK;
3691 }
3692 out:
David Teiglande7fd4172006-01-18 09:30:29 +00003693 unlock_rsb(r);
3694 put_rsb(r);
David Teiglandb3f58d82006-02-28 11:16:37 -05003695 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003696}
3697
3698static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb,
3699 struct dlm_message *ms)
3700{
David Teiglande7fd4172006-01-18 09:30:29 +00003701 /* this is the value returned from do_convert() on the master */
David Teiglandef0c2bb2007-03-28 09:56:46 -05003702 switch (ms->m_result) {
David Teiglande7fd4172006-01-18 09:30:29 +00003703 case -EAGAIN:
3704 /* convert would block (be queued) on remote master */
3705 queue_cast(r, lkb, -EAGAIN);
3706 break;
3707
David Teiglandc85d65e2007-05-18 09:01:26 -05003708 case -EDEADLK:
3709 receive_flags_reply(lkb, ms);
3710 revert_lock_pc(r, lkb);
3711 queue_cast(r, lkb, -EDEADLK);
3712 break;
3713
David Teiglande7fd4172006-01-18 09:30:29 +00003714 case -EINPROGRESS:
3715 /* convert was queued on remote master */
David Teigland7d3c1fe2007-04-19 10:30:41 -05003716 receive_flags_reply(lkb, ms);
3717 if (is_demoted(lkb))
David Teigland2a7ce0e2011-04-04 15:19:59 -05003718 munge_demoted(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003719 del_lkb(r, lkb);
3720 add_lkb(r, lkb, DLM_LKSTS_CONVERT);
David Teigland3ae1acf2007-05-18 08:59:31 -05003721 add_timeout(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003722 break;
3723
3724 case 0:
3725 /* convert was granted on remote master */
3726 receive_flags_reply(lkb, ms);
David Teigland7d3c1fe2007-04-19 10:30:41 -05003727 if (is_demoted(lkb))
David Teigland2a7ce0e2011-04-04 15:19:59 -05003728 munge_demoted(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003729 grant_lock_pc(r, lkb, ms);
3730 queue_cast(r, lkb, 0);
3731 break;
3732
3733 default:
David Teiglandef0c2bb2007-03-28 09:56:46 -05003734 log_error(r->res_ls, "receive_convert_reply %x error %d",
3735 lkb->lkb_id, ms->m_result);
David Teiglande7fd4172006-01-18 09:30:29 +00003736 }
3737}
3738
3739static void _receive_convert_reply(struct dlm_lkb *lkb, struct dlm_message *ms)
3740{
3741 struct dlm_rsb *r = lkb->lkb_resource;
David Teiglandef0c2bb2007-03-28 09:56:46 -05003742 int error;
David Teiglande7fd4172006-01-18 09:30:29 +00003743
3744 hold_rsb(r);
3745 lock_rsb(r);
3746
David Teiglandc54e04b2008-01-09 09:59:41 -06003747 error = validate_message(lkb, ms);
3748 if (error)
3749 goto out;
3750
David Teiglandef0c2bb2007-03-28 09:56:46 -05003751 /* stub reply can happen with waiters_mutex held */
3752 error = remove_from_waiters_ms(lkb, ms);
3753 if (error)
3754 goto out;
David Teiglande7fd4172006-01-18 09:30:29 +00003755
David Teiglandef0c2bb2007-03-28 09:56:46 -05003756 __receive_convert_reply(r, lkb, ms);
3757 out:
David Teiglande7fd4172006-01-18 09:30:29 +00003758 unlock_rsb(r);
3759 put_rsb(r);
3760}
3761
3762static void receive_convert_reply(struct dlm_ls *ls, struct dlm_message *ms)
3763{
3764 struct dlm_lkb *lkb;
3765 int error;
3766
3767 error = find_lkb(ls, ms->m_remid, &lkb);
3768 if (error) {
David Teiglandc54e04b2008-01-09 09:59:41 -06003769 log_debug(ls, "receive_convert_reply from %d no lkb %x",
3770 ms->m_header.h_nodeid, ms->m_remid);
David Teiglande7fd4172006-01-18 09:30:29 +00003771 return;
3772 }
David Teiglande7fd4172006-01-18 09:30:29 +00003773
David Teiglande7fd4172006-01-18 09:30:29 +00003774 _receive_convert_reply(lkb, ms);
David Teiglandb3f58d82006-02-28 11:16:37 -05003775 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003776}
3777
3778static void _receive_unlock_reply(struct dlm_lkb *lkb, struct dlm_message *ms)
3779{
3780 struct dlm_rsb *r = lkb->lkb_resource;
David Teiglandef0c2bb2007-03-28 09:56:46 -05003781 int error;
David Teiglande7fd4172006-01-18 09:30:29 +00003782
3783 hold_rsb(r);
3784 lock_rsb(r);
3785
David Teiglandc54e04b2008-01-09 09:59:41 -06003786 error = validate_message(lkb, ms);
3787 if (error)
3788 goto out;
3789
David Teiglandef0c2bb2007-03-28 09:56:46 -05003790 /* stub reply can happen with waiters_mutex held */
3791 error = remove_from_waiters_ms(lkb, ms);
3792 if (error)
3793 goto out;
3794
David Teiglande7fd4172006-01-18 09:30:29 +00003795 /* this is the value returned from do_unlock() on the master */
3796
David Teiglandef0c2bb2007-03-28 09:56:46 -05003797 switch (ms->m_result) {
David Teiglande7fd4172006-01-18 09:30:29 +00003798 case -DLM_EUNLOCK:
3799 receive_flags_reply(lkb, ms);
3800 remove_lock_pc(r, lkb);
3801 queue_cast(r, lkb, -DLM_EUNLOCK);
3802 break;
David Teiglandef0c2bb2007-03-28 09:56:46 -05003803 case -ENOENT:
3804 break;
David Teiglande7fd4172006-01-18 09:30:29 +00003805 default:
David Teiglandef0c2bb2007-03-28 09:56:46 -05003806 log_error(r->res_ls, "receive_unlock_reply %x error %d",
3807 lkb->lkb_id, ms->m_result);
David Teiglande7fd4172006-01-18 09:30:29 +00003808 }
David Teiglandef0c2bb2007-03-28 09:56:46 -05003809 out:
David Teiglande7fd4172006-01-18 09:30:29 +00003810 unlock_rsb(r);
3811 put_rsb(r);
3812}
3813
3814static void receive_unlock_reply(struct dlm_ls *ls, struct dlm_message *ms)
3815{
3816 struct dlm_lkb *lkb;
3817 int error;
3818
3819 error = find_lkb(ls, ms->m_remid, &lkb);
3820 if (error) {
David Teiglandc54e04b2008-01-09 09:59:41 -06003821 log_debug(ls, "receive_unlock_reply from %d no lkb %x",
3822 ms->m_header.h_nodeid, ms->m_remid);
David Teiglande7fd4172006-01-18 09:30:29 +00003823 return;
3824 }
David Teiglande7fd4172006-01-18 09:30:29 +00003825
David Teiglande7fd4172006-01-18 09:30:29 +00003826 _receive_unlock_reply(lkb, ms);
David Teiglandb3f58d82006-02-28 11:16:37 -05003827 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003828}
3829
3830static void _receive_cancel_reply(struct dlm_lkb *lkb, struct dlm_message *ms)
3831{
3832 struct dlm_rsb *r = lkb->lkb_resource;
David Teiglandef0c2bb2007-03-28 09:56:46 -05003833 int error;
David Teiglande7fd4172006-01-18 09:30:29 +00003834
3835 hold_rsb(r);
3836 lock_rsb(r);
3837
David Teiglandc54e04b2008-01-09 09:59:41 -06003838 error = validate_message(lkb, ms);
3839 if (error)
3840 goto out;
3841
David Teiglandef0c2bb2007-03-28 09:56:46 -05003842 /* stub reply can happen with waiters_mutex held */
3843 error = remove_from_waiters_ms(lkb, ms);
3844 if (error)
3845 goto out;
3846
David Teiglande7fd4172006-01-18 09:30:29 +00003847 /* this is the value returned from do_cancel() on the master */
3848
David Teiglandef0c2bb2007-03-28 09:56:46 -05003849 switch (ms->m_result) {
David Teiglande7fd4172006-01-18 09:30:29 +00003850 case -DLM_ECANCEL:
3851 receive_flags_reply(lkb, ms);
3852 revert_lock_pc(r, lkb);
David Teigland84d8cd62007-05-29 08:44:23 -05003853 queue_cast(r, lkb, -DLM_ECANCEL);
David Teiglandef0c2bb2007-03-28 09:56:46 -05003854 break;
3855 case 0:
David Teiglande7fd4172006-01-18 09:30:29 +00003856 break;
3857 default:
David Teiglandef0c2bb2007-03-28 09:56:46 -05003858 log_error(r->res_ls, "receive_cancel_reply %x error %d",
3859 lkb->lkb_id, ms->m_result);
David Teiglande7fd4172006-01-18 09:30:29 +00003860 }
David Teiglandef0c2bb2007-03-28 09:56:46 -05003861 out:
David Teiglande7fd4172006-01-18 09:30:29 +00003862 unlock_rsb(r);
3863 put_rsb(r);
3864}
3865
3866static void receive_cancel_reply(struct dlm_ls *ls, struct dlm_message *ms)
3867{
3868 struct dlm_lkb *lkb;
3869 int error;
3870
3871 error = find_lkb(ls, ms->m_remid, &lkb);
3872 if (error) {
David Teiglandc54e04b2008-01-09 09:59:41 -06003873 log_debug(ls, "receive_cancel_reply from %d no lkb %x",
3874 ms->m_header.h_nodeid, ms->m_remid);
David Teiglande7fd4172006-01-18 09:30:29 +00003875 return;
3876 }
David Teiglande7fd4172006-01-18 09:30:29 +00003877
David Teiglande7fd4172006-01-18 09:30:29 +00003878 _receive_cancel_reply(lkb, ms);
David Teiglandb3f58d82006-02-28 11:16:37 -05003879 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003880}
3881
3882static void receive_lookup_reply(struct dlm_ls *ls, struct dlm_message *ms)
3883{
3884 struct dlm_lkb *lkb;
3885 struct dlm_rsb *r;
3886 int error, ret_nodeid;
3887
3888 error = find_lkb(ls, ms->m_lkid, &lkb);
3889 if (error) {
3890 log_error(ls, "receive_lookup_reply no lkb");
3891 return;
3892 }
3893
David Teiglandef0c2bb2007-03-28 09:56:46 -05003894 /* ms->m_result is the value returned by dlm_dir_lookup on dir node
David Teiglande7fd4172006-01-18 09:30:29 +00003895 FIXME: will a non-zero error ever be returned? */
David Teiglande7fd4172006-01-18 09:30:29 +00003896
3897 r = lkb->lkb_resource;
3898 hold_rsb(r);
3899 lock_rsb(r);
3900
David Teiglandef0c2bb2007-03-28 09:56:46 -05003901 error = remove_from_waiters(lkb, DLM_MSG_LOOKUP_REPLY);
3902 if (error)
3903 goto out;
3904
David Teiglande7fd4172006-01-18 09:30:29 +00003905 ret_nodeid = ms->m_nodeid;
3906 if (ret_nodeid == dlm_our_nodeid()) {
3907 r->res_nodeid = 0;
3908 ret_nodeid = 0;
3909 r->res_first_lkid = 0;
3910 } else {
3911 /* set_master() will copy res_nodeid to lkb_nodeid */
3912 r->res_nodeid = ret_nodeid;
3913 }
3914
David Teiglandef0c2bb2007-03-28 09:56:46 -05003915 if (is_overlap(lkb)) {
3916 log_debug(ls, "receive_lookup_reply %x unlock %x",
3917 lkb->lkb_id, lkb->lkb_flags);
3918 queue_cast_overlap(r, lkb);
3919 unhold_lkb(lkb); /* undoes create_lkb() */
3920 goto out_list;
3921 }
3922
David Teiglande7fd4172006-01-18 09:30:29 +00003923 _request_lock(r, lkb);
3924
David Teiglandef0c2bb2007-03-28 09:56:46 -05003925 out_list:
David Teiglande7fd4172006-01-18 09:30:29 +00003926 if (!ret_nodeid)
3927 process_lookup_list(r);
David Teiglandef0c2bb2007-03-28 09:56:46 -05003928 out:
David Teiglande7fd4172006-01-18 09:30:29 +00003929 unlock_rsb(r);
3930 put_rsb(r);
David Teiglandb3f58d82006-02-28 11:16:37 -05003931 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00003932}
3933
David Teiglandc36258b2007-09-27 15:53:38 -05003934static void _receive_message(struct dlm_ls *ls, struct dlm_message *ms)
David Teiglande7fd4172006-01-18 09:30:29 +00003935{
David Teigland46b43ee2008-01-08 16:24:00 -06003936 if (!dlm_is_member(ls, ms->m_header.h_nodeid)) {
3937 log_debug(ls, "ignore non-member message %d from %d %x %x %d",
3938 ms->m_type, ms->m_header.h_nodeid, ms->m_lkid,
3939 ms->m_remid, ms->m_result);
3940 return;
3941 }
3942
David Teiglande7fd4172006-01-18 09:30:29 +00003943 switch (ms->m_type) {
3944
3945 /* messages sent to a master node */
3946
3947 case DLM_MSG_REQUEST:
3948 receive_request(ls, ms);
3949 break;
3950
3951 case DLM_MSG_CONVERT:
3952 receive_convert(ls, ms);
3953 break;
3954
3955 case DLM_MSG_UNLOCK:
3956 receive_unlock(ls, ms);
3957 break;
3958
3959 case DLM_MSG_CANCEL:
3960 receive_cancel(ls, ms);
3961 break;
3962
3963 /* messages sent from a master node (replies to above) */
3964
3965 case DLM_MSG_REQUEST_REPLY:
3966 receive_request_reply(ls, ms);
3967 break;
3968
3969 case DLM_MSG_CONVERT_REPLY:
3970 receive_convert_reply(ls, ms);
3971 break;
3972
3973 case DLM_MSG_UNLOCK_REPLY:
3974 receive_unlock_reply(ls, ms);
3975 break;
3976
3977 case DLM_MSG_CANCEL_REPLY:
3978 receive_cancel_reply(ls, ms);
3979 break;
3980
3981 /* messages sent from a master node (only two types of async msg) */
3982
3983 case DLM_MSG_GRANT:
3984 receive_grant(ls, ms);
3985 break;
3986
3987 case DLM_MSG_BAST:
3988 receive_bast(ls, ms);
3989 break;
3990
3991 /* messages sent to a dir node */
3992
3993 case DLM_MSG_LOOKUP:
3994 receive_lookup(ls, ms);
3995 break;
3996
3997 case DLM_MSG_REMOVE:
3998 receive_remove(ls, ms);
3999 break;
4000
4001 /* messages sent from a dir node (remove has no reply) */
4002
4003 case DLM_MSG_LOOKUP_REPLY:
4004 receive_lookup_reply(ls, ms);
4005 break;
4006
David Teigland84991372007-03-30 15:02:40 -05004007 /* other messages */
4008
4009 case DLM_MSG_PURGE:
4010 receive_purge(ls, ms);
4011 break;
4012
David Teiglande7fd4172006-01-18 09:30:29 +00004013 default:
4014 log_error(ls, "unknown message type %d", ms->m_type);
4015 }
4016
David Teiglande7fd4172006-01-18 09:30:29 +00004017 dlm_astd_wake();
David Teiglande7fd4172006-01-18 09:30:29 +00004018}
4019
David Teiglandc36258b2007-09-27 15:53:38 -05004020/* If the lockspace is in recovery mode (locking stopped), then normal
4021 messages are saved on the requestqueue for processing after recovery is
4022 done. When not in recovery mode, we wait for dlm_recoverd to drain saved
4023 messages off the requestqueue before we process new ones. This occurs right
4024 after recovery completes when we transition from saving all messages on
4025 requestqueue, to processing all the saved messages, to processing new
4026 messages as they arrive. */
David Teiglande7fd4172006-01-18 09:30:29 +00004027
David Teiglandc36258b2007-09-27 15:53:38 -05004028static void dlm_receive_message(struct dlm_ls *ls, struct dlm_message *ms,
4029 int nodeid)
4030{
4031 if (dlm_locking_stopped(ls)) {
Al Viro8b0d8e02008-01-25 00:28:28 -05004032 dlm_add_requestqueue(ls, nodeid, ms);
David Teiglandc36258b2007-09-27 15:53:38 -05004033 } else {
4034 dlm_wait_requestqueue(ls);
4035 _receive_message(ls, ms);
4036 }
4037}
4038
4039/* This is called by dlm_recoverd to process messages that were saved on
4040 the requestqueue. */
4041
4042void dlm_receive_message_saved(struct dlm_ls *ls, struct dlm_message *ms)
4043{
4044 _receive_message(ls, ms);
4045}
4046
4047/* This is called by the midcomms layer when something is received for
4048 the lockspace. It could be either a MSG (normal message sent as part of
4049 standard locking activity) or an RCOM (recovery message sent as part of
4050 lockspace recovery). */
4051
Al Viroeef7d732008-01-25 00:58:46 -05004052void dlm_receive_buffer(union dlm_packet *p, int nodeid)
David Teiglandc36258b2007-09-27 15:53:38 -05004053{
Al Viroeef7d732008-01-25 00:58:46 -05004054 struct dlm_header *hd = &p->header;
David Teiglandc36258b2007-09-27 15:53:38 -05004055 struct dlm_ls *ls;
4056 int type = 0;
4057
4058 switch (hd->h_cmd) {
4059 case DLM_MSG:
Al Viroeef7d732008-01-25 00:58:46 -05004060 dlm_message_in(&p->message);
4061 type = p->message.m_type;
David Teiglandc36258b2007-09-27 15:53:38 -05004062 break;
4063 case DLM_RCOM:
Al Viroeef7d732008-01-25 00:58:46 -05004064 dlm_rcom_in(&p->rcom);
4065 type = p->rcom.rc_type;
David Teiglandc36258b2007-09-27 15:53:38 -05004066 break;
4067 default:
4068 log_print("invalid h_cmd %d from %u", hd->h_cmd, nodeid);
4069 return;
4070 }
4071
4072 if (hd->h_nodeid != nodeid) {
4073 log_print("invalid h_nodeid %d from %d lockspace %x",
4074 hd->h_nodeid, nodeid, hd->h_lockspace);
4075 return;
4076 }
4077
4078 ls = dlm_find_lockspace_global(hd->h_lockspace);
4079 if (!ls) {
David Teigland594199e2008-01-16 11:03:41 -06004080 if (dlm_config.ci_log_debug)
4081 log_print("invalid lockspace %x from %d cmd %d type %d",
4082 hd->h_lockspace, nodeid, hd->h_cmd, type);
David Teiglandc36258b2007-09-27 15:53:38 -05004083
4084 if (hd->h_cmd == DLM_RCOM && type == DLM_RCOM_STATUS)
Al Viroeef7d732008-01-25 00:58:46 -05004085 dlm_send_ls_not_ready(nodeid, &p->rcom);
David Teiglandc36258b2007-09-27 15:53:38 -05004086 return;
4087 }
4088
4089 /* this rwsem allows dlm_ls_stop() to wait for all dlm_recv threads to
4090 be inactive (in this ls) before transitioning to recovery mode */
4091
4092 down_read(&ls->ls_recv_active);
4093 if (hd->h_cmd == DLM_MSG)
Al Viroeef7d732008-01-25 00:58:46 -05004094 dlm_receive_message(ls, &p->message, nodeid);
David Teiglandc36258b2007-09-27 15:53:38 -05004095 else
Al Viroeef7d732008-01-25 00:58:46 -05004096 dlm_receive_rcom(ls, &p->rcom, nodeid);
David Teiglandc36258b2007-09-27 15:53:38 -05004097 up_read(&ls->ls_recv_active);
4098
4099 dlm_put_lockspace(ls);
4100}
David Teiglande7fd4172006-01-18 09:30:29 +00004101
David Teigland2a7ce0e2011-04-04 15:19:59 -05004102static void recover_convert_waiter(struct dlm_ls *ls, struct dlm_lkb *lkb,
4103 struct dlm_message *ms_stub)
David Teiglande7fd4172006-01-18 09:30:29 +00004104{
4105 if (middle_conversion(lkb)) {
4106 hold_lkb(lkb);
David Teigland2a7ce0e2011-04-04 15:19:59 -05004107 memset(ms_stub, 0, sizeof(struct dlm_message));
4108 ms_stub->m_flags = DLM_IFL_STUB_MS;
4109 ms_stub->m_type = DLM_MSG_CONVERT_REPLY;
4110 ms_stub->m_result = -EINPROGRESS;
4111 ms_stub->m_header.h_nodeid = lkb->lkb_nodeid;
4112 _receive_convert_reply(lkb, ms_stub);
David Teiglande7fd4172006-01-18 09:30:29 +00004113
4114 /* Same special case as in receive_rcom_lock_args() */
4115 lkb->lkb_grmode = DLM_LOCK_IV;
4116 rsb_set_flag(lkb->lkb_resource, RSB_RECOVER_CONVERT);
4117 unhold_lkb(lkb);
4118
4119 } else if (lkb->lkb_rqmode >= lkb->lkb_grmode) {
4120 lkb->lkb_flags |= DLM_IFL_RESEND;
4121 }
4122
4123 /* lkb->lkb_rqmode < lkb->lkb_grmode shouldn't happen since down
4124 conversions are async; there's no reply from the remote master */
4125}
4126
4127/* A waiting lkb needs recovery if the master node has failed, or
4128 the master node is changing (only when no directory is used) */
4129
4130static int waiter_needs_recovery(struct dlm_ls *ls, struct dlm_lkb *lkb)
4131{
4132 if (dlm_is_removed(ls, lkb->lkb_nodeid))
4133 return 1;
4134
4135 if (!dlm_no_directory(ls))
4136 return 0;
4137
4138 if (dlm_dir_nodeid(lkb->lkb_resource) != lkb->lkb_nodeid)
4139 return 1;
4140
4141 return 0;
4142}
4143
4144/* Recovery for locks that are waiting for replies from nodes that are now
4145 gone. We can just complete unlocks and cancels by faking a reply from the
4146 dead node. Requests and up-conversions we flag to be resent after
4147 recovery. Down-conversions can just be completed with a fake reply like
4148 unlocks. Conversions between PR and CW need special attention. */
4149
4150void dlm_recover_waiters_pre(struct dlm_ls *ls)
4151{
4152 struct dlm_lkb *lkb, *safe;
David Teigland2a7ce0e2011-04-04 15:19:59 -05004153 struct dlm_message *ms_stub;
David Teigland601342c2008-01-07 16:15:05 -06004154 int wait_type, stub_unlock_result, stub_cancel_result;
David Teiglande7fd4172006-01-18 09:30:29 +00004155
David Teiglanda22ca482011-07-11 08:40:53 -05004156 ms_stub = kmalloc(sizeof(struct dlm_message), GFP_KERNEL);
David Teigland2a7ce0e2011-04-04 15:19:59 -05004157 if (!ms_stub) {
4158 log_error(ls, "dlm_recover_waiters_pre no mem");
4159 return;
4160 }
4161
David Teigland90135922006-01-20 08:47:07 +00004162 mutex_lock(&ls->ls_waiters_mutex);
David Teiglande7fd4172006-01-18 09:30:29 +00004163
4164 list_for_each_entry_safe(lkb, safe, &ls->ls_waiters, lkb_wait_reply) {
David Teigland2a7ce0e2011-04-04 15:19:59 -05004165
4166 /* exclude debug messages about unlocks because there can be so
4167 many and they aren't very interesting */
4168
4169 if (lkb->lkb_wait_type != DLM_MSG_UNLOCK) {
4170 log_debug(ls, "recover_waiter %x nodeid %d "
4171 "msg %d to %d", lkb->lkb_id, lkb->lkb_nodeid,
4172 lkb->lkb_wait_type, lkb->lkb_wait_nodeid);
4173 }
David Teiglande7fd4172006-01-18 09:30:29 +00004174
4175 /* all outstanding lookups, regardless of destination will be
4176 resent after recovery is done */
4177
4178 if (lkb->lkb_wait_type == DLM_MSG_LOOKUP) {
4179 lkb->lkb_flags |= DLM_IFL_RESEND;
4180 continue;
4181 }
4182
4183 if (!waiter_needs_recovery(ls, lkb))
4184 continue;
4185
David Teigland601342c2008-01-07 16:15:05 -06004186 wait_type = lkb->lkb_wait_type;
4187 stub_unlock_result = -DLM_EUNLOCK;
4188 stub_cancel_result = -DLM_ECANCEL;
4189
4190 /* Main reply may have been received leaving a zero wait_type,
4191 but a reply for the overlapping op may not have been
4192 received. In that case we need to fake the appropriate
4193 reply for the overlap op. */
4194
4195 if (!wait_type) {
4196 if (is_overlap_cancel(lkb)) {
4197 wait_type = DLM_MSG_CANCEL;
4198 if (lkb->lkb_grmode == DLM_LOCK_IV)
4199 stub_cancel_result = 0;
4200 }
4201 if (is_overlap_unlock(lkb)) {
4202 wait_type = DLM_MSG_UNLOCK;
4203 if (lkb->lkb_grmode == DLM_LOCK_IV)
4204 stub_unlock_result = -ENOENT;
4205 }
4206
4207 log_debug(ls, "rwpre overlap %x %x %d %d %d",
4208 lkb->lkb_id, lkb->lkb_flags, wait_type,
4209 stub_cancel_result, stub_unlock_result);
4210 }
4211
4212 switch (wait_type) {
David Teiglande7fd4172006-01-18 09:30:29 +00004213
4214 case DLM_MSG_REQUEST:
4215 lkb->lkb_flags |= DLM_IFL_RESEND;
4216 break;
4217
4218 case DLM_MSG_CONVERT:
David Teigland2a7ce0e2011-04-04 15:19:59 -05004219 recover_convert_waiter(ls, lkb, ms_stub);
David Teiglande7fd4172006-01-18 09:30:29 +00004220 break;
4221
4222 case DLM_MSG_UNLOCK:
4223 hold_lkb(lkb);
David Teigland2a7ce0e2011-04-04 15:19:59 -05004224 memset(ms_stub, 0, sizeof(struct dlm_message));
4225 ms_stub->m_flags = DLM_IFL_STUB_MS;
4226 ms_stub->m_type = DLM_MSG_UNLOCK_REPLY;
4227 ms_stub->m_result = stub_unlock_result;
4228 ms_stub->m_header.h_nodeid = lkb->lkb_nodeid;
4229 _receive_unlock_reply(lkb, ms_stub);
David Teiglandb3f58d82006-02-28 11:16:37 -05004230 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00004231 break;
4232
4233 case DLM_MSG_CANCEL:
4234 hold_lkb(lkb);
David Teigland2a7ce0e2011-04-04 15:19:59 -05004235 memset(ms_stub, 0, sizeof(struct dlm_message));
4236 ms_stub->m_flags = DLM_IFL_STUB_MS;
4237 ms_stub->m_type = DLM_MSG_CANCEL_REPLY;
4238 ms_stub->m_result = stub_cancel_result;
4239 ms_stub->m_header.h_nodeid = lkb->lkb_nodeid;
4240 _receive_cancel_reply(lkb, ms_stub);
David Teiglandb3f58d82006-02-28 11:16:37 -05004241 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00004242 break;
4243
4244 default:
David Teigland601342c2008-01-07 16:15:05 -06004245 log_error(ls, "invalid lkb wait_type %d %d",
4246 lkb->lkb_wait_type, wait_type);
David Teiglande7fd4172006-01-18 09:30:29 +00004247 }
David Teigland81456802006-07-25 14:05:09 -05004248 schedule();
David Teiglande7fd4172006-01-18 09:30:29 +00004249 }
David Teigland90135922006-01-20 08:47:07 +00004250 mutex_unlock(&ls->ls_waiters_mutex);
David Teigland2a7ce0e2011-04-04 15:19:59 -05004251 kfree(ms_stub);
David Teiglande7fd4172006-01-18 09:30:29 +00004252}
4253
David Teiglandef0c2bb2007-03-28 09:56:46 -05004254static struct dlm_lkb *find_resend_waiter(struct dlm_ls *ls)
David Teiglande7fd4172006-01-18 09:30:29 +00004255{
4256 struct dlm_lkb *lkb;
David Teiglandef0c2bb2007-03-28 09:56:46 -05004257 int found = 0;
David Teiglande7fd4172006-01-18 09:30:29 +00004258
David Teigland90135922006-01-20 08:47:07 +00004259 mutex_lock(&ls->ls_waiters_mutex);
David Teiglande7fd4172006-01-18 09:30:29 +00004260 list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) {
4261 if (lkb->lkb_flags & DLM_IFL_RESEND) {
David Teiglandef0c2bb2007-03-28 09:56:46 -05004262 hold_lkb(lkb);
4263 found = 1;
David Teiglande7fd4172006-01-18 09:30:29 +00004264 break;
4265 }
4266 }
David Teigland90135922006-01-20 08:47:07 +00004267 mutex_unlock(&ls->ls_waiters_mutex);
David Teiglande7fd4172006-01-18 09:30:29 +00004268
David Teiglandef0c2bb2007-03-28 09:56:46 -05004269 if (!found)
David Teiglande7fd4172006-01-18 09:30:29 +00004270 lkb = NULL;
David Teiglandef0c2bb2007-03-28 09:56:46 -05004271 return lkb;
David Teiglande7fd4172006-01-18 09:30:29 +00004272}
4273
4274/* Deal with lookups and lkb's marked RESEND from _pre. We may now be the
4275 master or dir-node for r. Processing the lkb may result in it being placed
4276 back on waiters. */
4277
David Teiglandef0c2bb2007-03-28 09:56:46 -05004278/* We do this after normal locking has been enabled and any saved messages
4279 (in requestqueue) have been processed. We should be confident that at
4280 this point we won't get or process a reply to any of these waiting
4281 operations. But, new ops may be coming in on the rsbs/locks here from
4282 userspace or remotely. */
4283
4284/* there may have been an overlap unlock/cancel prior to recovery or after
4285 recovery. if before, the lkb may still have a pos wait_count; if after, the
4286 overlap flag would just have been set and nothing new sent. we can be
4287 confident here than any replies to either the initial op or overlap ops
4288 prior to recovery have been received. */
4289
David Teiglande7fd4172006-01-18 09:30:29 +00004290int dlm_recover_waiters_post(struct dlm_ls *ls)
4291{
4292 struct dlm_lkb *lkb;
4293 struct dlm_rsb *r;
David Teiglandef0c2bb2007-03-28 09:56:46 -05004294 int error = 0, mstype, err, oc, ou;
David Teiglande7fd4172006-01-18 09:30:29 +00004295
4296 while (1) {
4297 if (dlm_locking_stopped(ls)) {
4298 log_debug(ls, "recover_waiters_post aborted");
4299 error = -EINTR;
4300 break;
4301 }
4302
David Teiglandef0c2bb2007-03-28 09:56:46 -05004303 lkb = find_resend_waiter(ls);
4304 if (!lkb)
David Teiglande7fd4172006-01-18 09:30:29 +00004305 break;
4306
4307 r = lkb->lkb_resource;
David Teiglandef0c2bb2007-03-28 09:56:46 -05004308 hold_rsb(r);
4309 lock_rsb(r);
4310
4311 mstype = lkb->lkb_wait_type;
4312 oc = is_overlap_cancel(lkb);
4313 ou = is_overlap_unlock(lkb);
4314 err = 0;
David Teiglande7fd4172006-01-18 09:30:29 +00004315
David Teigland2a7ce0e2011-04-04 15:19:59 -05004316 log_debug(ls, "recover_waiter %x nodeid %d msg %d r_nodeid %d",
4317 lkb->lkb_id, lkb->lkb_nodeid, mstype, r->res_nodeid);
David Teiglande7fd4172006-01-18 09:30:29 +00004318
David Teiglandef0c2bb2007-03-28 09:56:46 -05004319 /* At this point we assume that we won't get a reply to any
4320 previous op or overlap op on this lock. First, do a big
4321 remove_from_waiters() for all previous ops. */
David Teiglande7fd4172006-01-18 09:30:29 +00004322
David Teiglandef0c2bb2007-03-28 09:56:46 -05004323 lkb->lkb_flags &= ~DLM_IFL_RESEND;
4324 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK;
4325 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL;
4326 lkb->lkb_wait_type = 0;
4327 lkb->lkb_wait_count = 0;
4328 mutex_lock(&ls->ls_waiters_mutex);
4329 list_del_init(&lkb->lkb_wait_reply);
4330 mutex_unlock(&ls->ls_waiters_mutex);
4331 unhold_lkb(lkb); /* for waiters list */
David Teiglande7fd4172006-01-18 09:30:29 +00004332
David Teiglandef0c2bb2007-03-28 09:56:46 -05004333 if (oc || ou) {
4334 /* do an unlock or cancel instead of resending */
4335 switch (mstype) {
4336 case DLM_MSG_LOOKUP:
4337 case DLM_MSG_REQUEST:
4338 queue_cast(r, lkb, ou ? -DLM_EUNLOCK :
4339 -DLM_ECANCEL);
4340 unhold_lkb(lkb); /* undoes create_lkb() */
4341 break;
4342 case DLM_MSG_CONVERT:
4343 if (oc) {
4344 queue_cast(r, lkb, -DLM_ECANCEL);
4345 } else {
4346 lkb->lkb_exflags |= DLM_LKF_FORCEUNLOCK;
4347 _unlock_lock(r, lkb);
4348 }
4349 break;
4350 default:
4351 err = 1;
4352 }
4353 } else {
4354 switch (mstype) {
4355 case DLM_MSG_LOOKUP:
4356 case DLM_MSG_REQUEST:
4357 _request_lock(r, lkb);
4358 if (is_master(r))
4359 confirm_master(r, 0);
4360 break;
4361 case DLM_MSG_CONVERT:
4362 _convert_lock(r, lkb);
4363 break;
4364 default:
4365 err = 1;
4366 }
David Teiglande7fd4172006-01-18 09:30:29 +00004367 }
David Teiglandef0c2bb2007-03-28 09:56:46 -05004368
4369 if (err)
4370 log_error(ls, "recover_waiters_post %x %d %x %d %d",
4371 lkb->lkb_id, mstype, lkb->lkb_flags, oc, ou);
4372 unlock_rsb(r);
4373 put_rsb(r);
4374 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00004375 }
4376
4377 return error;
4378}
4379
4380static void purge_queue(struct dlm_rsb *r, struct list_head *queue,
4381 int (*test)(struct dlm_ls *ls, struct dlm_lkb *lkb))
4382{
4383 struct dlm_ls *ls = r->res_ls;
4384 struct dlm_lkb *lkb, *safe;
4385
4386 list_for_each_entry_safe(lkb, safe, queue, lkb_statequeue) {
4387 if (test(ls, lkb)) {
David Teigland97a35d12006-05-02 13:34:03 -04004388 rsb_set_flag(r, RSB_LOCKS_PURGED);
David Teiglande7fd4172006-01-18 09:30:29 +00004389 del_lkb(r, lkb);
4390 /* this put should free the lkb */
David Teiglandb3f58d82006-02-28 11:16:37 -05004391 if (!dlm_put_lkb(lkb))
David Teiglande7fd4172006-01-18 09:30:29 +00004392 log_error(ls, "purged lkb not released");
4393 }
4394 }
4395}
4396
4397static int purge_dead_test(struct dlm_ls *ls, struct dlm_lkb *lkb)
4398{
4399 return (is_master_copy(lkb) && dlm_is_removed(ls, lkb->lkb_nodeid));
4400}
4401
4402static int purge_mstcpy_test(struct dlm_ls *ls, struct dlm_lkb *lkb)
4403{
4404 return is_master_copy(lkb);
4405}
4406
4407static void purge_dead_locks(struct dlm_rsb *r)
4408{
4409 purge_queue(r, &r->res_grantqueue, &purge_dead_test);
4410 purge_queue(r, &r->res_convertqueue, &purge_dead_test);
4411 purge_queue(r, &r->res_waitqueue, &purge_dead_test);
4412}
4413
4414void dlm_purge_mstcpy_locks(struct dlm_rsb *r)
4415{
4416 purge_queue(r, &r->res_grantqueue, &purge_mstcpy_test);
4417 purge_queue(r, &r->res_convertqueue, &purge_mstcpy_test);
4418 purge_queue(r, &r->res_waitqueue, &purge_mstcpy_test);
4419}
4420
4421/* Get rid of locks held by nodes that are gone. */
4422
4423int dlm_purge_locks(struct dlm_ls *ls)
4424{
4425 struct dlm_rsb *r;
4426
4427 log_debug(ls, "dlm_purge_locks");
4428
4429 down_write(&ls->ls_root_sem);
4430 list_for_each_entry(r, &ls->ls_root_list, res_root_list) {
4431 hold_rsb(r);
4432 lock_rsb(r);
4433 if (is_master(r))
4434 purge_dead_locks(r);
4435 unlock_rsb(r);
4436 unhold_rsb(r);
4437
4438 schedule();
4439 }
4440 up_write(&ls->ls_root_sem);
4441
4442 return 0;
4443}
4444
David Teigland97a35d12006-05-02 13:34:03 -04004445static struct dlm_rsb *find_purged_rsb(struct dlm_ls *ls, int bucket)
4446{
4447 struct dlm_rsb *r, *r_ret = NULL;
4448
David Teiglandc7be7612009-01-07 16:50:41 -06004449 spin_lock(&ls->ls_rsbtbl[bucket].lock);
David Teigland97a35d12006-05-02 13:34:03 -04004450 list_for_each_entry(r, &ls->ls_rsbtbl[bucket].list, res_hashchain) {
4451 if (!rsb_flag(r, RSB_LOCKS_PURGED))
4452 continue;
4453 hold_rsb(r);
4454 rsb_clear_flag(r, RSB_LOCKS_PURGED);
4455 r_ret = r;
4456 break;
4457 }
David Teiglandc7be7612009-01-07 16:50:41 -06004458 spin_unlock(&ls->ls_rsbtbl[bucket].lock);
David Teigland97a35d12006-05-02 13:34:03 -04004459 return r_ret;
4460}
4461
4462void dlm_grant_after_purge(struct dlm_ls *ls)
David Teiglande7fd4172006-01-18 09:30:29 +00004463{
4464 struct dlm_rsb *r;
David Teigland2b4e9262006-07-25 13:59:48 -05004465 int bucket = 0;
David Teiglande7fd4172006-01-18 09:30:29 +00004466
David Teigland2b4e9262006-07-25 13:59:48 -05004467 while (1) {
4468 r = find_purged_rsb(ls, bucket);
4469 if (!r) {
4470 if (bucket == ls->ls_rsbtbl_size - 1)
4471 break;
4472 bucket++;
David Teigland97a35d12006-05-02 13:34:03 -04004473 continue;
David Teigland2b4e9262006-07-25 13:59:48 -05004474 }
David Teigland97a35d12006-05-02 13:34:03 -04004475 lock_rsb(r);
4476 if (is_master(r)) {
4477 grant_pending_locks(r);
4478 confirm_master(r, 0);
David Teiglande7fd4172006-01-18 09:30:29 +00004479 }
David Teigland97a35d12006-05-02 13:34:03 -04004480 unlock_rsb(r);
4481 put_rsb(r);
David Teigland2b4e9262006-07-25 13:59:48 -05004482 schedule();
David Teiglande7fd4172006-01-18 09:30:29 +00004483 }
David Teiglande7fd4172006-01-18 09:30:29 +00004484}
4485
4486static struct dlm_lkb *search_remid_list(struct list_head *head, int nodeid,
4487 uint32_t remid)
4488{
4489 struct dlm_lkb *lkb;
4490
4491 list_for_each_entry(lkb, head, lkb_statequeue) {
4492 if (lkb->lkb_nodeid == nodeid && lkb->lkb_remid == remid)
4493 return lkb;
4494 }
4495 return NULL;
4496}
4497
4498static struct dlm_lkb *search_remid(struct dlm_rsb *r, int nodeid,
4499 uint32_t remid)
4500{
4501 struct dlm_lkb *lkb;
4502
4503 lkb = search_remid_list(&r->res_grantqueue, nodeid, remid);
4504 if (lkb)
4505 return lkb;
4506 lkb = search_remid_list(&r->res_convertqueue, nodeid, remid);
4507 if (lkb)
4508 return lkb;
4509 lkb = search_remid_list(&r->res_waitqueue, nodeid, remid);
4510 if (lkb)
4511 return lkb;
4512 return NULL;
4513}
4514
Al Viroae773d02008-01-25 19:55:09 -05004515/* needs at least dlm_rcom + rcom_lock */
David Teiglande7fd4172006-01-18 09:30:29 +00004516static int receive_rcom_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb,
4517 struct dlm_rsb *r, struct dlm_rcom *rc)
4518{
4519 struct rcom_lock *rl = (struct rcom_lock *) rc->rc_buf;
David Teiglande7fd4172006-01-18 09:30:29 +00004520
4521 lkb->lkb_nodeid = rc->rc_header.h_nodeid;
Al Viro163a1852008-01-25 02:08:26 -05004522 lkb->lkb_ownpid = le32_to_cpu(rl->rl_ownpid);
4523 lkb->lkb_remid = le32_to_cpu(rl->rl_lkid);
4524 lkb->lkb_exflags = le32_to_cpu(rl->rl_exflags);
4525 lkb->lkb_flags = le32_to_cpu(rl->rl_flags) & 0x0000FFFF;
David Teiglande7fd4172006-01-18 09:30:29 +00004526 lkb->lkb_flags |= DLM_IFL_MSTCPY;
Al Viro163a1852008-01-25 02:08:26 -05004527 lkb->lkb_lvbseq = le32_to_cpu(rl->rl_lvbseq);
David Teiglande7fd4172006-01-18 09:30:29 +00004528 lkb->lkb_rqmode = rl->rl_rqmode;
4529 lkb->lkb_grmode = rl->rl_grmode;
4530 /* don't set lkb_status because add_lkb wants to itself */
4531
David Teigland8304d6f2011-02-21 14:58:21 -06004532 lkb->lkb_bastfn = (rl->rl_asts & DLM_CB_BAST) ? &fake_bastfn : NULL;
4533 lkb->lkb_astfn = (rl->rl_asts & DLM_CB_CAST) ? &fake_astfn : NULL;
David Teiglande7fd4172006-01-18 09:30:29 +00004534
David Teiglande7fd4172006-01-18 09:30:29 +00004535 if (lkb->lkb_exflags & DLM_LKF_VALBLK) {
Al Viroa5dd0632008-01-25 20:22:22 -05004536 int lvblen = rc->rc_header.h_length - sizeof(struct dlm_rcom) -
4537 sizeof(struct rcom_lock);
4538 if (lvblen > ls->ls_lvblen)
4539 return -EINVAL;
David Teigland52bda2b2007-11-07 09:06:49 -06004540 lkb->lkb_lvbptr = dlm_allocate_lvb(ls);
David Teiglande7fd4172006-01-18 09:30:29 +00004541 if (!lkb->lkb_lvbptr)
4542 return -ENOMEM;
David Teiglande7fd4172006-01-18 09:30:29 +00004543 memcpy(lkb->lkb_lvbptr, rl->rl_lvb, lvblen);
4544 }
4545
4546 /* Conversions between PR and CW (middle modes) need special handling.
4547 The real granted mode of these converting locks cannot be determined
4548 until all locks have been rebuilt on the rsb (recover_conversion) */
4549
Al Viro163a1852008-01-25 02:08:26 -05004550 if (rl->rl_wait_type == cpu_to_le16(DLM_MSG_CONVERT) &&
4551 middle_conversion(lkb)) {
David Teiglande7fd4172006-01-18 09:30:29 +00004552 rl->rl_status = DLM_LKSTS_CONVERT;
4553 lkb->lkb_grmode = DLM_LOCK_IV;
4554 rsb_set_flag(r, RSB_RECOVER_CONVERT);
4555 }
4556
4557 return 0;
4558}
4559
4560/* This lkb may have been recovered in a previous aborted recovery so we need
4561 to check if the rsb already has an lkb with the given remote nodeid/lkid.
4562 If so we just send back a standard reply. If not, we create a new lkb with
4563 the given values and send back our lkid. We send back our lkid by sending
4564 back the rcom_lock struct we got but with the remid field filled in. */
4565
Al Viroae773d02008-01-25 19:55:09 -05004566/* needs at least dlm_rcom + rcom_lock */
David Teiglande7fd4172006-01-18 09:30:29 +00004567int dlm_recover_master_copy(struct dlm_ls *ls, struct dlm_rcom *rc)
4568{
4569 struct rcom_lock *rl = (struct rcom_lock *) rc->rc_buf;
4570 struct dlm_rsb *r;
4571 struct dlm_lkb *lkb;
4572 int error;
4573
4574 if (rl->rl_parent_lkid) {
4575 error = -EOPNOTSUPP;
4576 goto out;
4577 }
4578
Al Viro163a1852008-01-25 02:08:26 -05004579 error = find_rsb(ls, rl->rl_name, le16_to_cpu(rl->rl_namelen),
4580 R_MASTER, &r);
David Teiglande7fd4172006-01-18 09:30:29 +00004581 if (error)
4582 goto out;
4583
4584 lock_rsb(r);
4585
Al Viro163a1852008-01-25 02:08:26 -05004586 lkb = search_remid(r, rc->rc_header.h_nodeid, le32_to_cpu(rl->rl_lkid));
David Teiglande7fd4172006-01-18 09:30:29 +00004587 if (lkb) {
4588 error = -EEXIST;
4589 goto out_remid;
4590 }
4591
4592 error = create_lkb(ls, &lkb);
4593 if (error)
4594 goto out_unlock;
4595
4596 error = receive_rcom_lock_args(ls, lkb, r, rc);
4597 if (error) {
David Teiglandb3f58d82006-02-28 11:16:37 -05004598 __put_lkb(ls, lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00004599 goto out_unlock;
4600 }
4601
4602 attach_lkb(r, lkb);
4603 add_lkb(r, lkb, rl->rl_status);
4604 error = 0;
4605
4606 out_remid:
4607 /* this is the new value returned to the lock holder for
4608 saving in its process-copy lkb */
Al Viro163a1852008-01-25 02:08:26 -05004609 rl->rl_remid = cpu_to_le32(lkb->lkb_id);
David Teiglande7fd4172006-01-18 09:30:29 +00004610
4611 out_unlock:
4612 unlock_rsb(r);
4613 put_rsb(r);
4614 out:
4615 if (error)
Al Viro163a1852008-01-25 02:08:26 -05004616 log_debug(ls, "recover_master_copy %d %x", error,
4617 le32_to_cpu(rl->rl_lkid));
4618 rl->rl_result = cpu_to_le32(error);
David Teiglande7fd4172006-01-18 09:30:29 +00004619 return error;
4620}
4621
Al Viroae773d02008-01-25 19:55:09 -05004622/* needs at least dlm_rcom + rcom_lock */
David Teiglande7fd4172006-01-18 09:30:29 +00004623int dlm_recover_process_copy(struct dlm_ls *ls, struct dlm_rcom *rc)
4624{
4625 struct rcom_lock *rl = (struct rcom_lock *) rc->rc_buf;
4626 struct dlm_rsb *r;
4627 struct dlm_lkb *lkb;
4628 int error;
4629
Al Viro163a1852008-01-25 02:08:26 -05004630 error = find_lkb(ls, le32_to_cpu(rl->rl_lkid), &lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00004631 if (error) {
Al Viro163a1852008-01-25 02:08:26 -05004632 log_error(ls, "recover_process_copy no lkid %x",
4633 le32_to_cpu(rl->rl_lkid));
David Teiglande7fd4172006-01-18 09:30:29 +00004634 return error;
4635 }
4636
4637 DLM_ASSERT(is_process_copy(lkb), dlm_print_lkb(lkb););
4638
Al Viro163a1852008-01-25 02:08:26 -05004639 error = le32_to_cpu(rl->rl_result);
David Teiglande7fd4172006-01-18 09:30:29 +00004640
4641 r = lkb->lkb_resource;
4642 hold_rsb(r);
4643 lock_rsb(r);
4644
4645 switch (error) {
David Teiglanddc200a82006-12-13 10:36:37 -06004646 case -EBADR:
4647 /* There's a chance the new master received our lock before
4648 dlm_recover_master_reply(), this wouldn't happen if we did
4649 a barrier between recover_masters and recover_locks. */
4650 log_debug(ls, "master copy not ready %x r %lx %s", lkb->lkb_id,
4651 (unsigned long)r, r->res_name);
4652 dlm_send_rcom_lock(r, lkb);
4653 goto out;
David Teiglande7fd4172006-01-18 09:30:29 +00004654 case -EEXIST:
4655 log_debug(ls, "master copy exists %x", lkb->lkb_id);
4656 /* fall through */
4657 case 0:
Al Viro163a1852008-01-25 02:08:26 -05004658 lkb->lkb_remid = le32_to_cpu(rl->rl_remid);
David Teiglande7fd4172006-01-18 09:30:29 +00004659 break;
4660 default:
4661 log_error(ls, "dlm_recover_process_copy unknown error %d %x",
4662 error, lkb->lkb_id);
4663 }
4664
4665 /* an ack for dlm_recover_locks() which waits for replies from
4666 all the locks it sends to new masters */
4667 dlm_recovered_lock(r);
David Teiglanddc200a82006-12-13 10:36:37 -06004668 out:
David Teiglande7fd4172006-01-18 09:30:29 +00004669 unlock_rsb(r);
4670 put_rsb(r);
David Teiglandb3f58d82006-02-28 11:16:37 -05004671 dlm_put_lkb(lkb);
David Teiglande7fd4172006-01-18 09:30:29 +00004672
4673 return 0;
4674}
4675
David Teigland597d0ca2006-07-12 16:44:04 -05004676int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua,
4677 int mode, uint32_t flags, void *name, unsigned int namelen,
David Teiglandd7db9232007-05-18 09:00:32 -05004678 unsigned long timeout_cs)
David Teigland597d0ca2006-07-12 16:44:04 -05004679{
4680 struct dlm_lkb *lkb;
4681 struct dlm_args args;
4682 int error;
4683
David Teigland85e86ed2007-05-18 08:58:15 -05004684 dlm_lock_recovery(ls);
David Teigland597d0ca2006-07-12 16:44:04 -05004685
4686 error = create_lkb(ls, &lkb);
4687 if (error) {
4688 kfree(ua);
4689 goto out;
4690 }
4691
4692 if (flags & DLM_LKF_VALBLK) {
David Teigland573c24c2009-11-30 16:34:43 -06004693 ua->lksb.sb_lvbptr = kzalloc(DLM_USER_LVB_LEN, GFP_NOFS);
David Teigland597d0ca2006-07-12 16:44:04 -05004694 if (!ua->lksb.sb_lvbptr) {
4695 kfree(ua);
4696 __put_lkb(ls, lkb);
4697 error = -ENOMEM;
4698 goto out;
4699 }
4700 }
4701
David Teigland52bda2b2007-11-07 09:06:49 -06004702 /* After ua is attached to lkb it will be freed by dlm_free_lkb().
David Teigland597d0ca2006-07-12 16:44:04 -05004703 When DLM_IFL_USER is set, the dlm knows that this is a userspace
4704 lock and that lkb_astparam is the dlm_user_args structure. */
4705
David Teiglandd7db9232007-05-18 09:00:32 -05004706 error = set_lock_args(mode, &ua->lksb, flags, namelen, timeout_cs,
David Teiglande5dae542008-02-06 00:35:45 -06004707 fake_astfn, ua, fake_bastfn, &args);
David Teigland597d0ca2006-07-12 16:44:04 -05004708 lkb->lkb_flags |= DLM_IFL_USER;
David Teigland597d0ca2006-07-12 16:44:04 -05004709
4710 if (error) {
4711 __put_lkb(ls, lkb);
4712 goto out;
4713 }
4714
4715 error = request_lock(ls, lkb, name, namelen, &args);
4716
4717 switch (error) {
4718 case 0:
4719 break;
4720 case -EINPROGRESS:
4721 error = 0;
4722 break;
4723 case -EAGAIN:
4724 error = 0;
4725 /* fall through */
4726 default:
4727 __put_lkb(ls, lkb);
4728 goto out;
4729 }
4730
4731 /* add this new lkb to the per-process list of locks */
4732 spin_lock(&ua->proc->locks_spin);
David Teiglandef0c2bb2007-03-28 09:56:46 -05004733 hold_lkb(lkb);
David Teigland597d0ca2006-07-12 16:44:04 -05004734 list_add_tail(&lkb->lkb_ownqueue, &ua->proc->locks);
4735 spin_unlock(&ua->proc->locks_spin);
4736 out:
David Teigland85e86ed2007-05-18 08:58:15 -05004737 dlm_unlock_recovery(ls);
David Teigland597d0ca2006-07-12 16:44:04 -05004738 return error;
4739}
4740
4741int dlm_user_convert(struct dlm_ls *ls, struct dlm_user_args *ua_tmp,
David Teiglandd7db9232007-05-18 09:00:32 -05004742 int mode, uint32_t flags, uint32_t lkid, char *lvb_in,
4743 unsigned long timeout_cs)
David Teigland597d0ca2006-07-12 16:44:04 -05004744{
4745 struct dlm_lkb *lkb;
4746 struct dlm_args args;
4747 struct dlm_user_args *ua;
4748 int error;
4749
David Teigland85e86ed2007-05-18 08:58:15 -05004750 dlm_lock_recovery(ls);
David Teigland597d0ca2006-07-12 16:44:04 -05004751
4752 error = find_lkb(ls, lkid, &lkb);
4753 if (error)
4754 goto out;
4755
4756 /* user can change the params on its lock when it converts it, or
4757 add an lvb that didn't exist before */
4758
David Teiglandd292c0c2008-02-06 23:27:04 -06004759 ua = lkb->lkb_ua;
David Teigland597d0ca2006-07-12 16:44:04 -05004760
4761 if (flags & DLM_LKF_VALBLK && !ua->lksb.sb_lvbptr) {
David Teigland573c24c2009-11-30 16:34:43 -06004762 ua->lksb.sb_lvbptr = kzalloc(DLM_USER_LVB_LEN, GFP_NOFS);
David Teigland597d0ca2006-07-12 16:44:04 -05004763 if (!ua->lksb.sb_lvbptr) {
4764 error = -ENOMEM;
4765 goto out_put;
4766 }
4767 }
4768 if (lvb_in && ua->lksb.sb_lvbptr)
4769 memcpy(ua->lksb.sb_lvbptr, lvb_in, DLM_USER_LVB_LEN);
4770
David Teiglandd7db9232007-05-18 09:00:32 -05004771 ua->xid = ua_tmp->xid;
David Teigland597d0ca2006-07-12 16:44:04 -05004772 ua->castparam = ua_tmp->castparam;
4773 ua->castaddr = ua_tmp->castaddr;
4774 ua->bastparam = ua_tmp->bastparam;
4775 ua->bastaddr = ua_tmp->bastaddr;
Patrick Caulfield10948eb2006-08-23 09:49:31 +01004776 ua->user_lksb = ua_tmp->user_lksb;
David Teigland597d0ca2006-07-12 16:44:04 -05004777
David Teiglandd7db9232007-05-18 09:00:32 -05004778 error = set_lock_args(mode, &ua->lksb, flags, 0, timeout_cs,
David Teiglande5dae542008-02-06 00:35:45 -06004779 fake_astfn, ua, fake_bastfn, &args);
David Teigland597d0ca2006-07-12 16:44:04 -05004780 if (error)
4781 goto out_put;
4782
4783 error = convert_lock(ls, lkb, &args);
4784
David Teiglandc85d65e2007-05-18 09:01:26 -05004785 if (error == -EINPROGRESS || error == -EAGAIN || error == -EDEADLK)
David Teigland597d0ca2006-07-12 16:44:04 -05004786 error = 0;
4787 out_put:
4788 dlm_put_lkb(lkb);
4789 out:
David Teigland85e86ed2007-05-18 08:58:15 -05004790 dlm_unlock_recovery(ls);
David Teigland597d0ca2006-07-12 16:44:04 -05004791 kfree(ua_tmp);
4792 return error;
4793}
4794
4795int dlm_user_unlock(struct dlm_ls *ls, struct dlm_user_args *ua_tmp,
4796 uint32_t flags, uint32_t lkid, char *lvb_in)
4797{
4798 struct dlm_lkb *lkb;
4799 struct dlm_args args;
4800 struct dlm_user_args *ua;
4801 int error;
4802
David Teigland85e86ed2007-05-18 08:58:15 -05004803 dlm_lock_recovery(ls);
David Teigland597d0ca2006-07-12 16:44:04 -05004804
4805 error = find_lkb(ls, lkid, &lkb);
4806 if (error)
4807 goto out;
4808
David Teiglandd292c0c2008-02-06 23:27:04 -06004809 ua = lkb->lkb_ua;
David Teigland597d0ca2006-07-12 16:44:04 -05004810
4811 if (lvb_in && ua->lksb.sb_lvbptr)
4812 memcpy(ua->lksb.sb_lvbptr, lvb_in, DLM_USER_LVB_LEN);
Patrick Caulfieldb434eda2007-10-01 15:28:42 +01004813 if (ua_tmp->castparam)
4814 ua->castparam = ua_tmp->castparam;
Patrick Caulfieldcc346d52006-08-08 10:34:40 -04004815 ua->user_lksb = ua_tmp->user_lksb;
David Teigland597d0ca2006-07-12 16:44:04 -05004816
4817 error = set_unlock_args(flags, ua, &args);
4818 if (error)
4819 goto out_put;
4820
4821 error = unlock_lock(ls, lkb, &args);
4822
4823 if (error == -DLM_EUNLOCK)
4824 error = 0;
David Teiglandef0c2bb2007-03-28 09:56:46 -05004825 /* from validate_unlock_args() */
4826 if (error == -EBUSY && (flags & DLM_LKF_FORCEUNLOCK))
4827 error = 0;
David Teigland597d0ca2006-07-12 16:44:04 -05004828 if (error)
4829 goto out_put;
4830
4831 spin_lock(&ua->proc->locks_spin);
David Teiglanda1bc86e2007-01-15 10:34:52 -06004832 /* dlm_user_add_ast() may have already taken lkb off the proc list */
4833 if (!list_empty(&lkb->lkb_ownqueue))
4834 list_move(&lkb->lkb_ownqueue, &ua->proc->unlocking);
David Teigland597d0ca2006-07-12 16:44:04 -05004835 spin_unlock(&ua->proc->locks_spin);
David Teigland597d0ca2006-07-12 16:44:04 -05004836 out_put:
4837 dlm_put_lkb(lkb);
4838 out:
David Teigland85e86ed2007-05-18 08:58:15 -05004839 dlm_unlock_recovery(ls);
David Teiglandef0c2bb2007-03-28 09:56:46 -05004840 kfree(ua_tmp);
David Teigland597d0ca2006-07-12 16:44:04 -05004841 return error;
4842}
4843
4844int dlm_user_cancel(struct dlm_ls *ls, struct dlm_user_args *ua_tmp,
4845 uint32_t flags, uint32_t lkid)
4846{
4847 struct dlm_lkb *lkb;
4848 struct dlm_args args;
4849 struct dlm_user_args *ua;
4850 int error;
4851
David Teigland85e86ed2007-05-18 08:58:15 -05004852 dlm_lock_recovery(ls);
David Teigland597d0ca2006-07-12 16:44:04 -05004853
4854 error = find_lkb(ls, lkid, &lkb);
4855 if (error)
4856 goto out;
4857
David Teiglandd292c0c2008-02-06 23:27:04 -06004858 ua = lkb->lkb_ua;
Patrick Caulfieldb434eda2007-10-01 15:28:42 +01004859 if (ua_tmp->castparam)
4860 ua->castparam = ua_tmp->castparam;
Patrick Caulfieldc059f702006-08-23 10:24:03 +01004861 ua->user_lksb = ua_tmp->user_lksb;
David Teigland597d0ca2006-07-12 16:44:04 -05004862
4863 error = set_unlock_args(flags, ua, &args);
4864 if (error)
4865 goto out_put;
4866
4867 error = cancel_lock(ls, lkb, &args);
4868
4869 if (error == -DLM_ECANCEL)
4870 error = 0;
David Teiglandef0c2bb2007-03-28 09:56:46 -05004871 /* from validate_unlock_args() */
4872 if (error == -EBUSY)
4873 error = 0;
David Teigland597d0ca2006-07-12 16:44:04 -05004874 out_put:
4875 dlm_put_lkb(lkb);
4876 out:
David Teigland85e86ed2007-05-18 08:58:15 -05004877 dlm_unlock_recovery(ls);
David Teiglandef0c2bb2007-03-28 09:56:46 -05004878 kfree(ua_tmp);
David Teigland597d0ca2006-07-12 16:44:04 -05004879 return error;
4880}
4881
David Teigland8b4021f2007-05-29 08:46:00 -05004882int dlm_user_deadlock(struct dlm_ls *ls, uint32_t flags, uint32_t lkid)
4883{
4884 struct dlm_lkb *lkb;
4885 struct dlm_args args;
4886 struct dlm_user_args *ua;
4887 struct dlm_rsb *r;
4888 int error;
4889
4890 dlm_lock_recovery(ls);
4891
4892 error = find_lkb(ls, lkid, &lkb);
4893 if (error)
4894 goto out;
4895
David Teiglandd292c0c2008-02-06 23:27:04 -06004896 ua = lkb->lkb_ua;
David Teigland8b4021f2007-05-29 08:46:00 -05004897
4898 error = set_unlock_args(flags, ua, &args);
4899 if (error)
4900 goto out_put;
4901
4902 /* same as cancel_lock(), but set DEADLOCK_CANCEL after lock_rsb */
4903
4904 r = lkb->lkb_resource;
4905 hold_rsb(r);
4906 lock_rsb(r);
4907
4908 error = validate_unlock_args(lkb, &args);
4909 if (error)
4910 goto out_r;
4911 lkb->lkb_flags |= DLM_IFL_DEADLOCK_CANCEL;
4912
4913 error = _cancel_lock(r, lkb);
4914 out_r:
4915 unlock_rsb(r);
4916 put_rsb(r);
4917
4918 if (error == -DLM_ECANCEL)
4919 error = 0;
4920 /* from validate_unlock_args() */
4921 if (error == -EBUSY)
4922 error = 0;
4923 out_put:
4924 dlm_put_lkb(lkb);
4925 out:
4926 dlm_unlock_recovery(ls);
4927 return error;
4928}
4929
David Teiglandef0c2bb2007-03-28 09:56:46 -05004930/* lkb's that are removed from the waiters list by revert are just left on the
4931 orphans list with the granted orphan locks, to be freed by purge */
4932
David Teigland597d0ca2006-07-12 16:44:04 -05004933static int orphan_proc_lock(struct dlm_ls *ls, struct dlm_lkb *lkb)
4934{
David Teiglandef0c2bb2007-03-28 09:56:46 -05004935 struct dlm_args args;
4936 int error;
David Teigland597d0ca2006-07-12 16:44:04 -05004937
David Teiglandef0c2bb2007-03-28 09:56:46 -05004938 hold_lkb(lkb);
4939 mutex_lock(&ls->ls_orphans_mutex);
4940 list_add_tail(&lkb->lkb_ownqueue, &ls->ls_orphans);
4941 mutex_unlock(&ls->ls_orphans_mutex);
David Teigland597d0ca2006-07-12 16:44:04 -05004942
David Teiglandd292c0c2008-02-06 23:27:04 -06004943 set_unlock_args(0, lkb->lkb_ua, &args);
David Teiglandef0c2bb2007-03-28 09:56:46 -05004944
4945 error = cancel_lock(ls, lkb, &args);
4946 if (error == -DLM_ECANCEL)
4947 error = 0;
4948 return error;
David Teigland597d0ca2006-07-12 16:44:04 -05004949}
4950
4951/* The force flag allows the unlock to go ahead even if the lkb isn't granted.
4952 Regardless of what rsb queue the lock is on, it's removed and freed. */
4953
4954static int unlock_proc_lock(struct dlm_ls *ls, struct dlm_lkb *lkb)
4955{
David Teigland597d0ca2006-07-12 16:44:04 -05004956 struct dlm_args args;
4957 int error;
4958
David Teiglandd292c0c2008-02-06 23:27:04 -06004959 set_unlock_args(DLM_LKF_FORCEUNLOCK, lkb->lkb_ua, &args);
David Teigland597d0ca2006-07-12 16:44:04 -05004960
4961 error = unlock_lock(ls, lkb, &args);
4962 if (error == -DLM_EUNLOCK)
4963 error = 0;
4964 return error;
4965}
4966
David Teiglandef0c2bb2007-03-28 09:56:46 -05004967/* We have to release clear_proc_locks mutex before calling unlock_proc_lock()
4968 (which does lock_rsb) due to deadlock with receiving a message that does
4969 lock_rsb followed by dlm_user_add_ast() */
4970
4971static struct dlm_lkb *del_proc_lock(struct dlm_ls *ls,
4972 struct dlm_user_proc *proc)
4973{
4974 struct dlm_lkb *lkb = NULL;
4975
4976 mutex_lock(&ls->ls_clear_proc_locks);
4977 if (list_empty(&proc->locks))
4978 goto out;
4979
4980 lkb = list_entry(proc->locks.next, struct dlm_lkb, lkb_ownqueue);
4981 list_del_init(&lkb->lkb_ownqueue);
4982
4983 if (lkb->lkb_exflags & DLM_LKF_PERSISTENT)
4984 lkb->lkb_flags |= DLM_IFL_ORPHAN;
4985 else
4986 lkb->lkb_flags |= DLM_IFL_DEAD;
4987 out:
4988 mutex_unlock(&ls->ls_clear_proc_locks);
4989 return lkb;
4990}
4991
David Teigland597d0ca2006-07-12 16:44:04 -05004992/* The ls_clear_proc_locks mutex protects against dlm_user_add_asts() which
4993 1) references lkb->ua which we free here and 2) adds lkbs to proc->asts,
4994 which we clear here. */
4995
4996/* proc CLOSING flag is set so no more device_reads should look at proc->asts
4997 list, and no more device_writes should add lkb's to proc->locks list; so we
4998 shouldn't need to take asts_spin or locks_spin here. this assumes that
4999 device reads/writes/closes are serialized -- FIXME: we may need to serialize
5000 them ourself. */
5001
5002void dlm_clear_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc)
5003{
5004 struct dlm_lkb *lkb, *safe;
5005
David Teigland85e86ed2007-05-18 08:58:15 -05005006 dlm_lock_recovery(ls);
David Teigland597d0ca2006-07-12 16:44:04 -05005007
David Teiglandef0c2bb2007-03-28 09:56:46 -05005008 while (1) {
5009 lkb = del_proc_lock(ls, proc);
5010 if (!lkb)
5011 break;
David Teigland84d8cd62007-05-29 08:44:23 -05005012 del_timeout(lkb);
David Teiglandef0c2bb2007-03-28 09:56:46 -05005013 if (lkb->lkb_exflags & DLM_LKF_PERSISTENT)
David Teigland597d0ca2006-07-12 16:44:04 -05005014 orphan_proc_lock(ls, lkb);
David Teiglandef0c2bb2007-03-28 09:56:46 -05005015 else
David Teigland597d0ca2006-07-12 16:44:04 -05005016 unlock_proc_lock(ls, lkb);
David Teigland597d0ca2006-07-12 16:44:04 -05005017
5018 /* this removes the reference for the proc->locks list
5019 added by dlm_user_request, it may result in the lkb
5020 being freed */
5021
5022 dlm_put_lkb(lkb);
5023 }
David Teiglanda1bc86e2007-01-15 10:34:52 -06005024
David Teiglandef0c2bb2007-03-28 09:56:46 -05005025 mutex_lock(&ls->ls_clear_proc_locks);
5026
David Teiglanda1bc86e2007-01-15 10:34:52 -06005027 /* in-progress unlocks */
5028 list_for_each_entry_safe(lkb, safe, &proc->unlocking, lkb_ownqueue) {
5029 list_del_init(&lkb->lkb_ownqueue);
5030 lkb->lkb_flags |= DLM_IFL_DEAD;
5031 dlm_put_lkb(lkb);
5032 }
5033
5034 list_for_each_entry_safe(lkb, safe, &proc->asts, lkb_astqueue) {
David Teigland8304d6f2011-02-21 14:58:21 -06005035 memset(&lkb->lkb_callbacks, 0,
5036 sizeof(struct dlm_callback) * DLM_CALLBACKS_SIZE);
5037 list_del_init(&lkb->lkb_astqueue);
David Teiglanda1bc86e2007-01-15 10:34:52 -06005038 dlm_put_lkb(lkb);
5039 }
5040
David Teigland597d0ca2006-07-12 16:44:04 -05005041 mutex_unlock(&ls->ls_clear_proc_locks);
David Teigland85e86ed2007-05-18 08:58:15 -05005042 dlm_unlock_recovery(ls);
David Teigland597d0ca2006-07-12 16:44:04 -05005043}
David Teiglanda1bc86e2007-01-15 10:34:52 -06005044
David Teigland84991372007-03-30 15:02:40 -05005045static void purge_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc)
5046{
5047 struct dlm_lkb *lkb, *safe;
5048
5049 while (1) {
5050 lkb = NULL;
5051 spin_lock(&proc->locks_spin);
5052 if (!list_empty(&proc->locks)) {
5053 lkb = list_entry(proc->locks.next, struct dlm_lkb,
5054 lkb_ownqueue);
5055 list_del_init(&lkb->lkb_ownqueue);
5056 }
5057 spin_unlock(&proc->locks_spin);
5058
5059 if (!lkb)
5060 break;
5061
5062 lkb->lkb_flags |= DLM_IFL_DEAD;
5063 unlock_proc_lock(ls, lkb);
5064 dlm_put_lkb(lkb); /* ref from proc->locks list */
5065 }
5066
5067 spin_lock(&proc->locks_spin);
5068 list_for_each_entry_safe(lkb, safe, &proc->unlocking, lkb_ownqueue) {
5069 list_del_init(&lkb->lkb_ownqueue);
5070 lkb->lkb_flags |= DLM_IFL_DEAD;
5071 dlm_put_lkb(lkb);
5072 }
5073 spin_unlock(&proc->locks_spin);
5074
5075 spin_lock(&proc->asts_spin);
5076 list_for_each_entry_safe(lkb, safe, &proc->asts, lkb_astqueue) {
David Teigland8304d6f2011-02-21 14:58:21 -06005077 memset(&lkb->lkb_callbacks, 0,
5078 sizeof(struct dlm_callback) * DLM_CALLBACKS_SIZE);
5079 list_del_init(&lkb->lkb_astqueue);
David Teigland84991372007-03-30 15:02:40 -05005080 dlm_put_lkb(lkb);
5081 }
5082 spin_unlock(&proc->asts_spin);
5083}
5084
5085/* pid of 0 means purge all orphans */
5086
5087static void do_purge(struct dlm_ls *ls, int nodeid, int pid)
5088{
5089 struct dlm_lkb *lkb, *safe;
5090
5091 mutex_lock(&ls->ls_orphans_mutex);
5092 list_for_each_entry_safe(lkb, safe, &ls->ls_orphans, lkb_ownqueue) {
5093 if (pid && lkb->lkb_ownpid != pid)
5094 continue;
5095 unlock_proc_lock(ls, lkb);
5096 list_del_init(&lkb->lkb_ownqueue);
5097 dlm_put_lkb(lkb);
5098 }
5099 mutex_unlock(&ls->ls_orphans_mutex);
5100}
5101
5102static int send_purge(struct dlm_ls *ls, int nodeid, int pid)
5103{
5104 struct dlm_message *ms;
5105 struct dlm_mhandle *mh;
5106 int error;
5107
5108 error = _create_message(ls, sizeof(struct dlm_message), nodeid,
5109 DLM_MSG_PURGE, &ms, &mh);
5110 if (error)
5111 return error;
5112 ms->m_nodeid = nodeid;
5113 ms->m_pid = pid;
5114
5115 return send_message(mh, ms);
5116}
5117
5118int dlm_user_purge(struct dlm_ls *ls, struct dlm_user_proc *proc,
5119 int nodeid, int pid)
5120{
5121 int error = 0;
5122
5123 if (nodeid != dlm_our_nodeid()) {
5124 error = send_purge(ls, nodeid, pid);
5125 } else {
David Teigland85e86ed2007-05-18 08:58:15 -05005126 dlm_lock_recovery(ls);
David Teigland84991372007-03-30 15:02:40 -05005127 if (pid == current->pid)
5128 purge_proc_locks(ls, proc);
5129 else
5130 do_purge(ls, nodeid, pid);
David Teigland85e86ed2007-05-18 08:58:15 -05005131 dlm_unlock_recovery(ls);
David Teigland84991372007-03-30 15:02:40 -05005132 }
5133 return error;
5134}
5135