• Home
  • Raw
  • Download

Lines Matching refs:lkb

76 static int send_request(struct dlm_rsb *r, struct dlm_lkb *lkb);
77 static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb);
78 static int send_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb);
79 static int send_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb);
80 static int send_grant(struct dlm_rsb *r, struct dlm_lkb *lkb);
81 static int send_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int mode);
82 static int send_lookup(struct dlm_rsb *r, struct dlm_lkb *lkb);
84 static int _request_lock(struct dlm_rsb *r, struct dlm_lkb *lkb);
85 static int _cancel_lock(struct dlm_rsb *r, struct dlm_lkb *lkb);
86 static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb,
90 static void del_timeout(struct dlm_lkb *lkb);
160 void dlm_print_lkb(struct dlm_lkb *lkb) in dlm_print_lkb() argument
164 lkb->lkb_nodeid, lkb->lkb_id, lkb->lkb_remid, lkb->lkb_exflags, in dlm_print_lkb()
165 lkb->lkb_flags, lkb->lkb_status, lkb->lkb_rqmode, in dlm_print_lkb()
166 lkb->lkb_grmode, lkb->lkb_wait_type, lkb->lkb_wait_nodeid, in dlm_print_lkb()
167 (unsigned long long)lkb->lkb_recover_seq); in dlm_print_lkb()
181 struct dlm_lkb *lkb; in dlm_dump_rsb() local
188 list_for_each_entry(lkb, &r->res_lookup, lkb_rsb_lookup) in dlm_dump_rsb()
189 dlm_print_lkb(lkb); in dlm_dump_rsb()
191 list_for_each_entry(lkb, &r->res_grantqueue, lkb_statequeue) in dlm_dump_rsb()
192 dlm_print_lkb(lkb); in dlm_dump_rsb()
194 list_for_each_entry(lkb, &r->res_convertqueue, lkb_statequeue) in dlm_dump_rsb()
195 dlm_print_lkb(lkb); in dlm_dump_rsb()
197 list_for_each_entry(lkb, &r->res_waitqueue, lkb_statequeue) in dlm_dump_rsb()
198 dlm_print_lkb(lkb); in dlm_dump_rsb()
218 static inline int can_be_queued(struct dlm_lkb *lkb) in can_be_queued() argument
220 return !(lkb->lkb_exflags & DLM_LKF_NOQUEUE); in can_be_queued()
223 static inline int force_blocking_asts(struct dlm_lkb *lkb) in force_blocking_asts() argument
225 return (lkb->lkb_exflags & DLM_LKF_NOQUEUEBAST); in force_blocking_asts()
228 static inline int is_demoted(struct dlm_lkb *lkb) in is_demoted() argument
230 return (lkb->lkb_sbflags & DLM_SBF_DEMOTED); in is_demoted()
233 static inline int is_altmode(struct dlm_lkb *lkb) in is_altmode() argument
235 return (lkb->lkb_sbflags & DLM_SBF_ALTMODE); in is_altmode()
238 static inline int is_granted(struct dlm_lkb *lkb) in is_granted() argument
240 return (lkb->lkb_status == DLM_LKSTS_GRANTED); in is_granted()
249 static inline int is_process_copy(struct dlm_lkb *lkb) in is_process_copy() argument
251 return (lkb->lkb_nodeid && !(lkb->lkb_flags & DLM_IFL_MSTCPY)); in is_process_copy()
254 static inline int is_master_copy(struct dlm_lkb *lkb) in is_master_copy() argument
256 return (lkb->lkb_flags & DLM_IFL_MSTCPY) ? 1 : 0; in is_master_copy()
259 static inline int middle_conversion(struct dlm_lkb *lkb) in middle_conversion() argument
261 if ((lkb->lkb_grmode==DLM_LOCK_PR && lkb->lkb_rqmode==DLM_LOCK_CW) || in middle_conversion()
262 (lkb->lkb_rqmode==DLM_LOCK_PR && lkb->lkb_grmode==DLM_LOCK_CW)) in middle_conversion()
267 static inline int down_conversion(struct dlm_lkb *lkb) in down_conversion() argument
269 return (!middle_conversion(lkb) && lkb->lkb_rqmode < lkb->lkb_grmode); in down_conversion()
272 static inline int is_overlap_unlock(struct dlm_lkb *lkb) in is_overlap_unlock() argument
274 return lkb->lkb_flags & DLM_IFL_OVERLAP_UNLOCK; in is_overlap_unlock()
277 static inline int is_overlap_cancel(struct dlm_lkb *lkb) in is_overlap_cancel() argument
279 return lkb->lkb_flags & DLM_IFL_OVERLAP_CANCEL; in is_overlap_cancel()
282 static inline int is_overlap(struct dlm_lkb *lkb) in is_overlap() argument
284 return (lkb->lkb_flags & (DLM_IFL_OVERLAP_UNLOCK | in is_overlap()
288 static void queue_cast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in queue_cast() argument
290 if (is_master_copy(lkb)) in queue_cast()
293 del_timeout(lkb); in queue_cast()
295 DLM_ASSERT(lkb->lkb_lksb, dlm_print_lkb(lkb);); in queue_cast()
299 if (rv == -DLM_ECANCEL && (lkb->lkb_flags & DLM_IFL_TIMEOUT_CANCEL)) { in queue_cast()
300 lkb->lkb_flags &= ~DLM_IFL_TIMEOUT_CANCEL; in queue_cast()
304 if (rv == -DLM_ECANCEL && (lkb->lkb_flags & DLM_IFL_DEADLOCK_CANCEL)) { in queue_cast()
305 lkb->lkb_flags &= ~DLM_IFL_DEADLOCK_CANCEL; in queue_cast()
309 dlm_add_cb(lkb, DLM_CB_CAST, lkb->lkb_grmode, rv, lkb->lkb_sbflags); in queue_cast()
312 static inline void queue_cast_overlap(struct dlm_rsb *r, struct dlm_lkb *lkb) in queue_cast_overlap() argument
314 queue_cast(r, lkb, in queue_cast_overlap()
315 is_overlap_unlock(lkb) ? -DLM_EUNLOCK : -DLM_ECANCEL); in queue_cast_overlap()
318 static void queue_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int rqmode) in queue_bast() argument
320 if (is_master_copy(lkb)) { in queue_bast()
321 send_bast(r, lkb, rqmode); in queue_bast()
323 dlm_add_cb(lkb, DLM_CB_BAST, rqmode, 0, 0); in queue_bast()
1167 static void attach_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb) in attach_lkb() argument
1170 lkb->lkb_resource = r; in attach_lkb()
1173 static void detach_lkb(struct dlm_lkb *lkb) in detach_lkb() argument
1175 if (lkb->lkb_resource) { in detach_lkb()
1176 put_rsb(lkb->lkb_resource); in detach_lkb()
1177 lkb->lkb_resource = NULL; in detach_lkb()
1183 struct dlm_lkb *lkb; in create_lkb() local
1186 lkb = dlm_allocate_lkb(ls); in create_lkb()
1187 if (!lkb) in create_lkb()
1190 lkb->lkb_nodeid = -1; in create_lkb()
1191 lkb->lkb_grmode = DLM_LOCK_IV; in create_lkb()
1192 kref_init(&lkb->lkb_ref); in create_lkb()
1193 INIT_LIST_HEAD(&lkb->lkb_ownqueue); in create_lkb()
1194 INIT_LIST_HEAD(&lkb->lkb_rsb_lookup); in create_lkb()
1195 INIT_LIST_HEAD(&lkb->lkb_time_list); in create_lkb()
1196 INIT_LIST_HEAD(&lkb->lkb_cb_list); in create_lkb()
1197 mutex_init(&lkb->lkb_cb_mutex); in create_lkb()
1198 INIT_WORK(&lkb->lkb_cb_work, dlm_callback_work); in create_lkb()
1202 rv = idr_alloc(&ls->ls_lkbidr, lkb, 1, 0, GFP_NOWAIT); in create_lkb()
1204 lkb->lkb_id = rv; in create_lkb()
1210 dlm_free_lkb(lkb); in create_lkb()
1214 *lkb_ret = lkb; in create_lkb()
1220 struct dlm_lkb *lkb; in find_lkb() local
1223 lkb = idr_find(&ls->ls_lkbidr, lkid); in find_lkb()
1224 if (lkb) in find_lkb()
1225 kref_get(&lkb->lkb_ref); in find_lkb()
1228 *lkb_ret = lkb; in find_lkb()
1229 return lkb ? 0 : -ENOENT; in find_lkb()
1234 struct dlm_lkb *lkb = container_of(kref, struct dlm_lkb, lkb_ref); in kill_lkb() local
1239 DLM_ASSERT(!lkb->lkb_status, dlm_print_lkb(lkb);); in kill_lkb()
1245 static int __put_lkb(struct dlm_ls *ls, struct dlm_lkb *lkb) in __put_lkb() argument
1247 uint32_t lkid = lkb->lkb_id; in __put_lkb()
1250 if (kref_put(&lkb->lkb_ref, kill_lkb)) { in __put_lkb()
1254 detach_lkb(lkb); in __put_lkb()
1257 if (lkb->lkb_lvbptr && is_master_copy(lkb)) in __put_lkb()
1258 dlm_free_lvb(lkb->lkb_lvbptr); in __put_lkb()
1259 dlm_free_lkb(lkb); in __put_lkb()
1267 int dlm_put_lkb(struct dlm_lkb *lkb) in dlm_put_lkb() argument
1271 DLM_ASSERT(lkb->lkb_resource, dlm_print_lkb(lkb);); in dlm_put_lkb()
1272 DLM_ASSERT(lkb->lkb_resource->res_ls, dlm_print_lkb(lkb);); in dlm_put_lkb()
1274 ls = lkb->lkb_resource->res_ls; in dlm_put_lkb()
1275 return __put_lkb(ls, lkb); in dlm_put_lkb()
1281 static inline void hold_lkb(struct dlm_lkb *lkb) in hold_lkb() argument
1283 kref_get(&lkb->lkb_ref); in hold_lkb()
1291 static inline void unhold_lkb(struct dlm_lkb *lkb) in unhold_lkb() argument
1294 rv = kref_put(&lkb->lkb_ref, kill_lkb); in unhold_lkb()
1295 DLM_ASSERT(!rv, dlm_print_lkb(lkb);); in unhold_lkb()
1301 struct dlm_lkb *lkb = NULL; in lkb_add_ordered() local
1303 list_for_each_entry(lkb, head, lkb_statequeue) in lkb_add_ordered()
1304 if (lkb->lkb_rqmode < mode) in lkb_add_ordered()
1307 __list_add(new, lkb->lkb_statequeue.prev, &lkb->lkb_statequeue); in lkb_add_ordered()
1312 static void add_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int status) in add_lkb() argument
1314 kref_get(&lkb->lkb_ref); in add_lkb()
1316 DLM_ASSERT(!lkb->lkb_status, dlm_print_lkb(lkb);); in add_lkb()
1318 lkb->lkb_timestamp = ktime_get(); in add_lkb()
1320 lkb->lkb_status = status; in add_lkb()
1324 if (lkb->lkb_exflags & DLM_LKF_HEADQUE) in add_lkb()
1325 list_add(&lkb->lkb_statequeue, &r->res_waitqueue); in add_lkb()
1327 list_add_tail(&lkb->lkb_statequeue, &r->res_waitqueue); in add_lkb()
1331 lkb_add_ordered(&lkb->lkb_statequeue, &r->res_grantqueue, in add_lkb()
1332 lkb->lkb_grmode); in add_lkb()
1335 if (lkb->lkb_exflags & DLM_LKF_HEADQUE) in add_lkb()
1336 list_add(&lkb->lkb_statequeue, &r->res_convertqueue); in add_lkb()
1338 list_add_tail(&lkb->lkb_statequeue, in add_lkb()
1342 DLM_ASSERT(0, dlm_print_lkb(lkb); printk("sts=%d\n", status);); in add_lkb()
1346 static void del_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb) in del_lkb() argument
1348 lkb->lkb_status = 0; in del_lkb()
1349 list_del(&lkb->lkb_statequeue); in del_lkb()
1350 unhold_lkb(lkb); in del_lkb()
1353 static void move_lkb(struct dlm_rsb *r, struct dlm_lkb *lkb, int sts) in move_lkb() argument
1355 hold_lkb(lkb); in move_lkb()
1356 del_lkb(r, lkb); in move_lkb()
1357 add_lkb(r, lkb, sts); in move_lkb()
1358 unhold_lkb(lkb); in move_lkb()
1395 struct dlm_lkb *lkb; in dlm_scan_waiters() local
1408 list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) { in dlm_scan_waiters()
1409 if (!lkb->lkb_wait_time) in dlm_scan_waiters()
1414 us = ktime_to_us(ktime_sub(ktime_get(), lkb->lkb_wait_time)); in dlm_scan_waiters()
1419 lkb->lkb_wait_time = 0; in dlm_scan_waiters()
1431 if (nodeid_warned(lkb->lkb_wait_nodeid, num_nodes, warned)) in dlm_scan_waiters()
1435 "node %d", lkb->lkb_id, (long long)us, in dlm_scan_waiters()
1436 dlm_config.ci_waitwarn_us, lkb->lkb_wait_nodeid); in dlm_scan_waiters()
1450 static int add_to_waiters(struct dlm_lkb *lkb, int mstype, int to_nodeid) in add_to_waiters() argument
1452 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in add_to_waiters()
1457 if (is_overlap_unlock(lkb) || in add_to_waiters()
1458 (is_overlap_cancel(lkb) && (mstype == DLM_MSG_CANCEL))) { in add_to_waiters()
1463 if (lkb->lkb_wait_type || is_overlap_cancel(lkb)) { in add_to_waiters()
1466 lkb->lkb_flags |= DLM_IFL_OVERLAP_UNLOCK; in add_to_waiters()
1469 lkb->lkb_flags |= DLM_IFL_OVERLAP_CANCEL; in add_to_waiters()
1475 lkb->lkb_wait_count++; in add_to_waiters()
1476 hold_lkb(lkb); in add_to_waiters()
1479 lkb->lkb_id, lkb->lkb_wait_type, mstype, in add_to_waiters()
1480 lkb->lkb_wait_count, lkb->lkb_flags); in add_to_waiters()
1484 DLM_ASSERT(!lkb->lkb_wait_count, in add_to_waiters()
1485 dlm_print_lkb(lkb); in add_to_waiters()
1486 printk("wait_count %d\n", lkb->lkb_wait_count);); in add_to_waiters()
1488 lkb->lkb_wait_count++; in add_to_waiters()
1489 lkb->lkb_wait_type = mstype; in add_to_waiters()
1490 lkb->lkb_wait_time = ktime_get(); in add_to_waiters()
1491 lkb->lkb_wait_nodeid = to_nodeid; /* for debugging */ in add_to_waiters()
1492 hold_lkb(lkb); in add_to_waiters()
1493 list_add(&lkb->lkb_wait_reply, &ls->ls_waiters); in add_to_waiters()
1497 lkb->lkb_id, error, lkb->lkb_flags, mstype, in add_to_waiters()
1498 lkb->lkb_wait_type, lkb->lkb_resource->res_name); in add_to_waiters()
1508 static int _remove_from_waiters(struct dlm_lkb *lkb, int mstype, in _remove_from_waiters() argument
1511 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in _remove_from_waiters()
1514 if (is_overlap_unlock(lkb) && (mstype == DLM_MSG_UNLOCK_REPLY)) { in _remove_from_waiters()
1515 log_debug(ls, "remwait %x unlock_reply overlap", lkb->lkb_id); in _remove_from_waiters()
1516 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in _remove_from_waiters()
1521 if (is_overlap_cancel(lkb) && (mstype == DLM_MSG_CANCEL_REPLY)) { in _remove_from_waiters()
1522 log_debug(ls, "remwait %x cancel_reply overlap", lkb->lkb_id); in _remove_from_waiters()
1523 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in _remove_from_waiters()
1532 (lkb->lkb_wait_type != DLM_MSG_CANCEL)) { in _remove_from_waiters()
1534 lkb->lkb_id, lkb->lkb_wait_type); in _remove_from_waiters()
1547 (lkb->lkb_wait_type == DLM_MSG_CONVERT) && in _remove_from_waiters()
1548 is_overlap_cancel(lkb) && ms && !ms->m_result) { in _remove_from_waiters()
1550 lkb->lkb_id); in _remove_from_waiters()
1551 lkb->lkb_wait_type = 0; in _remove_from_waiters()
1552 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in _remove_from_waiters()
1553 lkb->lkb_wait_count--; in _remove_from_waiters()
1554 unhold_lkb(lkb); in _remove_from_waiters()
1561 if (lkb->lkb_wait_type) { in _remove_from_waiters()
1562 lkb->lkb_wait_type = 0; in _remove_from_waiters()
1567 lkb->lkb_id, ms ? ms->m_header.h_nodeid : 0, lkb->lkb_remid, in _remove_from_waiters()
1568 mstype, lkb->lkb_flags); in _remove_from_waiters()
1577 if (overlap_done && lkb->lkb_wait_type) { in _remove_from_waiters()
1579 lkb->lkb_id, mstype, lkb->lkb_wait_type); in _remove_from_waiters()
1580 lkb->lkb_wait_count--; in _remove_from_waiters()
1581 unhold_lkb(lkb); in _remove_from_waiters()
1582 lkb->lkb_wait_type = 0; in _remove_from_waiters()
1585 DLM_ASSERT(lkb->lkb_wait_count, dlm_print_lkb(lkb);); in _remove_from_waiters()
1587 lkb->lkb_flags &= ~DLM_IFL_RESEND; in _remove_from_waiters()
1588 lkb->lkb_wait_count--; in _remove_from_waiters()
1589 if (!lkb->lkb_wait_count) in _remove_from_waiters()
1590 list_del_init(&lkb->lkb_wait_reply); in _remove_from_waiters()
1591 unhold_lkb(lkb); in _remove_from_waiters()
1595 static int remove_from_waiters(struct dlm_lkb *lkb, int mstype) in remove_from_waiters() argument
1597 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in remove_from_waiters()
1601 error = _remove_from_waiters(lkb, mstype, NULL); in remove_from_waiters()
1609 static int remove_from_waiters_ms(struct dlm_lkb *lkb, struct dlm_message *ms) in remove_from_waiters_ms() argument
1611 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in remove_from_waiters_ms()
1616 error = _remove_from_waiters(lkb, ms->m_type, ms); in remove_from_waiters_ms()
1814 static void add_timeout(struct dlm_lkb *lkb) in add_timeout() argument
1816 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in add_timeout()
1818 if (is_master_copy(lkb)) in add_timeout()
1822 !(lkb->lkb_exflags & DLM_LKF_NODLCKWT)) { in add_timeout()
1823 lkb->lkb_flags |= DLM_IFL_WATCH_TIMEWARN; in add_timeout()
1826 if (lkb->lkb_exflags & DLM_LKF_TIMEOUT) in add_timeout()
1831 DLM_ASSERT(list_empty(&lkb->lkb_time_list), dlm_print_lkb(lkb);); in add_timeout()
1833 hold_lkb(lkb); in add_timeout()
1834 list_add_tail(&lkb->lkb_time_list, &ls->ls_timeout); in add_timeout()
1838 static void del_timeout(struct dlm_lkb *lkb) in del_timeout() argument
1840 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in del_timeout()
1843 if (!list_empty(&lkb->lkb_time_list)) { in del_timeout()
1844 list_del_init(&lkb->lkb_time_list); in del_timeout()
1845 unhold_lkb(lkb); in del_timeout()
1859 struct dlm_lkb *lkb; in dlm_scan_timeout() local
1870 list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) { in dlm_scan_timeout()
1873 lkb->lkb_timestamp)); in dlm_scan_timeout()
1875 if ((lkb->lkb_exflags & DLM_LKF_TIMEOUT) && in dlm_scan_timeout()
1876 wait_us >= (lkb->lkb_timeout_cs * 10000)) in dlm_scan_timeout()
1879 if ((lkb->lkb_flags & DLM_IFL_WATCH_TIMEWARN) && in dlm_scan_timeout()
1885 hold_lkb(lkb); in dlm_scan_timeout()
1893 r = lkb->lkb_resource; in dlm_scan_timeout()
1899 lkb->lkb_flags &= ~DLM_IFL_WATCH_TIMEWARN; in dlm_scan_timeout()
1900 if (!(lkb->lkb_exflags & DLM_LKF_TIMEOUT)) in dlm_scan_timeout()
1901 del_timeout(lkb); in dlm_scan_timeout()
1902 dlm_timeout_warn(lkb); in dlm_scan_timeout()
1907 lkb->lkb_id, lkb->lkb_nodeid, r->res_name); in dlm_scan_timeout()
1908 lkb->lkb_flags &= ~DLM_IFL_WATCH_TIMEWARN; in dlm_scan_timeout()
1909 lkb->lkb_flags |= DLM_IFL_TIMEOUT_CANCEL; in dlm_scan_timeout()
1910 del_timeout(lkb); in dlm_scan_timeout()
1911 _cancel_lock(r, lkb); in dlm_scan_timeout()
1916 dlm_put_lkb(lkb); in dlm_scan_timeout()
1925 struct dlm_lkb *lkb; in dlm_adjust_timeouts() local
1930 list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) in dlm_adjust_timeouts()
1931 lkb->lkb_timestamp = ktime_add_us(lkb->lkb_timestamp, adj_us); in dlm_adjust_timeouts()
1938 list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) { in dlm_adjust_timeouts()
1939 if (ktime_to_us(lkb->lkb_wait_time)) in dlm_adjust_timeouts()
1940 lkb->lkb_wait_time = ktime_get(); in dlm_adjust_timeouts()
1947 static void set_lvb_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_lvb_lock() argument
1955 b = dlm_lvb_operations[lkb->lkb_grmode + 1][lkb->lkb_rqmode + 1]; in set_lvb_lock()
1958 if (!lkb->lkb_lvbptr) in set_lvb_lock()
1961 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK)) in set_lvb_lock()
1967 memcpy(lkb->lkb_lvbptr, r->res_lvbptr, len); in set_lvb_lock()
1968 lkb->lkb_lvbseq = r->res_lvbseq; in set_lvb_lock()
1971 if (lkb->lkb_exflags & DLM_LKF_IVVALBLK) { in set_lvb_lock()
1976 if (!lkb->lkb_lvbptr) in set_lvb_lock()
1979 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK)) in set_lvb_lock()
1988 memcpy(r->res_lvbptr, lkb->lkb_lvbptr, len); in set_lvb_lock()
1990 lkb->lkb_lvbseq = r->res_lvbseq; in set_lvb_lock()
1995 lkb->lkb_sbflags |= DLM_SBF_VALNOTVALID; in set_lvb_lock()
1998 static void set_lvb_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_lvb_unlock() argument
2000 if (lkb->lkb_grmode < DLM_LOCK_PW) in set_lvb_unlock()
2003 if (lkb->lkb_exflags & DLM_LKF_IVVALBLK) { in set_lvb_unlock()
2008 if (!lkb->lkb_lvbptr) in set_lvb_unlock()
2011 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK)) in set_lvb_unlock()
2020 memcpy(r->res_lvbptr, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); in set_lvb_unlock()
2027 static void set_lvb_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb, in set_lvb_lock_pc() argument
2032 if (!lkb->lkb_lvbptr) in set_lvb_lock_pc()
2035 if (!(lkb->lkb_exflags & DLM_LKF_VALBLK)) in set_lvb_lock_pc()
2038 b = dlm_lvb_operations[lkb->lkb_grmode + 1][lkb->lkb_rqmode + 1]; in set_lvb_lock_pc()
2043 memcpy(lkb->lkb_lvbptr, ms->m_extra, len); in set_lvb_lock_pc()
2044 lkb->lkb_lvbseq = ms->m_lvbseq; in set_lvb_lock_pc()
2058 static void _remove_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _remove_lock() argument
2060 del_lkb(r, lkb); in _remove_lock()
2061 lkb->lkb_grmode = DLM_LOCK_IV; in _remove_lock()
2064 unhold_lkb(lkb); in _remove_lock()
2067 static void remove_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in remove_lock() argument
2069 set_lvb_unlock(r, lkb); in remove_lock()
2070 _remove_lock(r, lkb); in remove_lock()
2073 static void remove_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb) in remove_lock_pc() argument
2075 _remove_lock(r, lkb); in remove_lock_pc()
2082 static int revert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in revert_lock() argument
2086 lkb->lkb_rqmode = DLM_LOCK_IV; in revert_lock()
2088 switch (lkb->lkb_status) { in revert_lock()
2092 move_lkb(r, lkb, DLM_LKSTS_GRANTED); in revert_lock()
2096 del_lkb(r, lkb); in revert_lock()
2097 lkb->lkb_grmode = DLM_LOCK_IV; in revert_lock()
2100 unhold_lkb(lkb); in revert_lock()
2104 log_print("invalid status for revert %d", lkb->lkb_status); in revert_lock()
2109 static int revert_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb) in revert_lock_pc() argument
2111 return revert_lock(r, lkb); in revert_lock_pc()
2114 static void _grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _grant_lock() argument
2116 if (lkb->lkb_grmode != lkb->lkb_rqmode) { in _grant_lock()
2117 lkb->lkb_grmode = lkb->lkb_rqmode; in _grant_lock()
2118 if (lkb->lkb_status) in _grant_lock()
2119 move_lkb(r, lkb, DLM_LKSTS_GRANTED); in _grant_lock()
2121 add_lkb(r, lkb, DLM_LKSTS_GRANTED); in _grant_lock()
2124 lkb->lkb_rqmode = DLM_LOCK_IV; in _grant_lock()
2125 lkb->lkb_highbast = 0; in _grant_lock()
2128 static void grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in grant_lock() argument
2130 set_lvb_lock(r, lkb); in grant_lock()
2131 _grant_lock(r, lkb); in grant_lock()
2134 static void grant_lock_pc(struct dlm_rsb *r, struct dlm_lkb *lkb, in grant_lock_pc() argument
2137 set_lvb_lock_pc(r, lkb, ms); in grant_lock_pc()
2138 _grant_lock(r, lkb); in grant_lock_pc()
2145 static void grant_lock_pending(struct dlm_rsb *r, struct dlm_lkb *lkb) in grant_lock_pending() argument
2147 grant_lock(r, lkb); in grant_lock_pending()
2148 if (is_master_copy(lkb)) in grant_lock_pending()
2149 send_grant(r, lkb); in grant_lock_pending()
2151 queue_cast(r, lkb, 0); in grant_lock_pending()
2162 static void munge_demoted(struct dlm_lkb *lkb) in munge_demoted() argument
2164 if (lkb->lkb_rqmode == DLM_LOCK_IV || lkb->lkb_grmode == DLM_LOCK_IV) { in munge_demoted()
2166 lkb->lkb_id, lkb->lkb_grmode, lkb->lkb_rqmode); in munge_demoted()
2170 lkb->lkb_grmode = DLM_LOCK_NL; in munge_demoted()
2173 static void munge_altmode(struct dlm_lkb *lkb, struct dlm_message *ms) in munge_altmode() argument
2178 lkb->lkb_id, ms->m_type); in munge_altmode()
2182 if (lkb->lkb_exflags & DLM_LKF_ALTPR) in munge_altmode()
2183 lkb->lkb_rqmode = DLM_LOCK_PR; in munge_altmode()
2184 else if (lkb->lkb_exflags & DLM_LKF_ALTCW) in munge_altmode()
2185 lkb->lkb_rqmode = DLM_LOCK_CW; in munge_altmode()
2187 log_print("munge_altmode invalid exflags %x", lkb->lkb_exflags); in munge_altmode()
2188 dlm_print_lkb(lkb); in munge_altmode()
2192 static inline int first_in_list(struct dlm_lkb *lkb, struct list_head *head) in first_in_list() argument
2196 if (lkb->lkb_id == first->lkb_id) in first_in_list()
2204 static int queue_conflict(struct list_head *head, struct dlm_lkb *lkb) in queue_conflict() argument
2209 if (this == lkb) in queue_conflict()
2211 if (!modes_compat(this, lkb)) in queue_conflict()
2297 static int _can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now, in _can_be_granted() argument
2300 int8_t conv = (lkb->lkb_grmode != DLM_LOCK_IV); in _can_be_granted()
2321 if (lkb->lkb_exflags & DLM_LKF_EXPEDITE) in _can_be_granted()
2329 if (queue_conflict(&r->res_grantqueue, lkb)) in _can_be_granted()
2338 if (queue_conflict(&r->res_convertqueue, lkb)) in _can_be_granted()
2381 if (now && conv && !(lkb->lkb_exflags & DLM_LKF_QUECVT)) in _can_be_granted()
2389 if (now && conv && (lkb->lkb_exflags & DLM_LKF_QUECVT)) { in _can_be_granted()
2401 if (lkb->lkb_exflags & DLM_LKF_NOORDER) in _can_be_granted()
2410 if (!now && conv && first_in_list(lkb, &r->res_convertqueue)) in _can_be_granted()
2437 first_in_list(lkb, &r->res_waitqueue)) in _can_be_granted()
2443 static int can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now, in can_be_granted() argument
2447 int8_t alt = 0, rqmode = lkb->lkb_rqmode; in can_be_granted()
2448 int8_t is_convert = (lkb->lkb_grmode != DLM_LOCK_IV); in can_be_granted()
2453 rv = _can_be_granted(r, lkb, now, recover); in can_be_granted()
2463 if (is_convert && can_be_queued(lkb) && in can_be_granted()
2464 conversion_deadlock_detect(r, lkb)) { in can_be_granted()
2465 if (lkb->lkb_exflags & DLM_LKF_CONVDEADLK) { in can_be_granted()
2466 lkb->lkb_grmode = DLM_LOCK_NL; in can_be_granted()
2467 lkb->lkb_sbflags |= DLM_SBF_DEMOTED; in can_be_granted()
2472 lkb->lkb_id, now); in can_be_granted()
2485 if (rqmode != DLM_LOCK_PR && (lkb->lkb_exflags & DLM_LKF_ALTPR)) in can_be_granted()
2487 else if (rqmode != DLM_LOCK_CW && (lkb->lkb_exflags & DLM_LKF_ALTCW)) in can_be_granted()
2491 lkb->lkb_rqmode = alt; in can_be_granted()
2492 rv = _can_be_granted(r, lkb, now, 0); in can_be_granted()
2494 lkb->lkb_sbflags |= DLM_SBF_ALTMODE; in can_be_granted()
2496 lkb->lkb_rqmode = rqmode; in can_be_granted()
2508 struct dlm_lkb *lkb, *s; in grant_pending_convert() local
2519 list_for_each_entry_safe(lkb, s, &r->res_convertqueue, lkb_statequeue) { in grant_pending_convert()
2520 demoted = is_demoted(lkb); in grant_pending_convert()
2523 if (can_be_granted(r, lkb, 0, recover, &deadlk)) { in grant_pending_convert()
2524 grant_lock_pending(r, lkb); in grant_pending_convert()
2531 if (!demoted && is_demoted(lkb)) { in grant_pending_convert()
2533 lkb->lkb_id, lkb->lkb_nodeid, r->res_name); in grant_pending_convert()
2544 if (lkb->lkb_exflags & DLM_LKF_NODLCKWT) { in grant_pending_convert()
2545 if (lkb->lkb_highbast < lkb->lkb_rqmode) { in grant_pending_convert()
2546 queue_bast(r, lkb, lkb->lkb_rqmode); in grant_pending_convert()
2547 lkb->lkb_highbast = lkb->lkb_rqmode; in grant_pending_convert()
2551 lkb->lkb_id, lkb->lkb_nodeid, in grant_pending_convert()
2558 hi = max_t(int, lkb->lkb_rqmode, hi); in grant_pending_convert()
2560 if (cw && lkb->lkb_rqmode == DLM_LOCK_CW) in grant_pending_convert()
2577 struct dlm_lkb *lkb, *s; in grant_pending_wait() local
2579 list_for_each_entry_safe(lkb, s, &r->res_waitqueue, lkb_statequeue) { in grant_pending_wait()
2580 if (can_be_granted(r, lkb, 0, 0, NULL)) { in grant_pending_wait()
2581 grant_lock_pending(r, lkb); in grant_pending_wait()
2585 high = max_t(int, lkb->lkb_rqmode, high); in grant_pending_wait()
2586 if (lkb->lkb_rqmode == DLM_LOCK_CW) in grant_pending_wait()
2615 struct dlm_lkb *lkb, *s; in grant_pending_locks() local
2637 list_for_each_entry_safe(lkb, s, &r->res_grantqueue, lkb_statequeue) { in grant_pending_locks()
2638 if (lkb->lkb_bastfn && lock_requires_bast(lkb, high, cw)) { in grant_pending_locks()
2640 lkb->lkb_grmode == DLM_LOCK_PR) in grant_pending_locks()
2641 queue_bast(r, lkb, DLM_LOCK_CW); in grant_pending_locks()
2643 queue_bast(r, lkb, high); in grant_pending_locks()
2644 lkb->lkb_highbast = high; in grant_pending_locks()
2664 struct dlm_lkb *lkb) in send_bast_queue() argument
2670 if (gr == lkb) in send_bast_queue()
2672 if (gr->lkb_bastfn && modes_require_bast(gr, lkb)) { in send_bast_queue()
2673 queue_bast(r, gr, lkb->lkb_rqmode); in send_bast_queue()
2674 gr->lkb_highbast = lkb->lkb_rqmode; in send_bast_queue()
2679 static void send_blocking_asts(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_blocking_asts() argument
2681 send_bast_queue(r, &r->res_grantqueue, lkb); in send_blocking_asts()
2684 static void send_blocking_asts_all(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_blocking_asts_all() argument
2686 send_bast_queue(r, &r->res_grantqueue, lkb); in send_blocking_asts_all()
2687 send_bast_queue(r, &r->res_convertqueue, lkb); in send_blocking_asts_all()
2709 static int set_master(struct dlm_rsb *r, struct dlm_lkb *lkb) in set_master() argument
2715 r->res_first_lkid = lkb->lkb_id; in set_master()
2716 lkb->lkb_nodeid = r->res_nodeid; in set_master()
2720 if (r->res_first_lkid && r->res_first_lkid != lkb->lkb_id) { in set_master()
2721 list_add_tail(&lkb->lkb_rsb_lookup, &r->res_lookup); in set_master()
2726 lkb->lkb_nodeid = 0; in set_master()
2731 lkb->lkb_nodeid = r->res_master_nodeid; in set_master()
2743 lkb->lkb_id, r->res_master_nodeid, r->res_dir_nodeid, in set_master()
2747 lkb->lkb_nodeid = 0; in set_master()
2753 r->res_first_lkid = lkb->lkb_id; in set_master()
2754 send_lookup(r, lkb); in set_master()
2760 struct dlm_lkb *lkb, *safe; in process_lookup_list() local
2762 list_for_each_entry_safe(lkb, safe, &r->res_lookup, lkb_rsb_lookup) { in process_lookup_list()
2763 list_del_init(&lkb->lkb_rsb_lookup); in process_lookup_list()
2764 _request_lock(r, lkb); in process_lookup_list()
2773 struct dlm_lkb *lkb; in confirm_master() local
2795 lkb = list_entry(r->res_lookup.next, struct dlm_lkb, in confirm_master()
2797 list_del_init(&lkb->lkb_rsb_lookup); in confirm_master()
2798 r->res_first_lkid = lkb->lkb_id; in confirm_master()
2799 _request_lock(r, lkb); in confirm_master()
2888 static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in validate_lock_args() argument
2894 if (lkb->lkb_status != DLM_LKSTS_GRANTED) in validate_lock_args()
2897 if (lkb->lkb_wait_type) in validate_lock_args()
2900 if (is_overlap(lkb)) in validate_lock_args()
2904 if (lkb->lkb_flags & DLM_IFL_MSTCPY) in validate_lock_args()
2908 !__quecvt_compat_matrix[lkb->lkb_grmode+1][args->mode+1]) in validate_lock_args()
2912 lkb->lkb_exflags = args->flags; in validate_lock_args()
2913 lkb->lkb_sbflags = 0; in validate_lock_args()
2914 lkb->lkb_astfn = args->astfn; in validate_lock_args()
2915 lkb->lkb_astparam = args->astparam; in validate_lock_args()
2916 lkb->lkb_bastfn = args->bastfn; in validate_lock_args()
2917 lkb->lkb_rqmode = args->mode; in validate_lock_args()
2918 lkb->lkb_lksb = args->lksb; in validate_lock_args()
2919 lkb->lkb_lvbptr = args->lksb->sb_lvbptr; in validate_lock_args()
2920 lkb->lkb_ownpid = (int) current->pid; in validate_lock_args()
2921 lkb->lkb_timeout_cs = args->timeout; in validate_lock_args()
2926 rv, lkb->lkb_id, lkb->lkb_flags, args->flags, in validate_lock_args()
2927 lkb->lkb_status, lkb->lkb_wait_type, in validate_lock_args()
2928 lkb->lkb_resource->res_name); in validate_lock_args()
2939 static int validate_unlock_args(struct dlm_lkb *lkb, struct dlm_args *args) in validate_unlock_args() argument
2941 struct dlm_ls *ls = lkb->lkb_resource->res_ls; in validate_unlock_args()
2944 if (lkb->lkb_flags & DLM_IFL_MSTCPY) { in validate_unlock_args()
2945 log_error(ls, "unlock on MSTCPY %x", lkb->lkb_id); in validate_unlock_args()
2946 dlm_print_lkb(lkb); in validate_unlock_args()
2954 if (lkb->lkb_flags & DLM_IFL_ENDOFLIFE) { in validate_unlock_args()
2955 log_debug(ls, "unlock on ENDOFLIFE %x", lkb->lkb_id); in validate_unlock_args()
2963 if (!list_empty(&lkb->lkb_rsb_lookup)) { in validate_unlock_args()
2965 log_debug(ls, "unlock on rsb_lookup %x", lkb->lkb_id); in validate_unlock_args()
2966 list_del_init(&lkb->lkb_rsb_lookup); in validate_unlock_args()
2967 queue_cast(lkb->lkb_resource, lkb, in validate_unlock_args()
2970 unhold_lkb(lkb); /* undoes create_lkb() */ in validate_unlock_args()
2980 if (lkb->lkb_exflags & DLM_LKF_CANCEL) in validate_unlock_args()
2983 if (is_overlap(lkb)) in validate_unlock_args()
2987 del_timeout(lkb); in validate_unlock_args()
2989 if (lkb->lkb_flags & DLM_IFL_RESEND) { in validate_unlock_args()
2990 lkb->lkb_flags |= DLM_IFL_OVERLAP_CANCEL; in validate_unlock_args()
2996 if (lkb->lkb_status == DLM_LKSTS_GRANTED && in validate_unlock_args()
2997 !lkb->lkb_wait_type) { in validate_unlock_args()
3002 switch (lkb->lkb_wait_type) { in validate_unlock_args()
3005 lkb->lkb_flags |= DLM_IFL_OVERLAP_CANCEL; in validate_unlock_args()
3021 if (lkb->lkb_exflags & DLM_LKF_FORCEUNLOCK) in validate_unlock_args()
3024 if (is_overlap_unlock(lkb)) in validate_unlock_args()
3028 del_timeout(lkb); in validate_unlock_args()
3030 if (lkb->lkb_flags & DLM_IFL_RESEND) { in validate_unlock_args()
3031 lkb->lkb_flags |= DLM_IFL_OVERLAP_UNLOCK; in validate_unlock_args()
3036 switch (lkb->lkb_wait_type) { in validate_unlock_args()
3039 lkb->lkb_flags |= DLM_IFL_OVERLAP_UNLOCK; in validate_unlock_args()
3051 if (lkb->lkb_wait_type || lkb->lkb_wait_count) in validate_unlock_args()
3056 lkb->lkb_exflags |= args->flags; in validate_unlock_args()
3057 lkb->lkb_sbflags = 0; in validate_unlock_args()
3058 lkb->lkb_astparam = args->astparam; in validate_unlock_args()
3063 lkb->lkb_id, lkb->lkb_flags, lkb->lkb_exflags, in validate_unlock_args()
3064 args->flags, lkb->lkb_wait_type, in validate_unlock_args()
3065 lkb->lkb_resource->res_name); in validate_unlock_args()
3076 static int do_request(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_request() argument
3080 if (can_be_granted(r, lkb, 1, 0, NULL)) { in do_request()
3081 grant_lock(r, lkb); in do_request()
3082 queue_cast(r, lkb, 0); in do_request()
3086 if (can_be_queued(lkb)) { in do_request()
3088 add_lkb(r, lkb, DLM_LKSTS_WAITING); in do_request()
3089 add_timeout(lkb); in do_request()
3094 queue_cast(r, lkb, -EAGAIN); in do_request()
3099 static void do_request_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_request_effects() argument
3104 if (force_blocking_asts(lkb)) in do_request_effects()
3105 send_blocking_asts_all(r, lkb); in do_request_effects()
3108 send_blocking_asts(r, lkb); in do_request_effects()
3113 static int do_convert(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_convert() argument
3120 if (can_be_granted(r, lkb, 1, 0, &deadlk)) { in do_convert()
3121 grant_lock(r, lkb); in do_convert()
3122 queue_cast(r, lkb, 0); in do_convert()
3130 if (deadlk && !(lkb->lkb_exflags & DLM_LKF_NODLCKWT)) { in do_convert()
3132 revert_lock(r, lkb); in do_convert()
3133 queue_cast(r, lkb, -EDEADLK); in do_convert()
3144 if (is_demoted(lkb)) { in do_convert()
3146 if (_can_be_granted(r, lkb, 1, 0)) { in do_convert()
3147 grant_lock(r, lkb); in do_convert()
3148 queue_cast(r, lkb, 0); in do_convert()
3154 if (can_be_queued(lkb)) { in do_convert()
3156 del_lkb(r, lkb); in do_convert()
3157 add_lkb(r, lkb, DLM_LKSTS_CONVERT); in do_convert()
3158 add_timeout(lkb); in do_convert()
3163 queue_cast(r, lkb, -EAGAIN); in do_convert()
3168 static void do_convert_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_convert_effects() argument
3177 if (force_blocking_asts(lkb)) in do_convert_effects()
3178 send_blocking_asts_all(r, lkb); in do_convert_effects()
3181 send_blocking_asts(r, lkb); in do_convert_effects()
3186 static int do_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_unlock() argument
3188 remove_lock(r, lkb); in do_unlock()
3189 queue_cast(r, lkb, -DLM_EUNLOCK); in do_unlock()
3193 static void do_unlock_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_unlock_effects() argument
3201 static int do_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb) in do_cancel() argument
3205 error = revert_lock(r, lkb); in do_cancel()
3207 queue_cast(r, lkb, -DLM_ECANCEL); in do_cancel()
3213 static void do_cancel_effects(struct dlm_rsb *r, struct dlm_lkb *lkb, in do_cancel_effects() argument
3227 static int _request_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _request_lock() argument
3233 error = set_master(r, lkb); in _request_lock()
3243 error = send_request(r, lkb); in _request_lock()
3245 error = do_request(r, lkb); in _request_lock()
3248 do_request_effects(r, lkb, error); in _request_lock()
3256 static int _convert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _convert_lock() argument
3262 error = send_convert(r, lkb); in _convert_lock()
3264 error = do_convert(r, lkb); in _convert_lock()
3267 do_convert_effects(r, lkb, error); in _convert_lock()
3275 static int _unlock_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _unlock_lock() argument
3281 error = send_unlock(r, lkb); in _unlock_lock()
3283 error = do_unlock(r, lkb); in _unlock_lock()
3286 do_unlock_effects(r, lkb, error); in _unlock_lock()
3294 static int _cancel_lock(struct dlm_rsb *r, struct dlm_lkb *lkb) in _cancel_lock() argument
3300 error = send_cancel(r, lkb); in _cancel_lock()
3302 error = do_cancel(r, lkb); in _cancel_lock()
3305 do_cancel_effects(r, lkb, error); in _cancel_lock()
3316 static int request_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, char *name, in request_lock() argument
3322 error = validate_lock_args(ls, lkb, args); in request_lock()
3332 attach_lkb(r, lkb); in request_lock()
3333 lkb->lkb_lksb->sb_lkid = lkb->lkb_id; in request_lock()
3335 error = _request_lock(r, lkb); in request_lock()
3342 static int convert_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in convert_lock() argument
3348 r = lkb->lkb_resource; in convert_lock()
3353 error = validate_lock_args(ls, lkb, args); in convert_lock()
3357 error = _convert_lock(r, lkb); in convert_lock()
3364 static int unlock_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in unlock_lock() argument
3370 r = lkb->lkb_resource; in unlock_lock()
3375 error = validate_unlock_args(lkb, args); in unlock_lock()
3379 error = _unlock_lock(r, lkb); in unlock_lock()
3386 static int cancel_lock(struct dlm_ls *ls, struct dlm_lkb *lkb, in cancel_lock() argument
3392 r = lkb->lkb_resource; in cancel_lock()
3397 error = validate_unlock_args(lkb, args); in cancel_lock()
3401 error = _cancel_lock(r, lkb); in cancel_lock()
3424 struct dlm_lkb *lkb; in dlm_lock() local
3435 error = find_lkb(ls, lksb->sb_lkid, &lkb); in dlm_lock()
3437 error = create_lkb(ls, &lkb); in dlm_lock()
3448 error = convert_lock(ls, lkb, &args); in dlm_lock()
3450 error = request_lock(ls, lkb, name, namelen, &args); in dlm_lock()
3456 __put_lkb(ls, lkb); in dlm_lock()
3472 struct dlm_lkb *lkb; in dlm_unlock() local
3482 error = find_lkb(ls, lkid, &lkb); in dlm_unlock()
3491 error = cancel_lock(ls, lkb, &args); in dlm_unlock()
3493 error = unlock_lock(ls, lkb, &args); in dlm_unlock()
3500 dlm_put_lkb(lkb); in dlm_unlock()
3563 static int create_message(struct dlm_rsb *r, struct dlm_lkb *lkb, in create_message() argument
3581 if (lkb && lkb->lkb_lvbptr) in create_message()
3600 static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb, in send_args() argument
3603 ms->m_nodeid = lkb->lkb_nodeid; in send_args()
3604 ms->m_pid = lkb->lkb_ownpid; in send_args()
3605 ms->m_lkid = lkb->lkb_id; in send_args()
3606 ms->m_remid = lkb->lkb_remid; in send_args()
3607 ms->m_exflags = lkb->lkb_exflags; in send_args()
3608 ms->m_sbflags = lkb->lkb_sbflags; in send_args()
3609 ms->m_flags = lkb->lkb_flags; in send_args()
3610 ms->m_lvbseq = lkb->lkb_lvbseq; in send_args()
3611 ms->m_status = lkb->lkb_status; in send_args()
3612 ms->m_grmode = lkb->lkb_grmode; in send_args()
3613 ms->m_rqmode = lkb->lkb_rqmode; in send_args()
3619 if (lkb->lkb_bastfn) in send_args()
3621 if (lkb->lkb_astfn) in send_args()
3637 if (!lkb->lkb_lvbptr) in send_args()
3639 memcpy(ms->m_extra, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); in send_args()
3644 static int send_common(struct dlm_rsb *r, struct dlm_lkb *lkb, int mstype) in send_common() argument
3652 error = add_to_waiters(lkb, mstype, to_nodeid); in send_common()
3656 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh); in send_common()
3660 send_args(r, lkb, ms); in send_common()
3668 remove_from_waiters(lkb, msg_reply_type(mstype)); in send_common()
3672 static int send_request(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_request() argument
3674 return send_common(r, lkb, DLM_MSG_REQUEST); in send_request()
3677 static int send_convert(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_convert() argument
3681 error = send_common(r, lkb, DLM_MSG_CONVERT); in send_convert()
3684 if (!error && down_conversion(lkb)) { in send_convert()
3685 remove_from_waiters(lkb, DLM_MSG_CONVERT_REPLY); in send_convert()
3689 __receive_convert_reply(r, lkb, &r->res_ls->ls_stub_ms); in send_convert()
3699 static int send_unlock(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_unlock() argument
3701 return send_common(r, lkb, DLM_MSG_UNLOCK); in send_unlock()
3704 static int send_cancel(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_cancel() argument
3706 return send_common(r, lkb, DLM_MSG_CANCEL); in send_cancel()
3709 static int send_grant(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_grant() argument
3715 to_nodeid = lkb->lkb_nodeid; in send_grant()
3717 error = create_message(r, lkb, to_nodeid, DLM_MSG_GRANT, &ms, &mh); in send_grant()
3721 send_args(r, lkb, ms); in send_grant()
3730 static int send_bast(struct dlm_rsb *r, struct dlm_lkb *lkb, int mode) in send_bast() argument
3736 to_nodeid = lkb->lkb_nodeid; in send_bast()
3742 send_args(r, lkb, ms); in send_bast()
3751 static int send_lookup(struct dlm_rsb *r, struct dlm_lkb *lkb) in send_lookup() argument
3759 error = add_to_waiters(lkb, DLM_MSG_LOOKUP, to_nodeid); in send_lookup()
3767 send_args(r, lkb, ms); in send_lookup()
3775 remove_from_waiters(lkb, DLM_MSG_LOOKUP_REPLY); in send_lookup()
3799 static int send_common_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, in send_common_reply() argument
3806 to_nodeid = lkb->lkb_nodeid; in send_common_reply()
3808 error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh); in send_common_reply()
3812 send_args(r, lkb, ms); in send_common_reply()
3821 static int send_request_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_request_reply() argument
3823 return send_common_reply(r, lkb, DLM_MSG_REQUEST_REPLY, rv); in send_request_reply()
3826 static int send_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_convert_reply() argument
3828 return send_common_reply(r, lkb, DLM_MSG_CONVERT_REPLY, rv); in send_convert_reply()
3831 static int send_unlock_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_unlock_reply() argument
3833 return send_common_reply(r, lkb, DLM_MSG_UNLOCK_REPLY, rv); in send_unlock_reply()
3836 static int send_cancel_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, int rv) in send_cancel_reply() argument
3838 return send_common_reply(r, lkb, DLM_MSG_CANCEL_REPLY, rv); in send_cancel_reply()
3866 static void receive_flags(struct dlm_lkb *lkb, struct dlm_message *ms) in receive_flags() argument
3868 lkb->lkb_exflags = ms->m_exflags; in receive_flags()
3869 lkb->lkb_sbflags = ms->m_sbflags; in receive_flags()
3870 lkb->lkb_flags = (lkb->lkb_flags & 0xFFFF0000) | in receive_flags()
3874 static void receive_flags_reply(struct dlm_lkb *lkb, struct dlm_message *ms) in receive_flags_reply() argument
3879 lkb->lkb_sbflags = ms->m_sbflags; in receive_flags_reply()
3880 lkb->lkb_flags = (lkb->lkb_flags & 0xFFFF0000) | in receive_flags_reply()
3889 static int receive_lvb(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_lvb() argument
3894 if (lkb->lkb_exflags & DLM_LKF_VALBLK) { in receive_lvb()
3895 if (!lkb->lkb_lvbptr) in receive_lvb()
3896 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_lvb()
3897 if (!lkb->lkb_lvbptr) in receive_lvb()
3902 memcpy(lkb->lkb_lvbptr, ms->m_extra, len); in receive_lvb()
3917 static int receive_request_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_request_args() argument
3920 lkb->lkb_nodeid = ms->m_header.h_nodeid; in receive_request_args()
3921 lkb->lkb_ownpid = ms->m_pid; in receive_request_args()
3922 lkb->lkb_remid = ms->m_lkid; in receive_request_args()
3923 lkb->lkb_grmode = DLM_LOCK_IV; in receive_request_args()
3924 lkb->lkb_rqmode = ms->m_rqmode; in receive_request_args()
3926 lkb->lkb_bastfn = (ms->m_asts & DLM_CB_BAST) ? &fake_bastfn : NULL; in receive_request_args()
3927 lkb->lkb_astfn = (ms->m_asts & DLM_CB_CAST) ? &fake_astfn : NULL; in receive_request_args()
3929 if (lkb->lkb_exflags & DLM_LKF_VALBLK) { in receive_request_args()
3931 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_request_args()
3932 if (!lkb->lkb_lvbptr) in receive_request_args()
3939 static int receive_convert_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_convert_args() argument
3942 if (lkb->lkb_status != DLM_LKSTS_GRANTED) in receive_convert_args()
3945 if (receive_lvb(ls, lkb, ms)) in receive_convert_args()
3948 lkb->lkb_rqmode = ms->m_rqmode; in receive_convert_args()
3949 lkb->lkb_lvbseq = ms->m_lvbseq; in receive_convert_args()
3954 static int receive_unlock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_unlock_args() argument
3957 if (receive_lvb(ls, lkb, ms)) in receive_unlock_args()
3967 struct dlm_lkb *lkb = &ls->ls_stub_lkb; in setup_stub_lkb() local
3968 lkb->lkb_nodeid = ms->m_header.h_nodeid; in setup_stub_lkb()
3969 lkb->lkb_remid = ms->m_lkid; in setup_stub_lkb()
3975 static int validate_message(struct dlm_lkb *lkb, struct dlm_message *ms) in validate_message() argument
3981 if (ms->m_flags & DLM_IFL_USER && ~lkb->lkb_flags & DLM_IFL_USER) { in validate_message()
3982 log_error(lkb->lkb_resource->res_ls, in validate_message()
3992 if (!is_master_copy(lkb) || lkb->lkb_nodeid != from) in validate_message()
4001 if (!is_process_copy(lkb) || lkb->lkb_nodeid != from) in validate_message()
4006 if (!is_process_copy(lkb)) in validate_message()
4008 else if (lkb->lkb_nodeid != -1 && lkb->lkb_nodeid != from) in validate_message()
4018 log_error(lkb->lkb_resource->res_ls, in validate_message()
4020 ms->m_type, from, lkb->lkb_id, lkb->lkb_remid, in validate_message()
4021 lkb->lkb_flags, lkb->lkb_nodeid); in validate_message()
4086 struct dlm_lkb *lkb; in receive_request() local
4093 error = create_lkb(ls, &lkb); in receive_request()
4097 receive_flags(lkb, ms); in receive_request()
4098 lkb->lkb_flags |= DLM_IFL_MSTCPY; in receive_request()
4099 error = receive_request_args(ls, lkb, ms); in receive_request()
4101 __put_lkb(ls, lkb); in receive_request()
4116 __put_lkb(ls, lkb); in receive_request()
4127 __put_lkb(ls, lkb); in receive_request()
4132 attach_lkb(r, lkb); in receive_request()
4133 error = do_request(r, lkb); in receive_request()
4134 send_request_reply(r, lkb, error); in receive_request()
4135 do_request_effects(r, lkb, error); in receive_request()
4143 dlm_put_lkb(lkb); in receive_request()
4179 struct dlm_lkb *lkb; in receive_convert() local
4183 error = find_lkb(ls, ms->m_remid, &lkb); in receive_convert()
4187 if (lkb->lkb_remid != ms->m_lkid) { in receive_convert()
4189 "remote %d %x", lkb->lkb_id, lkb->lkb_remid, in receive_convert()
4190 (unsigned long long)lkb->lkb_recover_seq, in receive_convert()
4193 dlm_put_lkb(lkb); in receive_convert()
4197 r = lkb->lkb_resource; in receive_convert()
4202 error = validate_message(lkb, ms); in receive_convert()
4206 receive_flags(lkb, ms); in receive_convert()
4208 error = receive_convert_args(ls, lkb, ms); in receive_convert()
4210 send_convert_reply(r, lkb, error); in receive_convert()
4214 reply = !down_conversion(lkb); in receive_convert()
4216 error = do_convert(r, lkb); in receive_convert()
4218 send_convert_reply(r, lkb, error); in receive_convert()
4219 do_convert_effects(r, lkb, error); in receive_convert()
4223 dlm_put_lkb(lkb); in receive_convert()
4234 struct dlm_lkb *lkb; in receive_unlock() local
4238 error = find_lkb(ls, ms->m_remid, &lkb); in receive_unlock()
4242 if (lkb->lkb_remid != ms->m_lkid) { in receive_unlock()
4244 lkb->lkb_id, lkb->lkb_remid, in receive_unlock()
4247 dlm_put_lkb(lkb); in receive_unlock()
4251 r = lkb->lkb_resource; in receive_unlock()
4256 error = validate_message(lkb, ms); in receive_unlock()
4260 receive_flags(lkb, ms); in receive_unlock()
4262 error = receive_unlock_args(ls, lkb, ms); in receive_unlock()
4264 send_unlock_reply(r, lkb, error); in receive_unlock()
4268 error = do_unlock(r, lkb); in receive_unlock()
4269 send_unlock_reply(r, lkb, error); in receive_unlock()
4270 do_unlock_effects(r, lkb, error); in receive_unlock()
4274 dlm_put_lkb(lkb); in receive_unlock()
4285 struct dlm_lkb *lkb; in receive_cancel() local
4289 error = find_lkb(ls, ms->m_remid, &lkb); in receive_cancel()
4293 receive_flags(lkb, ms); in receive_cancel()
4295 r = lkb->lkb_resource; in receive_cancel()
4300 error = validate_message(lkb, ms); in receive_cancel()
4304 error = do_cancel(r, lkb); in receive_cancel()
4305 send_cancel_reply(r, lkb, error); in receive_cancel()
4306 do_cancel_effects(r, lkb, error); in receive_cancel()
4310 dlm_put_lkb(lkb); in receive_cancel()
4321 struct dlm_lkb *lkb; in receive_grant() local
4325 error = find_lkb(ls, ms->m_remid, &lkb); in receive_grant()
4329 r = lkb->lkb_resource; in receive_grant()
4334 error = validate_message(lkb, ms); in receive_grant()
4338 receive_flags_reply(lkb, ms); in receive_grant()
4339 if (is_altmode(lkb)) in receive_grant()
4340 munge_altmode(lkb, ms); in receive_grant()
4341 grant_lock_pc(r, lkb, ms); in receive_grant()
4342 queue_cast(r, lkb, 0); in receive_grant()
4346 dlm_put_lkb(lkb); in receive_grant()
4352 struct dlm_lkb *lkb; in receive_bast() local
4356 error = find_lkb(ls, ms->m_remid, &lkb); in receive_bast()
4360 r = lkb->lkb_resource; in receive_bast()
4365 error = validate_message(lkb, ms); in receive_bast()
4369 queue_bast(r, lkb, ms->m_bastmode); in receive_bast()
4370 lkb->lkb_highbast = ms->m_bastmode; in receive_bast()
4374 dlm_put_lkb(lkb); in receive_bast()
4493 struct dlm_lkb *lkb; in receive_request_reply() local
4498 error = find_lkb(ls, ms->m_remid, &lkb); in receive_request_reply()
4502 r = lkb->lkb_resource; in receive_request_reply()
4506 error = validate_message(lkb, ms); in receive_request_reply()
4510 mstype = lkb->lkb_wait_type; in receive_request_reply()
4511 error = remove_from_waiters(lkb, DLM_MSG_REQUEST_REPLY); in receive_request_reply()
4514 lkb->lkb_id, from_nodeid, ms->m_lkid, ms->m_result); in receive_request_reply()
4524 lkb->lkb_nodeid = from_nodeid; in receive_request_reply()
4533 queue_cast(r, lkb, -EAGAIN); in receive_request_reply()
4535 unhold_lkb(lkb); /* undoes create_lkb() */ in receive_request_reply()
4541 receive_flags_reply(lkb, ms); in receive_request_reply()
4542 lkb->lkb_remid = ms->m_lkid; in receive_request_reply()
4543 if (is_altmode(lkb)) in receive_request_reply()
4544 munge_altmode(lkb, ms); in receive_request_reply()
4546 add_lkb(r, lkb, DLM_LKSTS_WAITING); in receive_request_reply()
4547 add_timeout(lkb); in receive_request_reply()
4549 grant_lock_pc(r, lkb, ms); in receive_request_reply()
4550 queue_cast(r, lkb, 0); in receive_request_reply()
4559 "master %d dir %d first %x %s", lkb->lkb_id, in receive_request_reply()
4568 lkb->lkb_nodeid = -1; in receive_request_reply()
4571 if (is_overlap(lkb)) { in receive_request_reply()
4573 queue_cast_overlap(r, lkb); in receive_request_reply()
4575 unhold_lkb(lkb); /* undoes create_lkb() */ in receive_request_reply()
4577 _request_lock(r, lkb); in receive_request_reply()
4586 lkb->lkb_id, result); in receive_request_reply()
4589 if (is_overlap_unlock(lkb) && (result == 0 || result == -EINPROGRESS)) { in receive_request_reply()
4591 lkb->lkb_id, result); in receive_request_reply()
4592 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in receive_request_reply()
4593 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in receive_request_reply()
4594 send_unlock(r, lkb); in receive_request_reply()
4595 } else if (is_overlap_cancel(lkb) && (result == -EINPROGRESS)) { in receive_request_reply()
4596 log_debug(ls, "receive_request_reply %x cancel", lkb->lkb_id); in receive_request_reply()
4597 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in receive_request_reply()
4598 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in receive_request_reply()
4599 send_cancel(r, lkb); in receive_request_reply()
4601 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in receive_request_reply()
4602 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in receive_request_reply()
4607 dlm_put_lkb(lkb); in receive_request_reply()
4611 static void __receive_convert_reply(struct dlm_rsb *r, struct dlm_lkb *lkb, in __receive_convert_reply() argument
4618 queue_cast(r, lkb, -EAGAIN); in __receive_convert_reply()
4622 receive_flags_reply(lkb, ms); in __receive_convert_reply()
4623 revert_lock_pc(r, lkb); in __receive_convert_reply()
4624 queue_cast(r, lkb, -EDEADLK); in __receive_convert_reply()
4629 receive_flags_reply(lkb, ms); in __receive_convert_reply()
4630 if (is_demoted(lkb)) in __receive_convert_reply()
4631 munge_demoted(lkb); in __receive_convert_reply()
4632 del_lkb(r, lkb); in __receive_convert_reply()
4633 add_lkb(r, lkb, DLM_LKSTS_CONVERT); in __receive_convert_reply()
4634 add_timeout(lkb); in __receive_convert_reply()
4639 receive_flags_reply(lkb, ms); in __receive_convert_reply()
4640 if (is_demoted(lkb)) in __receive_convert_reply()
4641 munge_demoted(lkb); in __receive_convert_reply()
4642 grant_lock_pc(r, lkb, ms); in __receive_convert_reply()
4643 queue_cast(r, lkb, 0); in __receive_convert_reply()
4648 lkb->lkb_id, ms->m_header.h_nodeid, ms->m_lkid, in __receive_convert_reply()
4651 dlm_print_lkb(lkb); in __receive_convert_reply()
4655 static void _receive_convert_reply(struct dlm_lkb *lkb, struct dlm_message *ms) in _receive_convert_reply() argument
4657 struct dlm_rsb *r = lkb->lkb_resource; in _receive_convert_reply()
4663 error = validate_message(lkb, ms); in _receive_convert_reply()
4668 error = remove_from_waiters_ms(lkb, ms); in _receive_convert_reply()
4672 __receive_convert_reply(r, lkb, ms); in _receive_convert_reply()
4680 struct dlm_lkb *lkb; in receive_convert_reply() local
4683 error = find_lkb(ls, ms->m_remid, &lkb); in receive_convert_reply()
4687 _receive_convert_reply(lkb, ms); in receive_convert_reply()
4688 dlm_put_lkb(lkb); in receive_convert_reply()
4692 static void _receive_unlock_reply(struct dlm_lkb *lkb, struct dlm_message *ms) in _receive_unlock_reply() argument
4694 struct dlm_rsb *r = lkb->lkb_resource; in _receive_unlock_reply()
4700 error = validate_message(lkb, ms); in _receive_unlock_reply()
4705 error = remove_from_waiters_ms(lkb, ms); in _receive_unlock_reply()
4713 receive_flags_reply(lkb, ms); in _receive_unlock_reply()
4714 remove_lock_pc(r, lkb); in _receive_unlock_reply()
4715 queue_cast(r, lkb, -DLM_EUNLOCK); in _receive_unlock_reply()
4721 lkb->lkb_id, ms->m_result); in _receive_unlock_reply()
4730 struct dlm_lkb *lkb; in receive_unlock_reply() local
4733 error = find_lkb(ls, ms->m_remid, &lkb); in receive_unlock_reply()
4737 _receive_unlock_reply(lkb, ms); in receive_unlock_reply()
4738 dlm_put_lkb(lkb); in receive_unlock_reply()
4742 static void _receive_cancel_reply(struct dlm_lkb *lkb, struct dlm_message *ms) in _receive_cancel_reply() argument
4744 struct dlm_rsb *r = lkb->lkb_resource; in _receive_cancel_reply()
4750 error = validate_message(lkb, ms); in _receive_cancel_reply()
4755 error = remove_from_waiters_ms(lkb, ms); in _receive_cancel_reply()
4763 receive_flags_reply(lkb, ms); in _receive_cancel_reply()
4764 revert_lock_pc(r, lkb); in _receive_cancel_reply()
4765 queue_cast(r, lkb, -DLM_ECANCEL); in _receive_cancel_reply()
4771 lkb->lkb_id, ms->m_result); in _receive_cancel_reply()
4780 struct dlm_lkb *lkb; in receive_cancel_reply() local
4783 error = find_lkb(ls, ms->m_remid, &lkb); in receive_cancel_reply()
4787 _receive_cancel_reply(lkb, ms); in receive_cancel_reply()
4788 dlm_put_lkb(lkb); in receive_cancel_reply()
4794 struct dlm_lkb *lkb; in receive_lookup_reply() local
4799 error = find_lkb(ls, ms->m_lkid, &lkb); in receive_lookup_reply()
4808 r = lkb->lkb_resource; in receive_lookup_reply()
4812 error = remove_from_waiters(lkb, DLM_MSG_LOOKUP_REPLY); in receive_lookup_reply()
4828 lkb->lkb_id, ms->m_header.h_nodeid, ret_nodeid, in receive_lookup_reply()
4841 lkb->lkb_id, ms->m_header.h_nodeid); in receive_lookup_reply()
4844 lkb->lkb_nodeid = -1; in receive_lookup_reply()
4851 if (is_overlap(lkb)) { in receive_lookup_reply()
4853 lkb->lkb_id, lkb->lkb_flags); in receive_lookup_reply()
4854 queue_cast_overlap(r, lkb); in receive_lookup_reply()
4855 unhold_lkb(lkb); /* undoes create_lkb() */ in receive_lookup_reply()
4859 _request_lock(r, lkb); in receive_lookup_reply()
4867 dlm_put_lkb(lkb); in receive_lookup_reply()
5085 static void recover_convert_waiter(struct dlm_ls *ls, struct dlm_lkb *lkb, in recover_convert_waiter() argument
5088 if (middle_conversion(lkb)) { in recover_convert_waiter()
5089 hold_lkb(lkb); in recover_convert_waiter()
5094 ms_stub->m_header.h_nodeid = lkb->lkb_nodeid; in recover_convert_waiter()
5095 _receive_convert_reply(lkb, ms_stub); in recover_convert_waiter()
5098 lkb->lkb_grmode = DLM_LOCK_IV; in recover_convert_waiter()
5099 rsb_set_flag(lkb->lkb_resource, RSB_RECOVER_CONVERT); in recover_convert_waiter()
5100 unhold_lkb(lkb); in recover_convert_waiter()
5102 } else if (lkb->lkb_rqmode >= lkb->lkb_grmode) { in recover_convert_waiter()
5103 lkb->lkb_flags |= DLM_IFL_RESEND; in recover_convert_waiter()
5113 static int waiter_needs_recovery(struct dlm_ls *ls, struct dlm_lkb *lkb, in waiter_needs_recovery() argument
5119 if (dlm_is_removed(ls, lkb->lkb_wait_nodeid)) in waiter_needs_recovery()
5133 struct dlm_lkb *lkb, *safe; in dlm_recover_waiters_pre() local
5144 list_for_each_entry_safe(lkb, safe, &ls->ls_waiters, lkb_wait_reply) { in dlm_recover_waiters_pre()
5146 dir_nodeid = dlm_dir_nodeid(lkb->lkb_resource); in dlm_recover_waiters_pre()
5151 if (lkb->lkb_wait_type != DLM_MSG_UNLOCK) { in dlm_recover_waiters_pre()
5154 lkb->lkb_id, in dlm_recover_waiters_pre()
5155 lkb->lkb_remid, in dlm_recover_waiters_pre()
5156 lkb->lkb_wait_type, in dlm_recover_waiters_pre()
5157 lkb->lkb_resource->res_nodeid, in dlm_recover_waiters_pre()
5158 lkb->lkb_nodeid, in dlm_recover_waiters_pre()
5159 lkb->lkb_wait_nodeid, in dlm_recover_waiters_pre()
5166 if (lkb->lkb_wait_type == DLM_MSG_LOOKUP) { in dlm_recover_waiters_pre()
5167 lkb->lkb_flags |= DLM_IFL_RESEND; in dlm_recover_waiters_pre()
5171 if (!waiter_needs_recovery(ls, lkb, dir_nodeid)) in dlm_recover_waiters_pre()
5174 wait_type = lkb->lkb_wait_type; in dlm_recover_waiters_pre()
5184 if (is_overlap_cancel(lkb)) { in dlm_recover_waiters_pre()
5186 if (lkb->lkb_grmode == DLM_LOCK_IV) in dlm_recover_waiters_pre()
5189 if (is_overlap_unlock(lkb)) { in dlm_recover_waiters_pre()
5191 if (lkb->lkb_grmode == DLM_LOCK_IV) in dlm_recover_waiters_pre()
5196 lkb->lkb_id, lkb->lkb_flags, wait_type, in dlm_recover_waiters_pre()
5203 lkb->lkb_flags |= DLM_IFL_RESEND; in dlm_recover_waiters_pre()
5207 recover_convert_waiter(ls, lkb, ms_stub); in dlm_recover_waiters_pre()
5211 hold_lkb(lkb); in dlm_recover_waiters_pre()
5216 ms_stub->m_header.h_nodeid = lkb->lkb_nodeid; in dlm_recover_waiters_pre()
5217 _receive_unlock_reply(lkb, ms_stub); in dlm_recover_waiters_pre()
5218 dlm_put_lkb(lkb); in dlm_recover_waiters_pre()
5222 hold_lkb(lkb); in dlm_recover_waiters_pre()
5227 ms_stub->m_header.h_nodeid = lkb->lkb_nodeid; in dlm_recover_waiters_pre()
5228 _receive_cancel_reply(lkb, ms_stub); in dlm_recover_waiters_pre()
5229 dlm_put_lkb(lkb); in dlm_recover_waiters_pre()
5234 lkb->lkb_wait_type, wait_type); in dlm_recover_waiters_pre()
5244 struct dlm_lkb *lkb; in find_resend_waiter() local
5248 list_for_each_entry(lkb, &ls->ls_waiters, lkb_wait_reply) { in find_resend_waiter()
5249 if (lkb->lkb_flags & DLM_IFL_RESEND) { in find_resend_waiter()
5250 hold_lkb(lkb); in find_resend_waiter()
5258 lkb = NULL; in find_resend_waiter()
5259 return lkb; in find_resend_waiter()
5280 struct dlm_lkb *lkb; in dlm_recover_waiters_post() local
5291 lkb = find_resend_waiter(ls); in dlm_recover_waiters_post()
5292 if (!lkb) in dlm_recover_waiters_post()
5295 r = lkb->lkb_resource; in dlm_recover_waiters_post()
5299 mstype = lkb->lkb_wait_type; in dlm_recover_waiters_post()
5300 oc = is_overlap_cancel(lkb); in dlm_recover_waiters_post()
5301 ou = is_overlap_unlock(lkb); in dlm_recover_waiters_post()
5306 "overlap %d %d", lkb->lkb_id, lkb->lkb_remid, mstype, in dlm_recover_waiters_post()
5307 r->res_nodeid, lkb->lkb_nodeid, lkb->lkb_wait_nodeid, in dlm_recover_waiters_post()
5314 lkb->lkb_flags &= ~DLM_IFL_RESEND; in dlm_recover_waiters_post()
5315 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; in dlm_recover_waiters_post()
5316 lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; in dlm_recover_waiters_post()
5317 lkb->lkb_wait_type = 0; in dlm_recover_waiters_post()
5321 while (lkb->lkb_wait_count) { in dlm_recover_waiters_post()
5322 lkb->lkb_wait_count--; in dlm_recover_waiters_post()
5323 unhold_lkb(lkb); in dlm_recover_waiters_post()
5326 list_del_init(&lkb->lkb_wait_reply); in dlm_recover_waiters_post()
5334 queue_cast(r, lkb, ou ? -DLM_EUNLOCK : in dlm_recover_waiters_post()
5336 unhold_lkb(lkb); /* undoes create_lkb() */ in dlm_recover_waiters_post()
5340 queue_cast(r, lkb, -DLM_ECANCEL); in dlm_recover_waiters_post()
5342 lkb->lkb_exflags |= DLM_LKF_FORCEUNLOCK; in dlm_recover_waiters_post()
5343 _unlock_lock(r, lkb); in dlm_recover_waiters_post()
5353 _request_lock(r, lkb); in dlm_recover_waiters_post()
5358 _convert_lock(r, lkb); in dlm_recover_waiters_post()
5368 lkb->lkb_id, mstype, r->res_nodeid, in dlm_recover_waiters_post()
5373 dlm_put_lkb(lkb); in dlm_recover_waiters_post()
5382 struct dlm_lkb *lkb, *safe; in purge_mstcpy_list() local
5384 list_for_each_entry_safe(lkb, safe, list, lkb_statequeue) { in purge_mstcpy_list()
5385 if (!is_master_copy(lkb)) in purge_mstcpy_list()
5391 if (lkb->lkb_recover_seq == ls->ls_recover_seq) in purge_mstcpy_list()
5394 del_lkb(r, lkb); in purge_mstcpy_list()
5397 if (!dlm_put_lkb(lkb)) in purge_mstcpy_list()
5415 struct dlm_lkb *lkb, *safe; in purge_dead_list() local
5417 list_for_each_entry_safe(lkb, safe, list, lkb_statequeue) { in purge_dead_list()
5418 if (!is_master_copy(lkb)) in purge_dead_list()
5421 if ((lkb->lkb_nodeid == nodeid_gone) || in purge_dead_list()
5422 dlm_is_removed(ls, lkb->lkb_nodeid)) { in purge_dead_list()
5426 if ((lkb->lkb_exflags & DLM_LKF_VALBLK) && in purge_dead_list()
5427 (lkb->lkb_grmode >= DLM_LOCK_PW)) { in purge_dead_list()
5431 del_lkb(r, lkb); in purge_dead_list()
5434 if (!dlm_put_lkb(lkb)) in purge_dead_list()
5565 struct dlm_lkb *lkb; in search_remid_list() local
5567 list_for_each_entry(lkb, head, lkb_statequeue) { in search_remid_list()
5568 if (lkb->lkb_nodeid == nodeid && lkb->lkb_remid == remid) in search_remid_list()
5569 return lkb; in search_remid_list()
5577 struct dlm_lkb *lkb; in search_remid() local
5579 lkb = search_remid_list(&r->res_grantqueue, nodeid, remid); in search_remid()
5580 if (lkb) in search_remid()
5581 return lkb; in search_remid()
5582 lkb = search_remid_list(&r->res_convertqueue, nodeid, remid); in search_remid()
5583 if (lkb) in search_remid()
5584 return lkb; in search_remid()
5585 lkb = search_remid_list(&r->res_waitqueue, nodeid, remid); in search_remid()
5586 if (lkb) in search_remid()
5587 return lkb; in search_remid()
5592 static int receive_rcom_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, in receive_rcom_lock_args() argument
5597 lkb->lkb_nodeid = rc->rc_header.h_nodeid; in receive_rcom_lock_args()
5598 lkb->lkb_ownpid = le32_to_cpu(rl->rl_ownpid); in receive_rcom_lock_args()
5599 lkb->lkb_remid = le32_to_cpu(rl->rl_lkid); in receive_rcom_lock_args()
5600 lkb->lkb_exflags = le32_to_cpu(rl->rl_exflags); in receive_rcom_lock_args()
5601 lkb->lkb_flags = le32_to_cpu(rl->rl_flags) & 0x0000FFFF; in receive_rcom_lock_args()
5602 lkb->lkb_flags |= DLM_IFL_MSTCPY; in receive_rcom_lock_args()
5603 lkb->lkb_lvbseq = le32_to_cpu(rl->rl_lvbseq); in receive_rcom_lock_args()
5604 lkb->lkb_rqmode = rl->rl_rqmode; in receive_rcom_lock_args()
5605 lkb->lkb_grmode = rl->rl_grmode; in receive_rcom_lock_args()
5608 lkb->lkb_bastfn = (rl->rl_asts & DLM_CB_BAST) ? &fake_bastfn : NULL; in receive_rcom_lock_args()
5609 lkb->lkb_astfn = (rl->rl_asts & DLM_CB_CAST) ? &fake_astfn : NULL; in receive_rcom_lock_args()
5611 if (lkb->lkb_exflags & DLM_LKF_VALBLK) { in receive_rcom_lock_args()
5616 lkb->lkb_lvbptr = dlm_allocate_lvb(ls); in receive_rcom_lock_args()
5617 if (!lkb->lkb_lvbptr) in receive_rcom_lock_args()
5619 memcpy(lkb->lkb_lvbptr, rl->rl_lvb, lvblen); in receive_rcom_lock_args()
5627 middle_conversion(lkb)) { in receive_rcom_lock_args()
5629 lkb->lkb_grmode = DLM_LOCK_IV; in receive_rcom_lock_args()
5647 struct dlm_lkb *lkb; in dlm_recover_master_copy() local
5681 lkb = search_remid(r, from_nodeid, remid); in dlm_recover_master_copy()
5682 if (lkb) { in dlm_recover_master_copy()
5687 error = create_lkb(ls, &lkb); in dlm_recover_master_copy()
5691 error = receive_rcom_lock_args(ls, lkb, r, rc); in dlm_recover_master_copy()
5693 __put_lkb(ls, lkb); in dlm_recover_master_copy()
5697 attach_lkb(r, lkb); in dlm_recover_master_copy()
5698 add_lkb(r, lkb, rl->rl_status); in dlm_recover_master_copy()
5708 rl->rl_remid = cpu_to_le32(lkb->lkb_id); in dlm_recover_master_copy()
5710 lkb->lkb_recover_seq = ls->ls_recover_seq; in dlm_recover_master_copy()
5728 struct dlm_lkb *lkb; in dlm_recover_process_copy() local
5736 error = find_lkb(ls, lkid, &lkb); in dlm_recover_process_copy()
5743 r = lkb->lkb_resource; in dlm_recover_process_copy()
5747 if (!is_process_copy(lkb)) { in dlm_recover_process_copy()
5753 dlm_put_lkb(lkb); in dlm_recover_process_copy()
5766 dlm_send_rcom_lock(r, lkb); in dlm_recover_process_copy()
5770 lkb->lkb_remid = remid; in dlm_recover_process_copy()
5783 dlm_put_lkb(lkb); in dlm_recover_process_copy()
5792 struct dlm_lkb *lkb; in dlm_user_request() local
5798 error = create_lkb(ls, &lkb); in dlm_user_request()
5808 __put_lkb(ls, lkb); in dlm_user_request()
5819 __put_lkb(ls, lkb); in dlm_user_request()
5826 lkb->lkb_flags |= DLM_IFL_USER; in dlm_user_request()
5827 error = request_lock(ls, lkb, name, namelen, &args); in dlm_user_request()
5839 __put_lkb(ls, lkb); in dlm_user_request()
5845 hold_lkb(lkb); in dlm_user_request()
5846 list_add_tail(&lkb->lkb_ownqueue, &ua->proc->locks); in dlm_user_request()
5857 struct dlm_lkb *lkb; in dlm_user_convert() local
5864 error = find_lkb(ls, lkid, &lkb); in dlm_user_convert()
5871 ua = lkb->lkb_ua; in dlm_user_convert()
5895 error = convert_lock(ls, lkb, &args); in dlm_user_convert()
5900 dlm_put_lkb(lkb); in dlm_user_convert()
5917 struct dlm_lkb *lkb; in dlm_user_adopt_orphan() local
5924 list_for_each_entry(lkb, &ls->ls_orphans, lkb_ownqueue) { in dlm_user_adopt_orphan()
5925 if (lkb->lkb_resource->res_length != namelen) in dlm_user_adopt_orphan()
5927 if (memcmp(lkb->lkb_resource->res_name, name, namelen)) in dlm_user_adopt_orphan()
5929 if (lkb->lkb_grmode != mode) { in dlm_user_adopt_orphan()
5935 list_del_init(&lkb->lkb_ownqueue); in dlm_user_adopt_orphan()
5936 lkb->lkb_flags &= ~DLM_IFL_ORPHAN; in dlm_user_adopt_orphan()
5937 *lkid = lkb->lkb_id; in dlm_user_adopt_orphan()
5952 lkb->lkb_exflags = flags; in dlm_user_adopt_orphan()
5953 lkb->lkb_ownpid = (int) current->pid; in dlm_user_adopt_orphan()
5955 ua = lkb->lkb_ua; in dlm_user_adopt_orphan()
5972 list_add_tail(&lkb->lkb_ownqueue, &ua->proc->locks); in dlm_user_adopt_orphan()
5982 struct dlm_lkb *lkb; in dlm_user_unlock() local
5989 error = find_lkb(ls, lkid, &lkb); in dlm_user_unlock()
5993 ua = lkb->lkb_ua; in dlm_user_unlock()
6005 error = unlock_lock(ls, lkb, &args); in dlm_user_unlock()
6017 if (!list_empty(&lkb->lkb_ownqueue)) in dlm_user_unlock()
6018 list_move(&lkb->lkb_ownqueue, &ua->proc->unlocking); in dlm_user_unlock()
6021 dlm_put_lkb(lkb); in dlm_user_unlock()
6031 struct dlm_lkb *lkb; in dlm_user_cancel() local
6038 error = find_lkb(ls, lkid, &lkb); in dlm_user_cancel()
6042 ua = lkb->lkb_ua; in dlm_user_cancel()
6051 error = cancel_lock(ls, lkb, &args); in dlm_user_cancel()
6059 dlm_put_lkb(lkb); in dlm_user_cancel()
6068 struct dlm_lkb *lkb; in dlm_user_deadlock() local
6076 error = find_lkb(ls, lkid, &lkb); in dlm_user_deadlock()
6080 ua = lkb->lkb_ua; in dlm_user_deadlock()
6088 r = lkb->lkb_resource; in dlm_user_deadlock()
6092 error = validate_unlock_args(lkb, &args); in dlm_user_deadlock()
6095 lkb->lkb_flags |= DLM_IFL_DEADLOCK_CANCEL; in dlm_user_deadlock()
6097 error = _cancel_lock(r, lkb); in dlm_user_deadlock()
6108 dlm_put_lkb(lkb); in dlm_user_deadlock()
6117 static int orphan_proc_lock(struct dlm_ls *ls, struct dlm_lkb *lkb) in orphan_proc_lock() argument
6122 hold_lkb(lkb); /* reference for the ls_orphans list */ in orphan_proc_lock()
6124 list_add_tail(&lkb->lkb_ownqueue, &ls->ls_orphans); in orphan_proc_lock()
6127 set_unlock_args(0, lkb->lkb_ua, &args); in orphan_proc_lock()
6129 error = cancel_lock(ls, lkb, &args); in orphan_proc_lock()
6140 static int unlock_proc_lock(struct dlm_ls *ls, struct dlm_lkb *lkb) in unlock_proc_lock() argument
6146 lkb->lkb_ua, &args); in unlock_proc_lock()
6148 error = unlock_lock(ls, lkb, &args); in unlock_proc_lock()
6161 struct dlm_lkb *lkb = NULL; in del_proc_lock() local
6167 lkb = list_entry(proc->locks.next, struct dlm_lkb, lkb_ownqueue); in del_proc_lock()
6168 list_del_init(&lkb->lkb_ownqueue); in del_proc_lock()
6170 if (lkb->lkb_exflags & DLM_LKF_PERSISTENT) in del_proc_lock()
6171 lkb->lkb_flags |= DLM_IFL_ORPHAN; in del_proc_lock()
6173 lkb->lkb_flags |= DLM_IFL_DEAD; in del_proc_lock()
6176 return lkb; in del_proc_lock()
6191 struct dlm_lkb *lkb, *safe; in dlm_clear_proc_locks() local
6196 lkb = del_proc_lock(ls, proc); in dlm_clear_proc_locks()
6197 if (!lkb) in dlm_clear_proc_locks()
6199 del_timeout(lkb); in dlm_clear_proc_locks()
6200 if (lkb->lkb_exflags & DLM_LKF_PERSISTENT) in dlm_clear_proc_locks()
6201 orphan_proc_lock(ls, lkb); in dlm_clear_proc_locks()
6203 unlock_proc_lock(ls, lkb); in dlm_clear_proc_locks()
6209 dlm_put_lkb(lkb); in dlm_clear_proc_locks()
6215 list_for_each_entry_safe(lkb, safe, &proc->unlocking, lkb_ownqueue) { in dlm_clear_proc_locks()
6216 list_del_init(&lkb->lkb_ownqueue); in dlm_clear_proc_locks()
6217 lkb->lkb_flags |= DLM_IFL_DEAD; in dlm_clear_proc_locks()
6218 dlm_put_lkb(lkb); in dlm_clear_proc_locks()
6221 list_for_each_entry_safe(lkb, safe, &proc->asts, lkb_cb_list) { in dlm_clear_proc_locks()
6222 memset(&lkb->lkb_callbacks, 0, in dlm_clear_proc_locks()
6224 list_del_init(&lkb->lkb_cb_list); in dlm_clear_proc_locks()
6225 dlm_put_lkb(lkb); in dlm_clear_proc_locks()
6234 struct dlm_lkb *lkb, *safe; in purge_proc_locks() local
6237 lkb = NULL; in purge_proc_locks()
6240 lkb = list_entry(proc->locks.next, struct dlm_lkb, in purge_proc_locks()
6242 list_del_init(&lkb->lkb_ownqueue); in purge_proc_locks()
6246 if (!lkb) in purge_proc_locks()
6249 lkb->lkb_flags |= DLM_IFL_DEAD; in purge_proc_locks()
6250 unlock_proc_lock(ls, lkb); in purge_proc_locks()
6251 dlm_put_lkb(lkb); /* ref from proc->locks list */ in purge_proc_locks()
6255 list_for_each_entry_safe(lkb, safe, &proc->unlocking, lkb_ownqueue) { in purge_proc_locks()
6256 list_del_init(&lkb->lkb_ownqueue); in purge_proc_locks()
6257 lkb->lkb_flags |= DLM_IFL_DEAD; in purge_proc_locks()
6258 dlm_put_lkb(lkb); in purge_proc_locks()
6263 list_for_each_entry_safe(lkb, safe, &proc->asts, lkb_cb_list) { in purge_proc_locks()
6264 memset(&lkb->lkb_callbacks, 0, in purge_proc_locks()
6266 list_del_init(&lkb->lkb_cb_list); in purge_proc_locks()
6267 dlm_put_lkb(lkb); in purge_proc_locks()
6276 struct dlm_lkb *lkb, *safe; in do_purge() local
6279 list_for_each_entry_safe(lkb, safe, &ls->ls_orphans, lkb_ownqueue) { in do_purge()
6280 if (pid && lkb->lkb_ownpid != pid) in do_purge()
6282 unlock_proc_lock(ls, lkb); in do_purge()
6283 list_del_init(&lkb->lkb_ownqueue); in do_purge()
6284 dlm_put_lkb(lkb); in do_purge()