Lines Matching refs:lkb

78 static int send_request(struct dlm_rsb *r, struct dlm_lkb *lkb);
79 static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb);
80 static int send_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb);
81 static int send_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb);
82 static int send_grant(struct dlm_rsb *r, struct dlm_lkb *lkb);
83 static int send_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int mode);
84 static int send_lookup(struct dlm_rsb *r, struct dlm_lkb *lkb);
86 static int _request_lock(struct dlm_rsb *r, struct dlm_lkb *lkb);
87 static int _cancel_lock(struct dlm_rsb *r, struct dlm_lkb *lkb);
88 static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb,
92 static void del_timeout(struct dlm_lkb *lkb);
162 void dlm_print_lkb(struct dlm_lkb *lkb) in dlm_print_lkb() argument
166 lkb->lkb_nodeid, lkb->lkb_id, lkb->lkb_remid, lkb->lkb_exflags, in dlm_print_lkb()
167 lkb->lkb_flags, lkb->lkb_status, lkb->lkb_rqmode, in dlm_print_lkb()
168 lkb->lkb_grmode, lkb->lkb_wait_type, lkb->lkb_wait_nodeid, in dlm_print_lkb()
169 (unsigned long long)lkb->lkb_recover_seq); in dlm_print_lkb()
183 struct dlm_lkb *lkb; in dlm_dump_rsb() local
190 list_for_each_entry(lkb, &r->res_lookup, lkb_rsb_lookup) in dlm_dump_rsb()
191 dlm_print_lkb(lkb); in dlm_dump_rsb()
193 list_for_each_entry(lkb, &r->res_grantqueue, lkb_statequeue) in dlm_dump_rsb()
194 dlm_print_lkb(lkb); in dlm_dump_rsb()
196 list_for_each_entry(lkb, &r->res_convertqueue, lkb_statequeue) in dlm_dump_rsb()
197 dlm_print_lkb(lkb); in dlm_dump_rsb()
199 list_for_each_entry(lkb, &r->res_waitqueue, lkb_statequeue) in dlm_dump_rsb()
200 dlm_print_lkb(lkb); in dlm_dump_rsb()
220 static inline int can_be_queued(struct dlm_lkb *lkb) in can_be_queued() argument
222 return !(lkb->lkb_exflags & DLM_LKF_NOQUEUE); in can_be_queued()
225 static inline int force_blocking_asts(struct dlm_lkb *lkb) in force_blocking_asts() argument
227 return (lkb->lkb_exflags & DLM_LKF_NOQUEUEBAST); in force_blocking_asts()
230 static inline int is_demoted(struct dlm_lkb *lkb) in is_demoted() argument
232 return (lkb->lkb_sbflags & DLM_SBF_DEMOTED); in is_demoted()
235 static inline int is_altmode(struct dlm_lkb *lkb) in is_altmode() argument
237 return (lkb->lkb_sbflags & DLM_SBF_ALTMODE); in is_altmode()
240 static inline int is_granted(struct dlm_lkb *lkb) in is_granted() argument
242 return (lkb->lkb_status == DLM_LKSTS_GRANTED); in is_granted()
251 static inline int is_process_copy(struct dlm_lkb *lkb) in is_process_copy() argument
253 return (lkb->lkb_nodeid && !(lkb->lkb_flags & DLM_IFL_MSTCPY)); in is_process_copy()
256 static inline int is_master_copy(struct dlm_lkb *lkb) in is_master_copy() argument
258 return (lkb->lkb_flags & DLM_IFL_MSTCPY) ? 1 : 0; in is_master_copy()
261 static inline int middle_conversion(struct dlm_lkb *lkb) in middle_conversion() argument
263 if ((lkb->lkb_grmode==DLM_LOCK_PR && lkb->lkb_rqmode==DLM_LOCK_CW) || in middle_conversion()
264 (lkb->lkb_rqmode==DLM_LOCK_PR && lkb->lkb_grmode==DLM_LOCK_CW)) in middle_conversion()
269 static inline int down_conversion(struct dlm_lkb *lkb) in down_conversion() argument
271 return (!middle_conversion(lkb) && lkb->lkb_rqmode < lkb->lkb_grmode); in down_conversion()
274 static inline int is_overlap_unlock(struct dlm_lkb *lkb) in is_overlap_unlock() argument
276 return lkb->lkb_flags & DLM_IFL_OVERLAP_UNLOCK; in is_overlap_unlock()
279 static inline int is_overlap_cancel(struct dlm_lkb *lkb) in is_overlap_cancel() argument
281 return lkb->lkb_flags & DLM_IFL_OVERLAP_CANCEL; in is_overlap_cancel()
284 static inline int is_overlap(struct dlm_lkb *lkb) in is_overlap() argument
286 return (lkb->lkb_flags & (DLM_IFL_OVERLAP_UNLOCK | in is_overlap()
290 static void queue_cast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in queue_cast() argument
292 if (is_master_copy(lkb)) in queue_cast()
295 del_timeout(lkb); in queue_cast()
297 DLM_ASSERT(lkb->lkb_lksb, dlm_print_lkb(lkb);); in queue_cast()
302 if (rv == -DLM_ECANCEL && (lkb->lkb_flags & DLM_IFL_TIMEOUT_CANCEL)) { in queue_cast()
303 lkb->lkb_flags &= ~DLM_IFL_TIMEOUT_CANCEL; in queue_cast()
308 if (rv == -DLM_ECANCEL && (lkb->lkb_flags & DLM_IFL_DEADLOCK_CANCEL)) { in queue_cast()
309 lkb->lkb_flags &= ~DLM_IFL_DEADLOCK_CANCEL; in queue_cast()
313 dlm_add_cb(lkb, DLM_CB_CAST, lkb->lkb_grmode, rv, lkb->lkb_sbflags); in queue_cast()
316 static inline void queue_cast_overlap(struct dlm_rsb *r, struct dlm_lkb *lkb) in queue_cast_overlap() argument
318 queue_cast(r, lkb, in queue_cast_overlap()
319 is_overlap_unlock(lkb) ? -DLM_EUNLOCK : -DLM_ECANCEL); in queue_cast_overlap()
322 static void queue_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rqmode) in queue_bast() argument
324 if (is_master_copy(lkb)) { in queue_bast()
325 send_bast(r, lkb, rqmode); in queue_bast()
327 dlm_add_cb(lkb, DLM_CB_BAST, rqmode, 0, 0); in queue_bast()
1188 static void attach_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb) in attach_lkb() argument
1191 lkb->lkb_resource = r; in attach_lkb()
1194 static void detach_lkb(struct dlm_lkb *lkb) in detach_lkb() argument
1196 if (lkb->lkb_resource) { in detach_lkb()
1197 put_rsb(lkb->lkb_resource); in detach_lkb()
1198 lkb->lkb_resource = NULL; in detach_lkb()
1205 struct dlm_lkb *lkb; in _create_lkb() local
1208 lkb = dlm_allocate_lkb(ls); in _create_lkb()
1209 if (!lkb) in _create_lkb()
1212 lkb->lkb_last_bast_mode = -1; in _create_lkb()
1213 lkb->lkb_nodeid = -1; in _create_lkb()
1214 lkb->lkb_grmode = DLM_LOCK_IV; in _create_lkb()
1215 kref_init(&lkb->lkb_ref); in _create_lkb()
1216 INIT_LIST_HEAD(&lkb->lkb_ownqueue); in _create_lkb()
1217 INIT_LIST_HEAD(&lkb->lkb_rsb_lookup); in _create_lkb()
1219 INIT_LIST_HEAD(&lkb->lkb_time_list); in _create_lkb()
1221 INIT_LIST_HEAD(&lkb->lkb_cb_list); in _create_lkb()
1222 INIT_LIST_HEAD(&lkb->lkb_callbacks); in _create_lkb()
1223 spin_lock_init(&lkb->lkb_cb_lock); in _create_lkb()
1224 INIT_WORK(&lkb->lkb_cb_work, dlm_callback_work); in _create_lkb()
1228 rv = idr_alloc(&ls->ls_lkbidr, lkb, start, end, GFP_NOWAIT); in _create_lkb()
1230 lkb->lkb_id = rv; in _create_lkb()
1236 dlm_free_lkb(lkb); in _create_lkb()
1240 *lkb_ret = lkb; in _create_lkb()
1251 struct dlm_lkb *lkb; in find_lkb() local
1254 lkb = idr_find(&ls->ls_lkbidr, lkid); in find_lkb()
1255 if (lkb) in find_lkb()
1256 kref_get(&lkb->lkb_ref); in find_lkb()
1259 *lkb_ret = lkb; in find_lkb()
1260 return lkb ? 0 : -ENOENT; in find_lkb()
1265 struct dlm_lkb *lkb = container_of(kref, struct dlm_lkb, lkb_ref); in kill_lkb() local
1270 DLM_ASSERT(!lkb->lkb_status, dlm_print_lkb(lkb);); in kill_lkb()
1276 static int __put_lkb(struct dlm_ls *ls, struct dlm_lkb *lkb) in __put_lkb() argument
1278 uint32_t lkid = lkb->lkb_id; in __put_lkb()
1281 rv = kref_put_lock(&lkb->lkb_ref, kill_lkb, in __put_lkb()
1287 detach_lkb(lkb); in __put_lkb()
1290 if (lkb->lkb_lvbptr && is_master_copy(lkb)) in __put_lkb()
1291 dlm_free_lvb(lkb->lkb_lvbptr); in __put_lkb()
1292 dlm_free_lkb(lkb); in __put_lkb()
1298 int dlm_put_lkb(struct dlm_lkb *lkb) in dlm_put_lkb() argument
1302 DLM_ASSERT(lkb->lkb_resource, dlm_print_lkb(lkb);); in dlm_put_lkb()
1303 DLM_ASSERT(lkb->lkb_resource->res_ls, dlm_print_lkb(lkb);); in dlm_put_lkb()
1305 ls = lkb->lkb_resource->res_ls; in dlm_put_lkb()
1306 return __put_lkb(ls, lkb); in dlm_put_lkb()
1312 static inline void hold_lkb(struct dlm_lkb *lkb) in hold_lkb() argument
1314 kref_get(&lkb->lkb_ref); in hold_lkb()
1319 struct dlm_lkb *lkb = container_of(kref, struct dlm_lkb, lkb_ref); in unhold_lkb_assert() local
1321 DLM_ASSERT(false, dlm_print_lkb(lkb);); in unhold_lkb_assert()
1329 static inline void unhold_lkb(struct dlm_lkb *lkb) in unhold_lkb() argument
1331 kref_put(&lkb->lkb_ref, unhold_lkb_assert); in unhold_lkb()
1337 struct dlm_lkb *lkb = NULL, *iter; in lkb_add_ordered() local
1341 lkb = iter; in lkb_add_ordered()
1346 if (!lkb) in lkb_add_ordered()
1352 static void add_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int status) in add_lkb() argument
1354 kref_get(&lkb->lkb_ref); in add_lkb()
1356 DLM_ASSERT(!lkb->lkb_status, dlm_print_lkb(lkb);); in add_lkb()
1358 lkb->lkb_timestamp = ktime_get(); in add_lkb()
1360 lkb->lkb_status = status; in add_lkb()
1364 if (lkb->lkb_exflags & DLM_LKF_HEADQUE) in add_lkb()
1365 list_add(&lkb->lkb_statequeue, &r->res_waitqueue); in add_lkb()
1367 list_add_tail(&lkb->lkb_statequeue, &r->res_waitqueue); in add_lkb()
1371 lkb_add_ordered(&lkb->lkb_statequeue, &r->res_grantqueue, in add_lkb()
1372 lkb->lkb_grmode); in add_lkb()
1375 if (lkb->lkb_exflags & DLM_LKF_HEADQUE) in add_lkb()
1376 list_add(&lkb->lkb_statequeue, &r->res_convertqueue); in add_lkb()
1378 list_add_tail(&lkb->lkb_statequeue, in add_lkb()
1382 DLM_ASSERT(0, dlm_print_lkb(lkb); printk("sts=%d\n", status);); in add_lkb()
1386 static void del_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb) in del_lkb() argument
1388 lkb->lkb_status = 0; in del_lkb()
1389 list_del(&lkb->lkb_statequeue); in del_lkb()
1390 unhold_lkb(lkb); in del_lkb()
1393 static void move_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int sts) in move_lkb() argument
1395 hold_lkb(lkb); in move_lkb()
1396 del_lkb(r, lkb); in move_lkb()
1397 add_lkb(r, lkb, sts); in move_lkb()
1398 unhold_lkb(lkb); in move_lkb()
1421 static int add_to_waiters(struct dlm_lkb *lkb, int mstype, int to_nodeid) in add_to_waiters() argument
1423 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in add_to_waiters()
1428 if (is_overlap_unlock(lkb) || in add_to_waiters()
1429 (is_overlap_cancel(lkb) && (mstype == DLM_MSG_CANCEL))) { in add_to_waiters()
1434 if (lkb->lkb_wait_type || is_overlap_cancel(lkb)) { in add_to_waiters()
1437 lkb->lkb_flags |= DLM_IFL_OVERLAP_UNLOCK; in add_to_waiters()
1440 lkb->lkb_flags |= DLM_IFL_OVERLAP_CANCEL; in add_to_waiters()
1446 lkb->lkb_wait_count++; in add_to_waiters()
1447 hold_lkb(lkb); in add_to_waiters()
1450 lkb->lkb_id, lkb->lkb_wait_type, mstype, in add_to_waiters()
1451 lkb->lkb_wait_count, lkb->lkb_flags); in add_to_waiters()
1455 DLM_ASSERT(!lkb->lkb_wait_count, in add_to_waiters()
1456 dlm_print_lkb(lkb); in add_to_waiters()
1457 printk("wait_count %d\n", lkb->lkb_wait_count);); in add_to_waiters()
1459 lkb->lkb_wait_count++; in add_to_waiters()
1460 lkb->lkb_wait_type = mstype; in add_to_waiters()
1461 lkb->lkb_wait_nodeid = to_nodeid; /* for debugging */ in add_to_waiters()
1462 hold_lkb(lkb); in add_to_waiters()
1463 list_add(&lkb->lkb_wait_reply, &ls->ls_waiters); in add_to_waiters()
1467 lkb->lkb_id, error, lkb->lkb_flags, mstype, in add_to_waiters()
1468 lkb->lkb_wait_type, lkb->lkb_resource->res_name); in add_to_waiters()
1478 static int _remove_from_waiters(struct dlm_lkb *lkb, int mstype, in _remove_from_waiters() argument
1481 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in _remove_from_waiters()
1484 if (is_overlap_unlock(lkb) && (mstype == DLM_MSG_UNLOCK_REPLY)) { in _remove_from_waiters()
1485 log_debug(ls, "remwait %x unlock_reply overlap", lkb->lkb_id); in _remove_from_waiters()
1486 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in _remove_from_waiters()
1491 if (is_overlap_cancel(lkb) && (mstype == DLM_MSG_CANCEL_REPLY)) { in _remove_from_waiters()
1492 log_debug(ls, "remwait %x cancel_reply overlap", lkb->lkb_id); in _remove_from_waiters()
1493 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in _remove_from_waiters()
1502 (lkb->lkb_wait_type != DLM_MSG_CANCEL)) { in _remove_from_waiters()
1504 lkb->lkb_id, lkb->lkb_wait_type); in _remove_from_waiters()
1517 (lkb->lkb_wait_type == DLM_MSG_CONVERT) && in _remove_from_waiters()
1518 is_overlap_cancel(lkb) && ms && !ms->m_result) { in _remove_from_waiters()
1520 lkb->lkb_id); in _remove_from_waiters()
1521 lkb->lkb_wait_type = 0; in _remove_from_waiters()
1522 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in _remove_from_waiters()
1523 lkb->lkb_wait_count--; in _remove_from_waiters()
1524 unhold_lkb(lkb); in _remove_from_waiters()
1531 if (lkb->lkb_wait_type) { in _remove_from_waiters()
1532 lkb->lkb_wait_type = 0; in _remove_from_waiters()
1537 lkb->lkb_id, ms ? le32_to_cpu(ms->m_header.h_nodeid) : 0, in _remove_from_waiters()
1538 lkb->lkb_remid, mstype, lkb->lkb_flags); in _remove_from_waiters()
1547 if (overlap_done && lkb->lkb_wait_type) { in _remove_from_waiters()
1549 lkb->lkb_id, mstype, lkb->lkb_wait_type); in _remove_from_waiters()
1550 lkb->lkb_wait_count--; in _remove_from_waiters()
1551 unhold_lkb(lkb); in _remove_from_waiters()
1552 lkb->lkb_wait_type = 0; in _remove_from_waiters()
1555 DLM_ASSERT(lkb->lkb_wait_count, dlm_print_lkb(lkb);); in _remove_from_waiters()
1557 lkb->lkb_flags &= ~DLM_IFL_RESEND; in _remove_from_waiters()
1558 lkb->lkb_wait_count--; in _remove_from_waiters()
1559 if (!lkb->lkb_wait_count) in _remove_from_waiters()
1560 list_del_init(&lkb->lkb_wait_reply); in _remove_from_waiters()
1561 unhold_lkb(lkb); in _remove_from_waiters()
1565 static int remove_from_waiters(struct dlm_lkb *lkb, int mstype) in remove_from_waiters() argument
1567 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in remove_from_waiters()
1571 error = _remove_from_waiters(lkb, mstype, NULL); in remove_from_waiters()
1579 static int remove_from_waiters_ms(struct dlm_lkb *lkb, struct dlm_message *ms) in remove_from_waiters_ms() argument
1581 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in remove_from_waiters_ms()
1586 error = _remove_from_waiters(lkb, le32_to_cpu(ms->m_type), ms); in remove_from_waiters_ms()
1739 static void add_timeout(struct dlm_lkb *lkb) in add_timeout() argument
1741 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in add_timeout()
1743 if (is_master_copy(lkb)) in add_timeout()
1747 !(lkb->lkb_exflags & DLM_LKF_NODLCKWT)) { in add_timeout()
1748 lkb->lkb_flags |= DLM_IFL_WATCH_TIMEWARN; in add_timeout()
1751 if (lkb->lkb_exflags & DLM_LKF_TIMEOUT) in add_timeout()
1756 DLM_ASSERT(list_empty(&lkb->lkb_time_list), dlm_print_lkb(lkb);); in add_timeout()
1758 hold_lkb(lkb); in add_timeout()
1759 list_add_tail(&lkb->lkb_time_list, &ls->ls_timeout); in add_timeout()
1763 static void del_timeout(struct dlm_lkb *lkb) in del_timeout() argument
1765 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in del_timeout()
1768 if (!list_empty(&lkb->lkb_time_list)) { in del_timeout()
1769 list_del_init(&lkb->lkb_time_list); in del_timeout()
1770 unhold_lkb(lkb); in del_timeout()
1784 struct dlm_lkb *lkb = NULL, *iter; in dlm_scan_timeout() local
1811 lkb = iter; in dlm_scan_timeout()
1816 if (!lkb) in dlm_scan_timeout()
1819 r = lkb->lkb_resource; in dlm_scan_timeout()
1825 lkb->lkb_flags &= ~DLM_IFL_WATCH_TIMEWARN; in dlm_scan_timeout()
1826 if (!(lkb->lkb_exflags & DLM_LKF_TIMEOUT)) in dlm_scan_timeout()
1827 del_timeout(lkb); in dlm_scan_timeout()
1828 dlm_timeout_warn(lkb); in dlm_scan_timeout()
1833 lkb->lkb_id, lkb->lkb_nodeid, r->res_name); in dlm_scan_timeout()
1834 lkb->lkb_flags &= ~DLM_IFL_WATCH_TIMEWARN; in dlm_scan_timeout()
1835 lkb->lkb_flags |= DLM_IFL_TIMEOUT_CANCEL; in dlm_scan_timeout()
1836 del_timeout(lkb); in dlm_scan_timeout()
1837 _cancel_lock(r, lkb); in dlm_scan_timeout()
1842 dlm_put_lkb(lkb); in dlm_scan_timeout()
1851 struct dlm_lkb *lkb; in dlm_adjust_timeouts() local
1856 list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) in dlm_adjust_timeouts()
1857 lkb->lkb_timestamp = ktime_add_us(lkb->lkb_timestamp, adj_us); in dlm_adjust_timeouts()
1861 static void add_timeout(struct dlm_lkb *lkb) { } in add_timeout() argument
1862 static void del_timeout(struct dlm_lkb *lkb) { } in del_timeout() argument
1867 static void set_lvb_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_lvb_lock() argument
1875 b = dlm_lvb_operations[lkb->lkb_grmode + 1][lkb->lkb_rqmode + 1]; in set_lvb_lock()
1878 if (!lkb->lkb_lvbptr) in set_lvb_lock()
1881 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK)) in set_lvb_lock()
1887 memcpy(lkb->lkb_lvbptr, r->res_lvbptr, len); in set_lvb_lock()
1888 lkb->lkb_lvbseq = r->res_lvbseq; in set_lvb_lock()
1891 if (lkb->lkb_exflags & DLM_LKF_IVVALBLK) { in set_lvb_lock()
1896 if (!lkb->lkb_lvbptr) in set_lvb_lock()
1899 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK)) in set_lvb_lock()
1908 memcpy(r->res_lvbptr, lkb->lkb_lvbptr, len); in set_lvb_lock()
1910 lkb->lkb_lvbseq = r->res_lvbseq; in set_lvb_lock()
1915 lkb->lkb_sbflags |= DLM_SBF_VALNOTVALID; in set_lvb_lock()
1918 static void set_lvb_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_lvb_unlock() argument
1920 if (lkb->lkb_grmode < DLM_LOCK_PW) in set_lvb_unlock()
1923 if (lkb->lkb_exflags & DLM_LKF_IVVALBLK) { in set_lvb_unlock()
1928 if (!lkb->lkb_lvbptr) in set_lvb_unlock()
1931 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK)) in set_lvb_unlock()
1940 memcpy(r->res_lvbptr, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); in set_lvb_unlock()
1947 static void set_lvb_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb, in set_lvb_lock_pc() argument
1952 if (!lkb->lkb_lvbptr) in set_lvb_lock_pc()
1955 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK)) in set_lvb_lock_pc()
1958 b = dlm_lvb_operations[lkb->lkb_grmode + 1][lkb->lkb_rqmode + 1]; in set_lvb_lock_pc()
1963 memcpy(lkb->lkb_lvbptr, ms->m_extra, len); in set_lvb_lock_pc()
1964 lkb->lkb_lvbseq = le32_to_cpu(ms->m_lvbseq); in set_lvb_lock_pc()
1978 static void _remove_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _remove_lock() argument
1980 del_lkb(r, lkb); in _remove_lock()
1981 lkb->lkb_grmode = DLM_LOCK_IV; in _remove_lock()
1984 unhold_lkb(lkb); in _remove_lock()
1987 static void remove_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in remove_lock() argument
1989 set_lvb_unlock(r, lkb); in remove_lock()
1990 _remove_lock(r, lkb); in remove_lock()
1993 static void remove_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb) in remove_lock_pc() argument
1995 _remove_lock(r, lkb); in remove_lock_pc()
2002 static int revert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in revert_lock() argument
2006 lkb->lkb_rqmode = DLM_LOCK_IV; in revert_lock()
2008 switch (lkb->lkb_status) { in revert_lock()
2012 move_lkb(r, lkb, DLM_LKSTS_GRANTED); in revert_lock()
2016 del_lkb(r, lkb); in revert_lock()
2017 lkb->lkb_grmode = DLM_LOCK_IV; in revert_lock()
2020 unhold_lkb(lkb); in revert_lock()
2024 log_print("invalid status for revert %d", lkb->lkb_status); in revert_lock()
2029 static int revert_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb) in revert_lock_pc() argument
2031 return revert_lock(r, lkb); in revert_lock_pc()
2034 static void _grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _grant_lock() argument
2036 if (lkb->lkb_grmode != lkb->lkb_rqmode) { in _grant_lock()
2037 lkb->lkb_grmode = lkb->lkb_rqmode; in _grant_lock()
2038 if (lkb->lkb_status) in _grant_lock()
2039 move_lkb(r, lkb, DLM_LKSTS_GRANTED); in _grant_lock()
2041 add_lkb(r, lkb, DLM_LKSTS_GRANTED); in _grant_lock()
2044 lkb->lkb_rqmode = DLM_LOCK_IV; in _grant_lock()
2045 lkb->lkb_highbast = 0; in _grant_lock()
2048 static void grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in grant_lock() argument
2050 set_lvb_lock(r, lkb); in grant_lock()
2051 _grant_lock(r, lkb); in grant_lock()
2054 static void grant_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb, in grant_lock_pc() argument
2057 set_lvb_lock_pc(r, lkb, ms); in grant_lock_pc()
2058 _grant_lock(r, lkb); in grant_lock_pc()
2065 static void grant_lock_pending(struct dlm_rsb *r, struct dlm_lkb *lkb) in grant_lock_pending() argument
2067 grant_lock(r, lkb); in grant_lock_pending()
2068 if (is_master_copy(lkb)) in grant_lock_pending()
2069 send_grant(r, lkb); in grant_lock_pending()
2071 queue_cast(r, lkb, 0); in grant_lock_pending()
2082 static void munge_demoted(struct dlm_lkb *lkb) in munge_demoted() argument
2084 if (lkb->lkb_rqmode == DLM_LOCK_IV || lkb->lkb_grmode == DLM_LOCK_IV) { in munge_demoted()
2086 lkb->lkb_id, lkb->lkb_grmode, lkb->lkb_rqmode); in munge_demoted()
2090 lkb->lkb_grmode = DLM_LOCK_NL; in munge_demoted()
2093 static void munge_altmode(struct dlm_lkb *lkb, struct dlm_message *ms) in munge_altmode() argument
2098 lkb->lkb_id, le32_to_cpu(ms->m_type)); in munge_altmode()
2102 if (lkb->lkb_exflags & DLM_LKF_ALTPR) in munge_altmode()
2103 lkb->lkb_rqmode = DLM_LOCK_PR; in munge_altmode()
2104 else if (lkb->lkb_exflags & DLM_LKF_ALTCW) in munge_altmode()
2105 lkb->lkb_rqmode = DLM_LOCK_CW; in munge_altmode()
2107 log_print("munge_altmode invalid exflags %x", lkb->lkb_exflags); in munge_altmode()
2108 dlm_print_lkb(lkb); in munge_altmode()
2112 static inline int first_in_list(struct dlm_lkb *lkb, struct list_head *head) in first_in_list() argument
2116 if (lkb->lkb_id == first->lkb_id) in first_in_list()
2124 static int queue_conflict(struct list_head *head, struct dlm_lkb *lkb) in queue_conflict() argument
2129 if (this == lkb) in queue_conflict()
2131 if (!modes_compat(this, lkb)) in queue_conflict()
2217 static int _can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now, in _can_be_granted() argument
2220 int8_t conv = (lkb->lkb_grmode != DLM_LOCK_IV); in _can_be_granted()
2241 if (lkb->lkb_exflags & DLM_LKF_EXPEDITE) in _can_be_granted()
2249 if (queue_conflict(&r->res_grantqueue, lkb)) in _can_be_granted()
2258 if (queue_conflict(&r->res_convertqueue, lkb)) in _can_be_granted()
2301 if (now && conv && !(lkb->lkb_exflags & DLM_LKF_QUECVT)) in _can_be_granted()
2309 if (now && conv && (lkb->lkb_exflags & DLM_LKF_QUECVT)) { in _can_be_granted()
2321 if (lkb->lkb_exflags & DLM_LKF_NOORDER) in _can_be_granted()
2330 if (!now && conv && first_in_list(lkb, &r->res_convertqueue)) in _can_be_granted()
2357 first_in_list(lkb, &r->res_waitqueue)) in _can_be_granted()
2363 static int can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now, in can_be_granted() argument
2367 int8_t alt = 0, rqmode = lkb->lkb_rqmode; in can_be_granted()
2368 int8_t is_convert = (lkb->lkb_grmode != DLM_LOCK_IV); in can_be_granted()
2373 rv = _can_be_granted(r, lkb, now, recover); in can_be_granted()
2383 if (is_convert && can_be_queued(lkb) && in can_be_granted()
2384 conversion_deadlock_detect(r, lkb)) { in can_be_granted()
2385 if (lkb->lkb_exflags & DLM_LKF_CONVDEADLK) { in can_be_granted()
2386 lkb->lkb_grmode = DLM_LOCK_NL; in can_be_granted()
2387 lkb->lkb_sbflags |= DLM_SBF_DEMOTED; in can_be_granted()
2392 lkb->lkb_id, now); in can_be_granted()
2405 if (rqmode != DLM_LOCK_PR && (lkb->lkb_exflags & DLM_LKF_ALTPR)) in can_be_granted()
2407 else if (rqmode != DLM_LOCK_CW && (lkb->lkb_exflags & DLM_LKF_ALTCW)) in can_be_granted()
2411 lkb->lkb_rqmode = alt; in can_be_granted()
2412 rv = _can_be_granted(r, lkb, now, 0); in can_be_granted()
2414 lkb->lkb_sbflags |= DLM_SBF_ALTMODE; in can_be_granted()
2416 lkb->lkb_rqmode = rqmode; in can_be_granted()
2428 struct dlm_lkb *lkb, *s; in grant_pending_convert() local
2439 list_for_each_entry_safe(lkb, s, &r->res_convertqueue, lkb_statequeue) { in grant_pending_convert()
2440 demoted = is_demoted(lkb); in grant_pending_convert()
2443 if (can_be_granted(r, lkb, 0, recover, &deadlk)) { in grant_pending_convert()
2444 grant_lock_pending(r, lkb); in grant_pending_convert()
2451 if (!demoted && is_demoted(lkb)) { in grant_pending_convert()
2453 lkb->lkb_id, lkb->lkb_nodeid, r->res_name); in grant_pending_convert()
2464 if (lkb->lkb_exflags & DLM_LKF_NODLCKWT) { in grant_pending_convert()
2465 if (lkb->lkb_highbast < lkb->lkb_rqmode) { in grant_pending_convert()
2466 queue_bast(r, lkb, lkb->lkb_rqmode); in grant_pending_convert()
2467 lkb->lkb_highbast = lkb->lkb_rqmode; in grant_pending_convert()
2471 lkb->lkb_id, lkb->lkb_nodeid, in grant_pending_convert()
2478 hi = max_t(int, lkb->lkb_rqmode, hi); in grant_pending_convert()
2480 if (cw && lkb->lkb_rqmode == DLM_LOCK_CW) in grant_pending_convert()
2497 struct dlm_lkb *lkb, *s; in grant_pending_wait() local
2499 list_for_each_entry_safe(lkb, s, &r->res_waitqueue, lkb_statequeue) { in grant_pending_wait()
2500 if (can_be_granted(r, lkb, 0, 0, NULL)) { in grant_pending_wait()
2501 grant_lock_pending(r, lkb); in grant_pending_wait()
2505 high = max_t(int, lkb->lkb_rqmode, high); in grant_pending_wait()
2506 if (lkb->lkb_rqmode == DLM_LOCK_CW) in grant_pending_wait()
2535 struct dlm_lkb *lkb, *s; in grant_pending_locks() local
2557 list_for_each_entry_safe(lkb, s, &r->res_grantqueue, lkb_statequeue) { in grant_pending_locks()
2558 if (lkb->lkb_bastfn && lock_requires_bast(lkb, high, cw)) { in grant_pending_locks()
2560 lkb->lkb_grmode == DLM_LOCK_PR) in grant_pending_locks()
2561 queue_bast(r, lkb, DLM_LOCK_CW); in grant_pending_locks()
2563 queue_bast(r, lkb, high); in grant_pending_locks()
2564 lkb->lkb_highbast = high; in grant_pending_locks()
2584 struct dlm_lkb *lkb) in send_bast_queue() argument
2590 if (gr == lkb) in send_bast_queue()
2592 if (gr->lkb_bastfn && modes_require_bast(gr, lkb)) { in send_bast_queue()
2593 queue_bast(r, gr, lkb->lkb_rqmode); in send_bast_queue()
2594 gr->lkb_highbast = lkb->lkb_rqmode; in send_bast_queue()
2599 static void send_blocking_asts(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_blocking_asts() argument
2601 send_bast_queue(r, &r->res_grantqueue, lkb); in send_blocking_asts()
2604 static void send_blocking_asts_all(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_blocking_asts_all() argument
2606 send_bast_queue(r, &r->res_grantqueue, lkb); in send_blocking_asts_all()
2607 send_bast_queue(r, &r->res_convertqueue, lkb); in send_blocking_asts_all()
2629 static int set_master(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_master() argument
2635 r->res_first_lkid = lkb->lkb_id; in set_master()
2636 lkb->lkb_nodeid = r->res_nodeid; in set_master()
2640 if (r->res_first_lkid && r->res_first_lkid != lkb->lkb_id) { in set_master()
2641 list_add_tail(&lkb->lkb_rsb_lookup, &r->res_lookup); in set_master()
2646 lkb->lkb_nodeid = 0; in set_master()
2651 lkb->lkb_nodeid = r->res_master_nodeid; in set_master()
2663 lkb->lkb_id, r->res_master_nodeid, r->res_dir_nodeid, in set_master()
2667 lkb->lkb_nodeid = 0; in set_master()
2671 r->res_first_lkid = lkb->lkb_id; in set_master()
2672 send_lookup(r, lkb); in set_master()
2678 struct dlm_lkb *lkb, *safe; in process_lookup_list() local
2680 list_for_each_entry_safe(lkb, safe, &r->res_lookup, lkb_rsb_lookup) { in process_lookup_list()
2681 list_del_init(&lkb->lkb_rsb_lookup); in process_lookup_list()
2682 _request_lock(r, lkb); in process_lookup_list()
2691 struct dlm_lkb *lkb; in confirm_master() local
2713 lkb = list_entry(r->res_lookup.next, struct dlm_lkb, in confirm_master()
2715 list_del_init(&lkb->lkb_rsb_lookup); in confirm_master()
2716 r->res_first_lkid = lkb->lkb_id; in confirm_master()
2717 _request_lock(r, lkb); in confirm_master()
2816 static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in validate_lock_args() argument
2822 if (lkb->lkb_status != DLM_LKSTS_GRANTED) in validate_lock_args()
2826 if (lkb->lkb_wait_type || lkb->lkb_wait_count) in validate_lock_args()
2829 if (is_overlap(lkb)) in validate_lock_args()
2833 if (lkb->lkb_flags & DLM_IFL_MSTCPY) in validate_lock_args()
2837 !__quecvt_compat_matrix[lkb->lkb_grmode+1][args->mode+1]) in validate_lock_args()
2841 lkb->lkb_exflags = args->flags; in validate_lock_args()
2842 lkb->lkb_sbflags = 0; in validate_lock_args()
2843 lkb->lkb_astfn = args->astfn; in validate_lock_args()
2844 lkb->lkb_astparam = args->astparam; in validate_lock_args()
2845 lkb->lkb_bastfn = args->bastfn; in validate_lock_args()
2846 lkb->lkb_rqmode = args->mode; in validate_lock_args()
2847 lkb->lkb_lksb = args->lksb; in validate_lock_args()
2848 lkb->lkb_lvbptr = args->lksb->sb_lvbptr; in validate_lock_args()
2849 lkb->lkb_ownpid = (int) current->pid; in validate_lock_args()
2851 lkb->lkb_timeout_cs = args->timeout; in validate_lock_args()
2862 rv, lkb->lkb_id, lkb->lkb_flags, args->flags, in validate_lock_args()
2863 lkb->lkb_status, lkb->lkb_wait_type, in validate_lock_args()
2864 lkb->lkb_resource->res_name); in validate_lock_args()
2868 rv, lkb->lkb_id, lkb->lkb_flags, args->flags, in validate_lock_args()
2869 lkb->lkb_status, lkb->lkb_wait_type, in validate_lock_args()
2870 lkb->lkb_resource->res_name); in validate_lock_args()
2884 static int validate_unlock_args(struct dlm_lkb *lkb, struct dlm_args *args) in validate_unlock_args() argument
2886 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in validate_unlock_args()
2891 (lkb->lkb_wait_type || lkb->lkb_wait_count)) in validate_unlock_args()
2897 if (!list_empty(&lkb->lkb_rsb_lookup)) { in validate_unlock_args()
2899 log_debug(ls, "unlock on rsb_lookup %x", lkb->lkb_id); in validate_unlock_args()
2900 list_del_init(&lkb->lkb_rsb_lookup); in validate_unlock_args()
2901 queue_cast(lkb->lkb_resource, lkb, in validate_unlock_args()
2904 unhold_lkb(lkb); /* undoes create_lkb() */ in validate_unlock_args()
2911 if (lkb->lkb_flags & DLM_IFL_MSTCPY) { in validate_unlock_args()
2912 log_error(ls, "unlock on MSTCPY %x", lkb->lkb_id); in validate_unlock_args()
2913 dlm_print_lkb(lkb); in validate_unlock_args()
2922 if (lkb->lkb_flags & DLM_IFL_ENDOFLIFE) { in validate_unlock_args()
2923 log_debug(ls, "unlock on ENDOFLIFE %x", lkb->lkb_id); in validate_unlock_args()
2931 if (lkb->lkb_exflags & DLM_LKF_CANCEL) in validate_unlock_args()
2934 if (is_overlap(lkb)) in validate_unlock_args()
2938 del_timeout(lkb); in validate_unlock_args()
2940 if (lkb->lkb_flags & DLM_IFL_RESEND) { in validate_unlock_args()
2941 lkb->lkb_flags |= DLM_IFL_OVERLAP_CANCEL; in validate_unlock_args()
2947 if (lkb->lkb_status == DLM_LKSTS_GRANTED && in validate_unlock_args()
2948 !lkb->lkb_wait_type) { in validate_unlock_args()
2953 switch (lkb->lkb_wait_type) { in validate_unlock_args()
2956 lkb->lkb_flags |= DLM_IFL_OVERLAP_CANCEL; in validate_unlock_args()
2972 if (lkb->lkb_exflags & DLM_LKF_FORCEUNLOCK) in validate_unlock_args()
2975 if (is_overlap_unlock(lkb)) in validate_unlock_args()
2979 del_timeout(lkb); in validate_unlock_args()
2981 if (lkb->lkb_flags & DLM_IFL_RESEND) { in validate_unlock_args()
2982 lkb->lkb_flags |= DLM_IFL_OVERLAP_UNLOCK; in validate_unlock_args()
2987 switch (lkb->lkb_wait_type) { in validate_unlock_args()
2990 lkb->lkb_flags |= DLM_IFL_OVERLAP_UNLOCK; in validate_unlock_args()
3001 lkb->lkb_exflags |= args->flags; in validate_unlock_args()
3002 lkb->lkb_sbflags = 0; in validate_unlock_args()
3003 lkb->lkb_astparam = args->astparam; in validate_unlock_args()
3013 lkb->lkb_id, lkb->lkb_flags, lkb->lkb_exflags, in validate_unlock_args()
3014 args->flags, lkb->lkb_wait_type, in validate_unlock_args()
3015 lkb->lkb_resource->res_name); in validate_unlock_args()
3019 lkb->lkb_id, lkb->lkb_flags, lkb->lkb_exflags, in validate_unlock_args()
3020 args->flags, lkb->lkb_wait_type, in validate_unlock_args()
3021 lkb->lkb_resource->res_name); in validate_unlock_args()
3035 static int do_request(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_request() argument
3039 if (can_be_granted(r, lkb, 1, 0, NULL)) { in do_request()
3040 grant_lock(r, lkb); in do_request()
3041 queue_cast(r, lkb, 0); in do_request()
3045 if (can_be_queued(lkb)) { in do_request()
3047 add_lkb(r, lkb, DLM_LKSTS_WAITING); in do_request()
3048 add_timeout(lkb); in do_request()
3053 queue_cast(r, lkb, -EAGAIN); in do_request()
3058 static void do_request_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_request_effects() argument
3063 if (force_blocking_asts(lkb)) in do_request_effects()
3064 send_blocking_asts_all(r, lkb); in do_request_effects()
3067 send_blocking_asts(r, lkb); in do_request_effects()
3072 static int do_convert(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_convert() argument
3079 if (can_be_granted(r, lkb, 1, 0, &deadlk)) { in do_convert()
3080 grant_lock(r, lkb); in do_convert()
3081 queue_cast(r, lkb, 0); in do_convert()
3089 if (deadlk && !(lkb->lkb_exflags & DLM_LKF_NODLCKWT)) { in do_convert()
3091 revert_lock(r, lkb); in do_convert()
3092 queue_cast(r, lkb, -EDEADLK); in do_convert()
3103 if (is_demoted(lkb)) { in do_convert()
3105 if (_can_be_granted(r, lkb, 1, 0)) { in do_convert()
3106 grant_lock(r, lkb); in do_convert()
3107 queue_cast(r, lkb, 0); in do_convert()
3113 if (can_be_queued(lkb)) { in do_convert()
3115 del_lkb(r, lkb); in do_convert()
3116 add_lkb(r, lkb, DLM_LKSTS_CONVERT); in do_convert()
3117 add_timeout(lkb); in do_convert()
3122 queue_cast(r, lkb, -EAGAIN); in do_convert()
3127 static void do_convert_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_convert_effects() argument
3136 if (force_blocking_asts(lkb)) in do_convert_effects()
3137 send_blocking_asts_all(r, lkb); in do_convert_effects()
3140 send_blocking_asts(r, lkb); in do_convert_effects()
3145 static int do_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_unlock() argument
3147 remove_lock(r, lkb); in do_unlock()
3148 queue_cast(r, lkb, -DLM_EUNLOCK); in do_unlock()
3152 static void do_unlock_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_unlock_effects() argument
3160 static int do_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_cancel() argument
3164 error = revert_lock(r, lkb); in do_cancel()
3166 queue_cast(r, lkb, -DLM_ECANCEL); in do_cancel()
3172 static void do_cancel_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_cancel_effects() argument
3186 static int _request_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _request_lock() argument
3192 error = set_master(r, lkb); in _request_lock()
3202 error = send_request(r, lkb); in _request_lock()
3204 error = do_request(r, lkb); in _request_lock()
3207 do_request_effects(r, lkb, error); in _request_lock()
3215 static int _convert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _convert_lock() argument
3221 error = send_convert(r, lkb); in _convert_lock()
3223 error = do_convert(r, lkb); in _convert_lock()
3226 do_convert_effects(r, lkb, error); in _convert_lock()
3234 static int _unlock_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _unlock_lock() argument
3240 error = send_unlock(r, lkb); in _unlock_lock()
3242 error = do_unlock(r, lkb); in _unlock_lock()
3245 do_unlock_effects(r, lkb, error); in _unlock_lock()
3253 static int _cancel_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _cancel_lock() argument
3259 error = send_cancel(r, lkb); in _cancel_lock()
3261 error = do_cancel(r, lkb); in _cancel_lock()
3264 do_cancel_effects(r, lkb, error); in _cancel_lock()
3275 static int request_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in request_lock() argument
3282 error = validate_lock_args(ls, lkb, args); in request_lock()
3292 attach_lkb(r, lkb); in request_lock()
3293 lkb->lkb_lksb->sb_lkid = lkb->lkb_id; in request_lock()
3295 error = _request_lock(r, lkb); in request_lock()
3302 static int convert_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in convert_lock() argument
3308 r = lkb->lkb_resource; in convert_lock()
3313 error = validate_lock_args(ls, lkb, args); in convert_lock()
3317 error = _convert_lock(r, lkb); in convert_lock()
3324 static int unlock_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in unlock_lock() argument
3330 r = lkb->lkb_resource; in unlock_lock()
3335 error = validate_unlock_args(lkb, args); in unlock_lock()
3339 error = _unlock_lock(r, lkb); in unlock_lock()
3346 static int cancel_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in cancel_lock() argument
3352 r = lkb->lkb_resource; in cancel_lock()
3357 error = validate_unlock_args(lkb, args); in cancel_lock()
3361 error = _cancel_lock(r, lkb); in cancel_lock()
3384 struct dlm_lkb *lkb; in dlm_lock() local
3395 error = find_lkb(ls, lksb->sb_lkid, &lkb); in dlm_lock()
3397 error = create_lkb(ls, &lkb); in dlm_lock()
3402 trace_dlm_lock_start(ls, lkb, name, namelen, mode, flags); in dlm_lock()
3415 error = convert_lock(ls, lkb, &args); in dlm_lock()
3417 error = request_lock(ls, lkb, name, namelen, &args); in dlm_lock()
3422 trace_dlm_lock_end(ls, lkb, name, namelen, mode, flags, error, true); in dlm_lock()
3425 __put_lkb(ls, lkb); in dlm_lock()
3441 struct dlm_lkb *lkb; in dlm_unlock() local
3451 error = find_lkb(ls, lkid, &lkb); in dlm_unlock()
3455 trace_dlm_unlock_start(ls, lkb, flags); in dlm_unlock()
3462 error = cancel_lock(ls, lkb, &args); in dlm_unlock()
3464 error = unlock_lock(ls, lkb, &args); in dlm_unlock()
3471 trace_dlm_unlock_end(ls, lkb, flags, error); in dlm_unlock()
3473 dlm_put_lkb(lkb); in dlm_unlock()
3535 static int create_message(struct dlm_rsb *r, struct dlm_lkb *lkb, in create_message() argument
3554 if (lkb && lkb->lkb_lvbptr) in create_message()
3573 static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb, in send_args() argument
3576 ms->m_nodeid = cpu_to_le32(lkb->lkb_nodeid); in send_args()
3577 ms->m_pid = cpu_to_le32(lkb->lkb_ownpid); in send_args()
3578 ms->m_lkid = cpu_to_le32(lkb->lkb_id); in send_args()
3579 ms->m_remid = cpu_to_le32(lkb->lkb_remid); in send_args()
3580 ms->m_exflags = cpu_to_le32(lkb->lkb_exflags); in send_args()
3581 ms->m_sbflags = cpu_to_le32(lkb->lkb_sbflags); in send_args()
3582 ms->m_flags = cpu_to_le32(lkb->lkb_flags); in send_args()
3583 ms->m_lvbseq = cpu_to_le32(lkb->lkb_lvbseq); in send_args()
3584 ms->m_status = cpu_to_le32(lkb->lkb_status); in send_args()
3585 ms->m_grmode = cpu_to_le32(lkb->lkb_grmode); in send_args()
3586 ms->m_rqmode = cpu_to_le32(lkb->lkb_rqmode); in send_args()
3592 if (lkb->lkb_bastfn) in send_args()
3594 if (lkb->lkb_astfn) in send_args()
3610 if (!lkb->lkb_lvbptr || !(lkb->lkb_exflags & DLM_LKF_VALBLK)) in send_args()
3612 memcpy(ms->m_extra, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); in send_args()
3617 static int send_common(struct dlm_rsb *r, struct dlm_lkb *lkb, int mstype) in send_common() argument
3625 error = add_to_waiters(lkb, mstype, to_nodeid); in send_common()
3629 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh, GFP_NOFS); in send_common()
3633 send_args(r, lkb, ms); in send_common()
3641 remove_from_waiters(lkb, msg_reply_type(mstype)); in send_common()
3645 static int send_request(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_request() argument
3647 return send_common(r, lkb, DLM_MSG_REQUEST); in send_request()
3650 static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_convert() argument
3654 error = send_common(r, lkb, DLM_MSG_CONVERT); in send_convert()
3657 if (!error && down_conversion(lkb)) { in send_convert()
3658 remove_from_waiters(lkb, DLM_MSG_CONVERT_REPLY); in send_convert()
3662 __receive_convert_reply(r, lkb, &r->res_ls->ls_stub_ms); in send_convert()
3672 static int send_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_unlock() argument
3674 return send_common(r, lkb, DLM_MSG_UNLOCK); in send_unlock()
3677 static int send_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_cancel() argument
3679 return send_common(r, lkb, DLM_MSG_CANCEL); in send_cancel()
3682 static int send_grant(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_grant() argument
3688 to_nodeid = lkb->lkb_nodeid; in send_grant()
3690 error = create_message(r, lkb, to_nodeid, DLM_MSG_GRANT, &ms, &mh, in send_grant()
3695 send_args(r, lkb, ms); in send_grant()
3704 static int send_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int mode) in send_bast() argument
3710 to_nodeid = lkb->lkb_nodeid; in send_bast()
3717 send_args(r, lkb, ms); in send_bast()
3726 static int send_lookup(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_lookup() argument
3734 error = add_to_waiters(lkb, DLM_MSG_LOOKUP, to_nodeid); in send_lookup()
3743 send_args(r, lkb, ms); in send_lookup()
3751 remove_from_waiters(lkb, DLM_MSG_LOOKUP_REPLY); in send_lookup()
3776 static int send_common_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, in send_common_reply() argument
3783 to_nodeid = lkb->lkb_nodeid; in send_common_reply()
3785 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh, GFP_NOFS); in send_common_reply()
3789 send_args(r, lkb, ms); in send_common_reply()
3798 static int send_request_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_request_reply() argument
3800 return send_common_reply(r, lkb, DLM_MSG_REQUEST_REPLY, rv); in send_request_reply()
3803 static int send_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_convert_reply() argument
3805 return send_common_reply(r, lkb, DLM_MSG_CONVERT_REPLY, rv); in send_convert_reply()
3808 static int send_unlock_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_unlock_reply() argument
3810 return send_common_reply(r, lkb, DLM_MSG_UNLOCK_REPLY, rv); in send_unlock_reply()
3813 static int send_cancel_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_cancel_reply() argument
3815 return send_common_reply(r, lkb, DLM_MSG_CANCEL_REPLY, rv); in send_cancel_reply()
3844 static void receive_flags(struct dlm_lkb *lkb, struct dlm_message *ms) in receive_flags() argument
3846 lkb->lkb_exflags = le32_to_cpu(ms->m_exflags); in receive_flags()
3847 lkb->lkb_sbflags = le32_to_cpu(ms->m_sbflags); in receive_flags()
3848 lkb->lkb_flags = (lkb->lkb_flags & 0xFFFF0000) | in receive_flags()
3852 static void receive_flags_reply(struct dlm_lkb *lkb, struct dlm_message *ms) in receive_flags_reply() argument
3857 lkb->lkb_sbflags = le32_to_cpu(ms->m_sbflags); in receive_flags_reply()
3858 lkb->lkb_flags = (lkb->lkb_flags & 0xFFFF0000) | in receive_flags_reply()
3868 static int receive_lvb(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_lvb() argument
3873 if (lkb->lkb_exflags & DLM_LKF_VALBLK) { in receive_lvb()
3874 if (!lkb->lkb_lvbptr) in receive_lvb()
3875 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_lvb()
3876 if (!lkb->lkb_lvbptr) in receive_lvb()
3881 memcpy(lkb->lkb_lvbptr, ms->m_extra, len); in receive_lvb()
3896 static int receive_request_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_request_args() argument
3899 lkb->lkb_nodeid = le32_to_cpu(ms->m_header.h_nodeid); in receive_request_args()
3900 lkb->lkb_ownpid = le32_to_cpu(ms->m_pid); in receive_request_args()
3901 lkb->lkb_remid = le32_to_cpu(ms->m_lkid); in receive_request_args()
3902 lkb->lkb_grmode = DLM_LOCK_IV; in receive_request_args()
3903 lkb->lkb_rqmode = le32_to_cpu(ms->m_rqmode); in receive_request_args()
3905 lkb->lkb_bastfn = (ms->m_asts & cpu_to_le32(DLM_CB_BAST)) ? &fake_bastfn : NULL; in receive_request_args()
3906 lkb->lkb_astfn = (ms->m_asts & cpu_to_le32(DLM_CB_CAST)) ? &fake_astfn : NULL; in receive_request_args()
3908 if (lkb->lkb_exflags & DLM_LKF_VALBLK) { in receive_request_args()
3910 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_request_args()
3911 if (!lkb->lkb_lvbptr) in receive_request_args()
3918 static int receive_convert_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_convert_args() argument
3921 if (lkb->lkb_status != DLM_LKSTS_GRANTED) in receive_convert_args()
3924 if (receive_lvb(ls, lkb, ms)) in receive_convert_args()
3927 lkb->lkb_rqmode = le32_to_cpu(ms->m_rqmode); in receive_convert_args()
3928 lkb->lkb_lvbseq = le32_to_cpu(ms->m_lvbseq); in receive_convert_args()
3933 static int receive_unlock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_unlock_args() argument
3936 if (receive_lvb(ls, lkb, ms)) in receive_unlock_args()
3946 struct dlm_lkb *lkb = &ls->ls_stub_lkb; in setup_stub_lkb() local
3947 lkb->lkb_nodeid = le32_to_cpu(ms->m_header.h_nodeid); in setup_stub_lkb()
3948 lkb->lkb_remid = le32_to_cpu(ms->m_lkid); in setup_stub_lkb()
3954 static int validate_message(struct dlm_lkb *lkb, struct dlm_message *ms) in validate_message() argument
3961 ~lkb->lkb_flags & DLM_IFL_USER) { in validate_message()
3962 log_error(lkb->lkb_resource->res_ls, in validate_message()
3972 if (!is_master_copy(lkb) || lkb->lkb_nodeid != from) in validate_message()
3981 if (!is_process_copy(lkb) || lkb->lkb_nodeid != from) in validate_message()
3986 if (!is_process_copy(lkb)) in validate_message()
3988 else if (lkb->lkb_nodeid != -1 && lkb->lkb_nodeid != from) in validate_message()
3998 log_error(lkb->lkb_resource->res_ls, in validate_message()
4000 le32_to_cpu(ms->m_type), from, lkb->lkb_id, in validate_message()
4001 lkb->lkb_remid, lkb->lkb_flags, lkb->lkb_nodeid); in validate_message()
4007 struct dlm_lkb *lkb; in receive_request() local
4014 error = create_lkb(ls, &lkb); in receive_request()
4018 receive_flags(lkb, ms); in receive_request()
4019 lkb->lkb_flags |= DLM_IFL_MSTCPY; in receive_request()
4020 error = receive_request_args(ls, lkb, ms); in receive_request()
4022 __put_lkb(ls, lkb); in receive_request()
4037 __put_lkb(ls, lkb); in receive_request()
4048 __put_lkb(ls, lkb); in receive_request()
4053 attach_lkb(r, lkb); in receive_request()
4054 error = do_request(r, lkb); in receive_request()
4055 send_request_reply(r, lkb, error); in receive_request()
4056 do_request_effects(r, lkb, error); in receive_request()
4064 dlm_put_lkb(lkb); in receive_request()
4086 struct dlm_lkb *lkb; in receive_convert() local
4090 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_convert()
4094 if (lkb->lkb_remid != le32_to_cpu(ms->m_lkid)) { in receive_convert()
4096 "remote %d %x", lkb->lkb_id, lkb->lkb_remid, in receive_convert()
4097 (unsigned long long)lkb->lkb_recover_seq, in receive_convert()
4101 dlm_put_lkb(lkb); in receive_convert()
4105 r = lkb->lkb_resource; in receive_convert()
4110 error = validate_message(lkb, ms); in receive_convert()
4114 receive_flags(lkb, ms); in receive_convert()
4116 error = receive_convert_args(ls, lkb, ms); in receive_convert()
4118 send_convert_reply(r, lkb, error); in receive_convert()
4122 reply = !down_conversion(lkb); in receive_convert()
4124 error = do_convert(r, lkb); in receive_convert()
4126 send_convert_reply(r, lkb, error); in receive_convert()
4127 do_convert_effects(r, lkb, error); in receive_convert()
4131 dlm_put_lkb(lkb); in receive_convert()
4142 struct dlm_lkb *lkb; in receive_unlock() local
4146 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_unlock()
4150 if (lkb->lkb_remid != le32_to_cpu(ms->m_lkid)) { in receive_unlock()
4152 lkb->lkb_id, lkb->lkb_remid, in receive_unlock()
4156 dlm_put_lkb(lkb); in receive_unlock()
4160 r = lkb->lkb_resource; in receive_unlock()
4165 error = validate_message(lkb, ms); in receive_unlock()
4169 receive_flags(lkb, ms); in receive_unlock()
4171 error = receive_unlock_args(ls, lkb, ms); in receive_unlock()
4173 send_unlock_reply(r, lkb, error); in receive_unlock()
4177 error = do_unlock(r, lkb); in receive_unlock()
4178 send_unlock_reply(r, lkb, error); in receive_unlock()
4179 do_unlock_effects(r, lkb, error); in receive_unlock()
4183 dlm_put_lkb(lkb); in receive_unlock()
4194 struct dlm_lkb *lkb; in receive_cancel() local
4198 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_cancel()
4202 receive_flags(lkb, ms); in receive_cancel()
4204 r = lkb->lkb_resource; in receive_cancel()
4209 error = validate_message(lkb, ms); in receive_cancel()
4213 error = do_cancel(r, lkb); in receive_cancel()
4214 send_cancel_reply(r, lkb, error); in receive_cancel()
4215 do_cancel_effects(r, lkb, error); in receive_cancel()
4219 dlm_put_lkb(lkb); in receive_cancel()
4230 struct dlm_lkb *lkb; in receive_grant() local
4234 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_grant()
4238 r = lkb->lkb_resource; in receive_grant()
4243 error = validate_message(lkb, ms); in receive_grant()
4247 receive_flags_reply(lkb, ms); in receive_grant()
4248 if (is_altmode(lkb)) in receive_grant()
4249 munge_altmode(lkb, ms); in receive_grant()
4250 grant_lock_pc(r, lkb, ms); in receive_grant()
4251 queue_cast(r, lkb, 0); in receive_grant()
4255 dlm_put_lkb(lkb); in receive_grant()
4261 struct dlm_lkb *lkb; in receive_bast() local
4265 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_bast()
4269 r = lkb->lkb_resource; in receive_bast()
4274 error = validate_message(lkb, ms); in receive_bast()
4278 queue_bast(r, lkb, le32_to_cpu(ms->m_bastmode)); in receive_bast()
4279 lkb->lkb_highbast = le32_to_cpu(ms->m_bastmode); in receive_bast()
4283 dlm_put_lkb(lkb); in receive_bast()
4402 struct dlm_lkb *lkb; in receive_request_reply() local
4407 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_request_reply()
4411 r = lkb->lkb_resource; in receive_request_reply()
4415 error = validate_message(lkb, ms); in receive_request_reply()
4419 mstype = lkb->lkb_wait_type; in receive_request_reply()
4420 error = remove_from_waiters(lkb, DLM_MSG_REQUEST_REPLY); in receive_request_reply()
4423 lkb->lkb_id, from_nodeid, le32_to_cpu(ms->m_lkid), in receive_request_reply()
4434 lkb->lkb_nodeid = from_nodeid; in receive_request_reply()
4443 queue_cast(r, lkb, -EAGAIN); in receive_request_reply()
4445 unhold_lkb(lkb); /* undoes create_lkb() */ in receive_request_reply()
4451 receive_flags_reply(lkb, ms); in receive_request_reply()
4452 lkb->lkb_remid = le32_to_cpu(ms->m_lkid); in receive_request_reply()
4453 if (is_altmode(lkb)) in receive_request_reply()
4454 munge_altmode(lkb, ms); in receive_request_reply()
4456 add_lkb(r, lkb, DLM_LKSTS_WAITING); in receive_request_reply()
4457 add_timeout(lkb); in receive_request_reply()
4459 grant_lock_pc(r, lkb, ms); in receive_request_reply()
4460 queue_cast(r, lkb, 0); in receive_request_reply()
4469 "master %d dir %d first %x %s", lkb->lkb_id, in receive_request_reply()
4478 lkb->lkb_nodeid = -1; in receive_request_reply()
4481 if (is_overlap(lkb)) { in receive_request_reply()
4483 queue_cast_overlap(r, lkb); in receive_request_reply()
4485 unhold_lkb(lkb); /* undoes create_lkb() */ in receive_request_reply()
4487 _request_lock(r, lkb); in receive_request_reply()
4496 lkb->lkb_id, result); in receive_request_reply()
4499 if (is_overlap_unlock(lkb) && (result == 0 || result == -EINPROGRESS)) { in receive_request_reply()
4501 lkb->lkb_id, result); in receive_request_reply()
4502 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in receive_request_reply()
4503 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in receive_request_reply()
4504 send_unlock(r, lkb); in receive_request_reply()
4505 } else if (is_overlap_cancel(lkb) && (result == -EINPROGRESS)) { in receive_request_reply()
4506 log_debug(ls, "receive_request_reply %x cancel", lkb->lkb_id); in receive_request_reply()
4507 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in receive_request_reply()
4508 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in receive_request_reply()
4509 send_cancel(r, lkb); in receive_request_reply()
4511 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in receive_request_reply()
4512 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in receive_request_reply()
4517 dlm_put_lkb(lkb); in receive_request_reply()
4521 static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, in __receive_convert_reply() argument
4528 queue_cast(r, lkb, -EAGAIN); in __receive_convert_reply()
4532 receive_flags_reply(lkb, ms); in __receive_convert_reply()
4533 revert_lock_pc(r, lkb); in __receive_convert_reply()
4534 queue_cast(r, lkb, -EDEADLK); in __receive_convert_reply()
4539 receive_flags_reply(lkb, ms); in __receive_convert_reply()
4540 if (is_demoted(lkb)) in __receive_convert_reply()
4541 munge_demoted(lkb); in __receive_convert_reply()
4542 del_lkb(r, lkb); in __receive_convert_reply()
4543 add_lkb(r, lkb, DLM_LKSTS_CONVERT); in __receive_convert_reply()
4544 add_timeout(lkb); in __receive_convert_reply()
4549 receive_flags_reply(lkb, ms); in __receive_convert_reply()
4550 if (is_demoted(lkb)) in __receive_convert_reply()
4551 munge_demoted(lkb); in __receive_convert_reply()
4552 grant_lock_pc(r, lkb, ms); in __receive_convert_reply()
4553 queue_cast(r, lkb, 0); in __receive_convert_reply()
4558 lkb->lkb_id, le32_to_cpu(ms->m_header.h_nodeid), in __receive_convert_reply()
4562 dlm_print_lkb(lkb); in __receive_convert_reply()
4566 static void _receive_convert_reply(struct dlm_lkb *lkb, struct dlm_message *ms) in _receive_convert_reply() argument
4568 struct dlm_rsb *r = lkb->lkb_resource; in _receive_convert_reply()
4574 error = validate_message(lkb, ms); in _receive_convert_reply()
4579 error = remove_from_waiters_ms(lkb, ms); in _receive_convert_reply()
4583 __receive_convert_reply(r, lkb, ms); in _receive_convert_reply()
4591 struct dlm_lkb *lkb; in receive_convert_reply() local
4594 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_convert_reply()
4598 _receive_convert_reply(lkb, ms); in receive_convert_reply()
4599 dlm_put_lkb(lkb); in receive_convert_reply()
4603 static void _receive_unlock_reply(struct dlm_lkb *lkb, struct dlm_message *ms) in _receive_unlock_reply() argument
4605 struct dlm_rsb *r = lkb->lkb_resource; in _receive_unlock_reply()
4611 error = validate_message(lkb, ms); in _receive_unlock_reply()
4616 error = remove_from_waiters_ms(lkb, ms); in _receive_unlock_reply()
4624 receive_flags_reply(lkb, ms); in _receive_unlock_reply()
4625 remove_lock_pc(r, lkb); in _receive_unlock_reply()
4626 queue_cast(r, lkb, -DLM_EUNLOCK); in _receive_unlock_reply()
4632 lkb->lkb_id, from_dlm_errno(le32_to_cpu(ms->m_result))); in _receive_unlock_reply()
4641 struct dlm_lkb *lkb; in receive_unlock_reply() local
4644 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_unlock_reply()
4648 _receive_unlock_reply(lkb, ms); in receive_unlock_reply()
4649 dlm_put_lkb(lkb); in receive_unlock_reply()
4653 static void _receive_cancel_reply(struct dlm_lkb *lkb, struct dlm_message *ms) in _receive_cancel_reply() argument
4655 struct dlm_rsb *r = lkb->lkb_resource; in _receive_cancel_reply()
4661 error = validate_message(lkb, ms); in _receive_cancel_reply()
4666 error = remove_from_waiters_ms(lkb, ms); in _receive_cancel_reply()
4674 receive_flags_reply(lkb, ms); in _receive_cancel_reply()
4675 revert_lock_pc(r, lkb); in _receive_cancel_reply()
4676 queue_cast(r, lkb, -DLM_ECANCEL); in _receive_cancel_reply()
4682 lkb->lkb_id, in _receive_cancel_reply()
4692 struct dlm_lkb *lkb; in receive_cancel_reply() local
4695 error = find_lkb(ls, le32_to_cpu(ms->m_remid), &lkb); in receive_cancel_reply()
4699 _receive_cancel_reply(lkb, ms); in receive_cancel_reply()
4700 dlm_put_lkb(lkb); in receive_cancel_reply()
4706 struct dlm_lkb *lkb; in receive_lookup_reply() local
4711 error = find_lkb(ls, le32_to_cpu(ms->m_lkid), &lkb); in receive_lookup_reply()
4721 r = lkb->lkb_resource; in receive_lookup_reply()
4725 error = remove_from_waiters(lkb, DLM_MSG_LOOKUP_REPLY); in receive_lookup_reply()
4741 lkb->lkb_id, le32_to_cpu(ms->m_header.h_nodeid), in receive_lookup_reply()
4754 lkb->lkb_id, le32_to_cpu(ms->m_header.h_nodeid)); in receive_lookup_reply()
4757 lkb->lkb_nodeid = -1; in receive_lookup_reply()
4764 if (is_overlap(lkb)) { in receive_lookup_reply()
4766 lkb->lkb_id, lkb->lkb_flags); in receive_lookup_reply()
4767 queue_cast_overlap(r, lkb); in receive_lookup_reply()
4768 unhold_lkb(lkb); /* undoes create_lkb() */ in receive_lookup_reply()
4772 _request_lock(r, lkb); in receive_lookup_reply()
4780 dlm_put_lkb(lkb); in receive_lookup_reply()
5008 static void recover_convert_waiter(struct dlm_ls *ls, struct dlm_lkb *lkb, in recover_convert_waiter() argument
5011 if (middle_conversion(lkb)) { in recover_convert_waiter()
5012 hold_lkb(lkb); in recover_convert_waiter()
5017 ms_stub->m_header.h_nodeid = cpu_to_le32(lkb->lkb_nodeid); in recover_convert_waiter()
5018 _receive_convert_reply(lkb, ms_stub); in recover_convert_waiter()
5021 lkb->lkb_grmode = DLM_LOCK_IV; in recover_convert_waiter()
5022 rsb_set_flag(lkb->lkb_resource, RSB_RECOVER_CONVERT); in recover_convert_waiter()
5023 unhold_lkb(lkb); in recover_convert_waiter()
5025 } else if (lkb->lkb_rqmode >= lkb->lkb_grmode) { in recover_convert_waiter()
5026 lkb->lkb_flags |= DLM_IFL_RESEND; in recover_convert_waiter()
5036 static int waiter_needs_recovery(struct dlm_ls *ls, struct dlm_lkb *lkb, in waiter_needs_recovery() argument
5042 if (dlm_is_removed(ls, lkb->lkb_wait_nodeid)) in waiter_needs_recovery()
5056 struct dlm_lkb *lkb, *safe; in dlm_recover_waiters_pre() local
5067 list_for_each_entry_safe(lkb, safe, &ls->ls_waiters, lkb_wait_reply) { in dlm_recover_waiters_pre()
5069 dir_nodeid = dlm_dir_nodeid(lkb->lkb_resource); in dlm_recover_waiters_pre()
5074 if (lkb->lkb_wait_type != DLM_MSG_UNLOCK) { in dlm_recover_waiters_pre()
5077 lkb->lkb_id, in dlm_recover_waiters_pre()
5078 lkb->lkb_remid, in dlm_recover_waiters_pre()
5079 lkb->lkb_wait_type, in dlm_recover_waiters_pre()
5080 lkb->lkb_resource->res_nodeid, in dlm_recover_waiters_pre()
5081 lkb->lkb_nodeid, in dlm_recover_waiters_pre()
5082 lkb->lkb_wait_nodeid, in dlm_recover_waiters_pre()
5089 if (lkb->lkb_wait_type == DLM_MSG_LOOKUP) { in dlm_recover_waiters_pre()
5090 lkb->lkb_flags |= DLM_IFL_RESEND; in dlm_recover_waiters_pre()
5094 if (!waiter_needs_recovery(ls, lkb, dir_nodeid)) in dlm_recover_waiters_pre()
5097 wait_type = lkb->lkb_wait_type; in dlm_recover_waiters_pre()
5107 if (is_overlap_cancel(lkb)) { in dlm_recover_waiters_pre()
5109 if (lkb->lkb_grmode == DLM_LOCK_IV) in dlm_recover_waiters_pre()
5112 if (is_overlap_unlock(lkb)) { in dlm_recover_waiters_pre()
5114 if (lkb->lkb_grmode == DLM_LOCK_IV) in dlm_recover_waiters_pre()
5119 lkb->lkb_id, lkb->lkb_flags, wait_type, in dlm_recover_waiters_pre()
5126 lkb->lkb_flags |= DLM_IFL_RESEND; in dlm_recover_waiters_pre()
5130 recover_convert_waiter(ls, lkb, ms_stub); in dlm_recover_waiters_pre()
5134 hold_lkb(lkb); in dlm_recover_waiters_pre()
5139 ms_stub->m_header.h_nodeid = cpu_to_le32(lkb->lkb_nodeid); in dlm_recover_waiters_pre()
5140 _receive_unlock_reply(lkb, ms_stub); in dlm_recover_waiters_pre()
5141 dlm_put_lkb(lkb); in dlm_recover_waiters_pre()
5145 hold_lkb(lkb); in dlm_recover_waiters_pre()
5150 ms_stub->m_header.h_nodeid = cpu_to_le32(lkb->lkb_nodeid); in dlm_recover_waiters_pre()
5151 _receive_cancel_reply(lkb, ms_stub); in dlm_recover_waiters_pre()
5152 dlm_put_lkb(lkb); in dlm_recover_waiters_pre()
5157 lkb->lkb_wait_type, wait_type); in dlm_recover_waiters_pre()
5167 struct dlm_lkb *lkb = NULL, *iter; in find_resend_waiter() local
5173 lkb = iter; in find_resend_waiter()
5179 return lkb; in find_resend_waiter()
5200 struct dlm_lkb *lkb; in dlm_recover_waiters_post() local
5211 lkb = find_resend_waiter(ls); in dlm_recover_waiters_post()
5212 if (!lkb) in dlm_recover_waiters_post()
5215 r = lkb->lkb_resource; in dlm_recover_waiters_post()
5219 mstype = lkb->lkb_wait_type; in dlm_recover_waiters_post()
5220 oc = is_overlap_cancel(lkb); in dlm_recover_waiters_post()
5221 ou = is_overlap_unlock(lkb); in dlm_recover_waiters_post()
5226 "overlap %d %d", lkb->lkb_id, lkb->lkb_remid, mstype, in dlm_recover_waiters_post()
5227 r->res_nodeid, lkb->lkb_nodeid, lkb->lkb_wait_nodeid, in dlm_recover_waiters_post()
5234 lkb->lkb_flags &= ~DLM_IFL_RESEND; in dlm_recover_waiters_post()
5235 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in dlm_recover_waiters_post()
5236 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in dlm_recover_waiters_post()
5237 lkb->lkb_wait_type = 0; in dlm_recover_waiters_post()
5241 while (lkb->lkb_wait_count) { in dlm_recover_waiters_post()
5242 lkb->lkb_wait_count--; in dlm_recover_waiters_post()
5243 unhold_lkb(lkb); in dlm_recover_waiters_post()
5246 list_del_init(&lkb->lkb_wait_reply); in dlm_recover_waiters_post()
5254 queue_cast(r, lkb, ou ? -DLM_EUNLOCK : in dlm_recover_waiters_post()
5256 unhold_lkb(lkb); /* undoes create_lkb() */ in dlm_recover_waiters_post()
5260 queue_cast(r, lkb, -DLM_ECANCEL); in dlm_recover_waiters_post()
5262 lkb->lkb_exflags |= DLM_LKF_FORCEUNLOCK; in dlm_recover_waiters_post()
5263 _unlock_lock(r, lkb); in dlm_recover_waiters_post()
5273 _request_lock(r, lkb); in dlm_recover_waiters_post()
5278 _convert_lock(r, lkb); in dlm_recover_waiters_post()
5288 lkb->lkb_id, mstype, r->res_nodeid, in dlm_recover_waiters_post()
5293 dlm_put_lkb(lkb); in dlm_recover_waiters_post()
5302 struct dlm_lkb *lkb, *safe; in purge_mstcpy_list() local
5304 list_for_each_entry_safe(lkb, safe, list, lkb_statequeue) { in purge_mstcpy_list()
5305 if (!is_master_copy(lkb)) in purge_mstcpy_list()
5311 if (lkb->lkb_recover_seq == ls->ls_recover_seq) in purge_mstcpy_list()
5314 del_lkb(r, lkb); in purge_mstcpy_list()
5317 if (!dlm_put_lkb(lkb)) in purge_mstcpy_list()
5335 struct dlm_lkb *lkb, *safe; in purge_dead_list() local
5337 list_for_each_entry_safe(lkb, safe, list, lkb_statequeue) { in purge_dead_list()
5338 if (!is_master_copy(lkb)) in purge_dead_list()
5341 if ((lkb->lkb_nodeid == nodeid_gone) || in purge_dead_list()
5342 dlm_is_removed(ls, lkb->lkb_nodeid)) { in purge_dead_list()
5346 if ((lkb->lkb_exflags & DLM_LKF_VALBLK) && in purge_dead_list()
5347 (lkb->lkb_grmode >= DLM_LOCK_PW)) { in purge_dead_list()
5351 del_lkb(r, lkb); in purge_dead_list()
5354 if (!dlm_put_lkb(lkb)) in purge_dead_list()
5485 struct dlm_lkb *lkb; in search_remid_list() local
5487 list_for_each_entry(lkb, head, lkb_statequeue) { in search_remid_list()
5488 if (lkb->lkb_nodeid == nodeid && lkb->lkb_remid == remid) in search_remid_list()
5489 return lkb; in search_remid_list()
5497 struct dlm_lkb *lkb; in search_remid() local
5499 lkb = search_remid_list(&r->res_grantqueue, nodeid, remid); in search_remid()
5500 if (lkb) in search_remid()
5501 return lkb; in search_remid()
5502 lkb = search_remid_list(&r->res_convertqueue, nodeid, remid); in search_remid()
5503 if (lkb) in search_remid()
5504 return lkb; in search_remid()
5505 lkb = search_remid_list(&r->res_waitqueue, nodeid, remid); in search_remid()
5506 if (lkb) in search_remid()
5507 return lkb; in search_remid()
5512 static int receive_rcom_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_rcom_lock_args() argument
5517 lkb->lkb_nodeid = le32_to_cpu(rc->rc_header.h_nodeid); in receive_rcom_lock_args()
5518 lkb->lkb_ownpid = le32_to_cpu(rl->rl_ownpid); in receive_rcom_lock_args()
5519 lkb->lkb_remid = le32_to_cpu(rl->rl_lkid); in receive_rcom_lock_args()
5520 lkb->lkb_exflags = le32_to_cpu(rl->rl_exflags); in receive_rcom_lock_args()
5521 lkb->lkb_flags = le32_to_cpu(rl->rl_flags) & 0x0000FFFF; in receive_rcom_lock_args()
5522 lkb->lkb_flags |= DLM_IFL_MSTCPY; in receive_rcom_lock_args()
5523 lkb->lkb_lvbseq = le32_to_cpu(rl->rl_lvbseq); in receive_rcom_lock_args()
5524 lkb->lkb_rqmode = rl->rl_rqmode; in receive_rcom_lock_args()
5525 lkb->lkb_grmode = rl->rl_grmode; in receive_rcom_lock_args()
5528 lkb->lkb_bastfn = (rl->rl_asts & DLM_CB_BAST) ? &fake_bastfn : NULL; in receive_rcom_lock_args()
5529 lkb->lkb_astfn = (rl->rl_asts & DLM_CB_CAST) ? &fake_astfn : NULL; in receive_rcom_lock_args()
5531 if (lkb->lkb_exflags & DLM_LKF_VALBLK) { in receive_rcom_lock_args()
5536 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_rcom_lock_args()
5537 if (!lkb->lkb_lvbptr) in receive_rcom_lock_args()
5539 memcpy(lkb->lkb_lvbptr, rl->rl_lvb, lvblen); in receive_rcom_lock_args()
5547 middle_conversion(lkb)) { in receive_rcom_lock_args()
5549 lkb->lkb_grmode = DLM_LOCK_IV; in receive_rcom_lock_args()
5567 struct dlm_lkb *lkb; in dlm_recover_master_copy() local
5601 lkb = search_remid(r, from_nodeid, remid); in dlm_recover_master_copy()
5602 if (lkb) { in dlm_recover_master_copy()
5607 error = create_lkb(ls, &lkb); in dlm_recover_master_copy()
5611 error = receive_rcom_lock_args(ls, lkb, r, rc); in dlm_recover_master_copy()
5613 __put_lkb(ls, lkb); in dlm_recover_master_copy()
5617 attach_lkb(r, lkb); in dlm_recover_master_copy()
5618 add_lkb(r, lkb, rl->rl_status); in dlm_recover_master_copy()
5627 rl->rl_remid = cpu_to_le32(lkb->lkb_id); in dlm_recover_master_copy()
5629 lkb->lkb_recover_seq = ls->ls_recover_seq; in dlm_recover_master_copy()
5647 struct dlm_lkb *lkb; in dlm_recover_process_copy() local
5655 error = find_lkb(ls, lkid, &lkb); in dlm_recover_process_copy()
5663 r = lkb->lkb_resource; in dlm_recover_process_copy()
5667 if (!is_process_copy(lkb)) { in dlm_recover_process_copy()
5674 dlm_put_lkb(lkb); in dlm_recover_process_copy()
5688 dlm_send_rcom_lock(r, lkb); in dlm_recover_process_copy()
5692 lkb->lkb_remid = remid; in dlm_recover_process_copy()
5706 dlm_put_lkb(lkb); in dlm_recover_process_copy()
5720 struct dlm_lkb *lkb; in dlm_user_request() local
5727 error = create_lkb(ls, &lkb); in dlm_user_request()
5733 trace_dlm_lock_start(ls, lkb, name, namelen, mode, flags); in dlm_user_request()
5760 lkb->lkb_flags |= DLM_IFL_USER; in dlm_user_request()
5761 error = request_lock(ls, lkb, name, namelen, &args); in dlm_user_request()
5778 hold_lkb(lkb); in dlm_user_request()
5779 list_add_tail(&lkb->lkb_ownqueue, &ua->proc->locks); in dlm_user_request()
5783 trace_dlm_lock_end(ls, lkb, name, namelen, mode, flags, error, false); in dlm_user_request()
5785 __put_lkb(ls, lkb); in dlm_user_request()
5800 struct dlm_lkb *lkb; in dlm_user_convert() local
5807 error = find_lkb(ls, lkid, &lkb); in dlm_user_convert()
5811 trace_dlm_lock_start(ls, lkb, NULL, 0, mode, flags); in dlm_user_convert()
5816 ua = lkb->lkb_ua; in dlm_user_convert()
5845 error = convert_lock(ls, lkb, &args); in dlm_user_convert()
5850 trace_dlm_lock_end(ls, lkb, NULL, 0, mode, flags, error, false); in dlm_user_convert()
5851 dlm_put_lkb(lkb); in dlm_user_convert()
5868 struct dlm_lkb *lkb = NULL, *iter; in dlm_user_adopt_orphan() local
5884 lkb = iter; in dlm_user_adopt_orphan()
5892 if (!lkb && found_other_mode) { in dlm_user_adopt_orphan()
5897 if (!lkb) { in dlm_user_adopt_orphan()
5902 lkb->lkb_exflags = flags; in dlm_user_adopt_orphan()
5903 lkb->lkb_ownpid = (int) current->pid; in dlm_user_adopt_orphan()
5905 ua = lkb->lkb_ua; in dlm_user_adopt_orphan()
5922 list_add_tail(&lkb->lkb_ownqueue, &ua->proc->locks); in dlm_user_adopt_orphan()
5932 struct dlm_lkb *lkb; in dlm_user_unlock() local
5939 error = find_lkb(ls, lkid, &lkb); in dlm_user_unlock()
5943 trace_dlm_unlock_start(ls, lkb, flags); in dlm_user_unlock()
5945 ua = lkb->lkb_ua; in dlm_user_unlock()
5957 error = unlock_lock(ls, lkb, &args); in dlm_user_unlock()
5969 if (!list_empty(&lkb->lkb_ownqueue)) in dlm_user_unlock()
5970 list_move(&lkb->lkb_ownqueue, &ua->proc->unlocking); in dlm_user_unlock()
5973 trace_dlm_unlock_end(ls, lkb, flags, error); in dlm_user_unlock()
5974 dlm_put_lkb(lkb); in dlm_user_unlock()
5984 struct dlm_lkb *lkb; in dlm_user_cancel() local
5991 error = find_lkb(ls, lkid, &lkb); in dlm_user_cancel()
5995 trace_dlm_unlock_start(ls, lkb, flags); in dlm_user_cancel()
5997 ua = lkb->lkb_ua; in dlm_user_cancel()
6006 error = cancel_lock(ls, lkb, &args); in dlm_user_cancel()
6014 trace_dlm_unlock_end(ls, lkb, flags, error); in dlm_user_cancel()
6015 dlm_put_lkb(lkb); in dlm_user_cancel()
6024 struct dlm_lkb *lkb; in dlm_user_deadlock() local
6032 error = find_lkb(ls, lkid, &lkb); in dlm_user_deadlock()
6036 trace_dlm_unlock_start(ls, lkb, flags); in dlm_user_deadlock()
6038 ua = lkb->lkb_ua; in dlm_user_deadlock()
6046 r = lkb->lkb_resource; in dlm_user_deadlock()
6050 error = validate_unlock_args(lkb, &args); in dlm_user_deadlock()
6053 lkb->lkb_flags |= DLM_IFL_DEADLOCK_CANCEL; in dlm_user_deadlock()
6055 error = _cancel_lock(r, lkb); in dlm_user_deadlock()
6066 trace_dlm_unlock_end(ls, lkb, flags, error); in dlm_user_deadlock()
6067 dlm_put_lkb(lkb); in dlm_user_deadlock()
6076 static int orphan_proc_lock(struct dlm_ls *ls, struct dlm_lkb *lkb) in orphan_proc_lock() argument
6081 hold_lkb(lkb); /* reference for the ls_orphans list */ in orphan_proc_lock()
6083 list_add_tail(&lkb->lkb_ownqueue, &ls->ls_orphans); in orphan_proc_lock()
6086 set_unlock_args(0, lkb->lkb_ua, &args); in orphan_proc_lock()
6088 error = cancel_lock(ls, lkb, &args); in orphan_proc_lock()
6099 static int unlock_proc_lock(struct dlm_ls *ls, struct dlm_lkb *lkb) in unlock_proc_lock() argument
6105 lkb->lkb_ua, &args); in unlock_proc_lock()
6107 error = unlock_lock(ls, lkb, &args); in unlock_proc_lock()
6120 struct dlm_lkb *lkb = NULL; in del_proc_lock() local
6126 lkb = list_entry(proc->locks.next, struct dlm_lkb, lkb_ownqueue); in del_proc_lock()
6127 list_del_init(&lkb->lkb_ownqueue); in del_proc_lock()
6129 if (lkb->lkb_exflags & DLM_LKF_PERSISTENT) in del_proc_lock()
6130 lkb->lkb_flags |= DLM_IFL_ORPHAN; in del_proc_lock()
6132 lkb->lkb_flags |= DLM_IFL_DEAD; in del_proc_lock()
6135 return lkb; in del_proc_lock()
6150 struct dlm_lkb *lkb, *safe; in dlm_clear_proc_locks() local
6155 lkb = del_proc_lock(ls, proc); in dlm_clear_proc_locks()
6156 if (!lkb) in dlm_clear_proc_locks()
6158 del_timeout(lkb); in dlm_clear_proc_locks()
6159 if (lkb->lkb_exflags & DLM_LKF_PERSISTENT) in dlm_clear_proc_locks()
6160 orphan_proc_lock(ls, lkb); in dlm_clear_proc_locks()
6162 unlock_proc_lock(ls, lkb); in dlm_clear_proc_locks()
6168 dlm_put_lkb(lkb); in dlm_clear_proc_locks()
6174 list_for_each_entry_safe(lkb, safe, &proc->unlocking, lkb_ownqueue) { in dlm_clear_proc_locks()
6175 list_del_init(&lkb->lkb_ownqueue); in dlm_clear_proc_locks()
6176 lkb->lkb_flags |= DLM_IFL_DEAD; in dlm_clear_proc_locks()
6177 dlm_put_lkb(lkb); in dlm_clear_proc_locks()
6180 list_for_each_entry_safe(lkb, safe, &proc->asts, lkb_cb_list) { in dlm_clear_proc_locks()
6181 dlm_purge_lkb_callbacks(lkb); in dlm_clear_proc_locks()
6182 list_del_init(&lkb->lkb_cb_list); in dlm_clear_proc_locks()
6183 dlm_put_lkb(lkb); in dlm_clear_proc_locks()
6192 struct dlm_lkb *lkb, *safe; in purge_proc_locks() local
6195 lkb = NULL; in purge_proc_locks()
6198 lkb = list_entry(proc->locks.next, struct dlm_lkb, in purge_proc_locks()
6200 list_del_init(&lkb->lkb_ownqueue); in purge_proc_locks()
6204 if (!lkb) in purge_proc_locks()
6207 lkb->lkb_flags |= DLM_IFL_DEAD; in purge_proc_locks()
6208 unlock_proc_lock(ls, lkb); in purge_proc_locks()
6209 dlm_put_lkb(lkb); /* ref from proc->locks list */ in purge_proc_locks()
6213 list_for_each_entry_safe(lkb, safe, &proc->unlocking, lkb_ownqueue) { in purge_proc_locks()
6214 list_del_init(&lkb->lkb_ownqueue); in purge_proc_locks()
6215 lkb->lkb_flags |= DLM_IFL_DEAD; in purge_proc_locks()
6216 dlm_put_lkb(lkb); in purge_proc_locks()
6221 list_for_each_entry_safe(lkb, safe, &proc->asts, lkb_cb_list) { in purge_proc_locks()
6222 dlm_purge_lkb_callbacks(lkb); in purge_proc_locks()
6223 list_del_init(&lkb->lkb_cb_list); in purge_proc_locks()
6224 dlm_put_lkb(lkb); in purge_proc_locks()
6233 struct dlm_lkb *lkb, *safe; in do_purge() local
6236 list_for_each_entry_safe(lkb, safe, &ls->ls_orphans, lkb_ownqueue) { in do_purge()
6237 if (pid && lkb->lkb_ownpid != pid) in do_purge()
6239 unlock_proc_lock(ls, lkb); in do_purge()
6240 list_del_init(&lkb->lkb_ownqueue); in do_purge()
6241 dlm_put_lkb(lkb); in do_purge()
6285 struct dlm_lkb *lkb; in dlm_debug_add_lkb() local
6297 error = _create_lkb(ls, &lkb, lkb_id, lkb_id + 1); in dlm_debug_add_lkb()
6303 lkb->lkb_flags = lkb_flags; in dlm_debug_add_lkb()
6304 lkb->lkb_nodeid = lkb_nodeid; in dlm_debug_add_lkb()
6305 lkb->lkb_lksb = lksb; in dlm_debug_add_lkb()
6308 lkb->lkb_astparam = (void *)0xDEADBEEF; in dlm_debug_add_lkb()
6313 __put_lkb(ls, lkb); in dlm_debug_add_lkb()
6318 attach_lkb(r, lkb); in dlm_debug_add_lkb()
6319 add_lkb(r, lkb, lkb_status); in dlm_debug_add_lkb()
6329 struct dlm_lkb *lkb; in dlm_debug_add_lkb_to_waiters() local
6332 error = find_lkb(ls, lkb_id, &lkb); in dlm_debug_add_lkb_to_waiters()
6336 error = add_to_waiters(lkb, mstype, to_nodeid); in dlm_debug_add_lkb_to_waiters()
6337 dlm_put_lkb(lkb); in dlm_debug_add_lkb_to_waiters()