Hi, On Tue, Aug 27, 2024 at 2:03 PM Alexander Aring <aahringo@xxxxxxxxxx> wrote: ... > + set_holder_state(lk, our_nodeid, mode); > + rv = check_valid_lock_holders(lk, mode, our_nodeid); > + if (rv) { > + /* the whole validation process, this event signals > + * everything is fine and DLM works correctly there > + * are no cluster-wide locks that violates DLM locking. > + */ > + da_handle_event_dlm(lk, with_others_compatible_dlm); > + } else { > + /* print all holders of the lock when a invalid lock state is entered */ > + console_lock(); I can't hold this lock in some contexts the ast callback can be called from. I will drop this lock as I don't care. It would be nice to use this msg callback from the refactor but then I somehow need to pass the lk pointer to it. This however works for me that I know at least which nodes/modes are incompatible if it hits. > + pr_info("---\n"); > + pr_info("ls_id %u lkb_id: 0x%08x\n", ls_id, lkb_id); > + pr_info("holders:\n"); > + list_for_each_entry(hl, &lk->holders, list) { > + pr_info("\tnodeid: %u mode: %d\n", hl->nodeid, > + hl->mode); > + } > + pr_info("---\n"); > + console_unlock(); > + > + /* move into an invalid state change, we don't have a edge for that > + * so we just use event_max_dlm. > + */ > + da_handle_event_dlm(lk, event_max_dlm); > + } > + spin_unlock_bh(&dlm_rv_hash_lock); > +} > + > +/* set the holder to transition state as lock downgrades can issue > + * grant messages to other nodes we need to ignore if a lock on a > + * specific node is in state transition. From point of DLM API > + * the user cannot assume to still hold the lock at this point > + * anyway. > + */ > +static void set_holder_transition(uint32_t ls_id, const char *res_name, > + size_t res_length, uint32_t our_nodeid) > +{ > + struct dlm_rv_holder *hl; > + struct dlm_rv_lock *lk; > + > + spin_lock_bh(&dlm_rv_hash_lock); > + lk = lookup_lock(ls_id, res_name, res_length); > + if (lk) { > + hl = lookup_holder(lk, our_nodeid); > + if (hl) > + hl->mode = STATE_MODE_IN_TRANSITION; > + } > + spin_unlock_bh(&dlm_rv_hash_lock); > +} > + > +/* after a lock request got validated it cannot fail */ > +static void handle_dlm_lock_validated(void *data, struct dlm_ls *ls, > + struct dlm_lkb *lkb, > + struct dlm_args *args, > + const char *res_name, size_t res_length) > +{ > + set_holder_transition(ls->ls_global_id, res_name, > + res_length, ls->ls_dn->our_node->id); > +} > + > +static void handle_dlm_unlock_validated(void *data, struct dlm_ls *ls, > + struct dlm_lkb *lkb, > + struct dlm_args *args) > +{ we need to ignore unlock(CANCEL) requests. > + set_holder_transition(ls->ls_global_id, > + lkb->lkb_resource->res_name, > + lkb->lkb_resource->res_length, > + ls->ls_dn->our_node->id); > +} > + - Alex