Lines Matching refs:lockres
51 static inline int user_check_wait_flag(struct user_lock_res *lockres, in user_check_wait_flag() argument
56 spin_lock(&lockres->l_lock); in user_check_wait_flag()
57 ret = lockres->l_flags & flag; in user_check_wait_flag()
58 spin_unlock(&lockres->l_lock); in user_check_wait_flag()
63 static inline void user_wait_on_busy_lock(struct user_lock_res *lockres) in user_wait_on_busy_lock() argument
66 wait_event(lockres->l_event, in user_wait_on_busy_lock()
67 !user_check_wait_flag(lockres, USER_LOCK_BUSY)); in user_wait_on_busy_lock()
70 static inline void user_wait_on_blocked_lock(struct user_lock_res *lockres) in user_wait_on_blocked_lock() argument
73 wait_event(lockres->l_event, in user_wait_on_blocked_lock()
74 !user_check_wait_flag(lockres, USER_LOCK_BLOCKED)); in user_wait_on_blocked_lock()
79 cluster_connection_from_user_lockres(struct user_lock_res *lockres) in cluster_connection_from_user_lockres() argument
83 ip = container_of(lockres, in cluster_connection_from_user_lockres()
90 user_dlm_inode_from_user_lockres(struct user_lock_res *lockres) in user_dlm_inode_from_user_lockres() argument
94 ip = container_of(lockres, in user_dlm_inode_from_user_lockres()
100 static inline void user_recover_from_dlm_error(struct user_lock_res *lockres) in user_recover_from_dlm_error() argument
102 spin_lock(&lockres->l_lock); in user_recover_from_dlm_error()
103 lockres->l_flags &= ~USER_LOCK_BUSY; in user_recover_from_dlm_error()
104 spin_unlock(&lockres->l_lock); in user_recover_from_dlm_error()
129 struct user_lock_res *lockres = user_lksb_to_lock_res(lksb); in user_ast() local
133 lockres->l_namelen, lockres->l_name, lockres->l_level, in user_ast()
134 lockres->l_requested); in user_ast()
136 spin_lock(&lockres->l_lock); in user_ast()
138 status = ocfs2_dlm_lock_status(&lockres->l_lksb); in user_ast()
141 status, lockres->l_namelen, lockres->l_name); in user_ast()
142 spin_unlock(&lockres->l_lock); in user_ast()
146 mlog_bug_on_msg(lockres->l_requested == DLM_LOCK_IV, in user_ast()
148 lockres->l_namelen, lockres->l_name, lockres->l_flags); in user_ast()
151 if (lockres->l_requested < lockres->l_level) { in user_ast()
152 if (lockres->l_requested <= in user_ast()
153 user_highest_compat_lock_level(lockres->l_blocking)) { in user_ast()
154 lockres->l_blocking = DLM_LOCK_NL; in user_ast()
155 lockres->l_flags &= ~USER_LOCK_BLOCKED; in user_ast()
159 lockres->l_level = lockres->l_requested; in user_ast()
160 lockres->l_requested = DLM_LOCK_IV; in user_ast()
161 lockres->l_flags |= USER_LOCK_ATTACHED; in user_ast()
162 lockres->l_flags &= ~USER_LOCK_BUSY; in user_ast()
164 spin_unlock(&lockres->l_lock); in user_ast()
166 wake_up(&lockres->l_event); in user_ast()
169 static inline void user_dlm_grab_inode_ref(struct user_lock_res *lockres) in user_dlm_grab_inode_ref() argument
172 inode = user_dlm_inode_from_user_lockres(lockres); in user_dlm_grab_inode_ref()
179 static void __user_dlm_queue_lockres(struct user_lock_res *lockres) in __user_dlm_queue_lockres() argument
181 if (!(lockres->l_flags & USER_LOCK_QUEUED)) { in __user_dlm_queue_lockres()
182 user_dlm_grab_inode_ref(lockres); in __user_dlm_queue_lockres()
184 INIT_WORK(&lockres->l_work, user_dlm_unblock_lock); in __user_dlm_queue_lockres()
186 queue_work(user_dlm_worker, &lockres->l_work); in __user_dlm_queue_lockres()
187 lockres->l_flags |= USER_LOCK_QUEUED; in __user_dlm_queue_lockres()
191 static void __user_dlm_cond_queue_lockres(struct user_lock_res *lockres) in __user_dlm_cond_queue_lockres() argument
195 if (!(lockres->l_flags & USER_LOCK_BLOCKED)) in __user_dlm_cond_queue_lockres()
198 switch (lockres->l_blocking) { in __user_dlm_cond_queue_lockres()
200 if (!lockres->l_ex_holders && !lockres->l_ro_holders) in __user_dlm_cond_queue_lockres()
204 if (!lockres->l_ex_holders) in __user_dlm_cond_queue_lockres()
212 __user_dlm_queue_lockres(lockres); in __user_dlm_cond_queue_lockres()
217 struct user_lock_res *lockres = user_lksb_to_lock_res(lksb); in user_bast() local
220 lockres->l_namelen, lockres->l_name, level, lockres->l_level); in user_bast()
222 spin_lock(&lockres->l_lock); in user_bast()
223 lockres->l_flags |= USER_LOCK_BLOCKED; in user_bast()
224 if (level > lockres->l_blocking) in user_bast()
225 lockres->l_blocking = level; in user_bast()
227 __user_dlm_queue_lockres(lockres); in user_bast()
228 spin_unlock(&lockres->l_lock); in user_bast()
230 wake_up(&lockres->l_event); in user_bast()
235 struct user_lock_res *lockres = user_lksb_to_lock_res(lksb); in user_unlock_ast() local
238 lockres->l_namelen, lockres->l_name, lockres->l_flags); in user_unlock_ast()
243 spin_lock(&lockres->l_lock); in user_unlock_ast()
247 if (lockres->l_flags & USER_LOCK_IN_TEARDOWN in user_unlock_ast()
248 && !(lockres->l_flags & USER_LOCK_IN_CANCEL)) { in user_unlock_ast()
249 lockres->l_level = DLM_LOCK_IV; in user_unlock_ast()
254 BUG_ON(!(lockres->l_flags & USER_LOCK_IN_CANCEL)); in user_unlock_ast()
255 lockres->l_flags &= ~USER_LOCK_IN_CANCEL; in user_unlock_ast()
258 BUG_ON(!(lockres->l_flags & USER_LOCK_IN_CANCEL)); in user_unlock_ast()
260 lockres->l_requested = DLM_LOCK_IV; /* cancel an in user_unlock_ast()
263 lockres->l_flags &= ~USER_LOCK_IN_CANCEL; in user_unlock_ast()
266 if (lockres->l_flags & USER_LOCK_BLOCKED) in user_unlock_ast()
267 __user_dlm_queue_lockres(lockres); in user_unlock_ast()
270 lockres->l_flags &= ~USER_LOCK_BUSY; in user_unlock_ast()
272 spin_unlock(&lockres->l_lock); in user_unlock_ast()
274 wake_up(&lockres->l_event); in user_unlock_ast()
292 static inline void user_dlm_drop_inode_ref(struct user_lock_res *lockres) in user_dlm_drop_inode_ref() argument
295 inode = user_dlm_inode_from_user_lockres(lockres); in user_dlm_drop_inode_ref()
302 struct user_lock_res *lockres = in user_dlm_unblock_lock() local
305 cluster_connection_from_user_lockres(lockres); in user_dlm_unblock_lock()
307 mlog(0, "lockres %.*s\n", lockres->l_namelen, lockres->l_name); in user_dlm_unblock_lock()
309 spin_lock(&lockres->l_lock); in user_dlm_unblock_lock()
311 mlog_bug_on_msg(!(lockres->l_flags & USER_LOCK_QUEUED), in user_dlm_unblock_lock()
313 lockres->l_namelen, lockres->l_name, lockres->l_flags); in user_dlm_unblock_lock()
317 lockres->l_flags &= ~USER_LOCK_QUEUED; in user_dlm_unblock_lock()
324 if (!(lockres->l_flags & USER_LOCK_BLOCKED)) { in user_dlm_unblock_lock()
326 lockres->l_namelen, lockres->l_name); in user_dlm_unblock_lock()
327 spin_unlock(&lockres->l_lock); in user_dlm_unblock_lock()
331 if (lockres->l_flags & USER_LOCK_IN_TEARDOWN) { in user_dlm_unblock_lock()
333 lockres->l_namelen, lockres->l_name); in user_dlm_unblock_lock()
334 spin_unlock(&lockres->l_lock); in user_dlm_unblock_lock()
338 if (lockres->l_flags & USER_LOCK_BUSY) { in user_dlm_unblock_lock()
339 if (lockres->l_flags & USER_LOCK_IN_CANCEL) { in user_dlm_unblock_lock()
341 lockres->l_namelen, lockres->l_name); in user_dlm_unblock_lock()
342 spin_unlock(&lockres->l_lock); in user_dlm_unblock_lock()
346 lockres->l_flags |= USER_LOCK_IN_CANCEL; in user_dlm_unblock_lock()
347 spin_unlock(&lockres->l_lock); in user_dlm_unblock_lock()
349 status = ocfs2_dlm_unlock(conn, &lockres->l_lksb, in user_dlm_unblock_lock()
352 user_log_dlm_error("ocfs2_dlm_unlock", status, lockres); in user_dlm_unblock_lock()
359 if ((lockres->l_blocking == DLM_LOCK_EX) in user_dlm_unblock_lock()
360 && (lockres->l_ex_holders || lockres->l_ro_holders)) { in user_dlm_unblock_lock()
361 spin_unlock(&lockres->l_lock); in user_dlm_unblock_lock()
363 lockres->l_namelen, lockres->l_name, in user_dlm_unblock_lock()
364 lockres->l_ex_holders, lockres->l_ro_holders); in user_dlm_unblock_lock()
368 if ((lockres->l_blocking == DLM_LOCK_PR) in user_dlm_unblock_lock()
369 && lockres->l_ex_holders) { in user_dlm_unblock_lock()
370 spin_unlock(&lockres->l_lock); in user_dlm_unblock_lock()
372 lockres->l_namelen, lockres->l_name, in user_dlm_unblock_lock()
373 lockres->l_ex_holders); in user_dlm_unblock_lock()
378 new_level = user_highest_compat_lock_level(lockres->l_blocking); in user_dlm_unblock_lock()
379 lockres->l_requested = new_level; in user_dlm_unblock_lock()
380 lockres->l_flags |= USER_LOCK_BUSY; in user_dlm_unblock_lock()
382 lockres->l_namelen, lockres->l_name, lockres->l_level, new_level); in user_dlm_unblock_lock()
383 spin_unlock(&lockres->l_lock); in user_dlm_unblock_lock()
386 status = ocfs2_dlm_lock(conn, new_level, &lockres->l_lksb, in user_dlm_unblock_lock()
388 lockres->l_name, in user_dlm_unblock_lock()
389 lockres->l_namelen); in user_dlm_unblock_lock()
391 user_log_dlm_error("ocfs2_dlm_lock", status, lockres); in user_dlm_unblock_lock()
392 user_recover_from_dlm_error(lockres); in user_dlm_unblock_lock()
396 user_dlm_drop_inode_ref(lockres); in user_dlm_unblock_lock()
399 static inline void user_dlm_inc_holders(struct user_lock_res *lockres, in user_dlm_inc_holders() argument
404 lockres->l_ex_holders++; in user_dlm_inc_holders()
407 lockres->l_ro_holders++; in user_dlm_inc_holders()
418 user_may_continue_on_blocked_lock(struct user_lock_res *lockres, in user_may_continue_on_blocked_lock() argument
421 BUG_ON(!(lockres->l_flags & USER_LOCK_BLOCKED)); in user_may_continue_on_blocked_lock()
423 return wanted <= user_highest_compat_lock_level(lockres->l_blocking); in user_may_continue_on_blocked_lock()
426 int user_dlm_cluster_lock(struct user_lock_res *lockres, in user_dlm_cluster_lock() argument
432 cluster_connection_from_user_lockres(lockres); in user_dlm_cluster_lock()
437 lockres->l_namelen, lockres->l_name); in user_dlm_cluster_lock()
443 lockres->l_namelen, lockres->l_name, level, lkm_flags); in user_dlm_cluster_lock()
451 spin_lock(&lockres->l_lock); in user_dlm_cluster_lock()
456 if ((lockres->l_flags & USER_LOCK_BUSY) && in user_dlm_cluster_lock()
457 (level > lockres->l_level)) { in user_dlm_cluster_lock()
460 spin_unlock(&lockres->l_lock); in user_dlm_cluster_lock()
462 user_wait_on_busy_lock(lockres); in user_dlm_cluster_lock()
466 if ((lockres->l_flags & USER_LOCK_BLOCKED) && in user_dlm_cluster_lock()
467 (!user_may_continue_on_blocked_lock(lockres, level))) { in user_dlm_cluster_lock()
470 spin_unlock(&lockres->l_lock); in user_dlm_cluster_lock()
472 user_wait_on_blocked_lock(lockres); in user_dlm_cluster_lock()
476 if (level > lockres->l_level) { in user_dlm_cluster_lock()
478 if (lockres->l_level != DLM_LOCK_IV) in user_dlm_cluster_lock()
481 lockres->l_requested = level; in user_dlm_cluster_lock()
482 lockres->l_flags |= USER_LOCK_BUSY; in user_dlm_cluster_lock()
483 spin_unlock(&lockres->l_lock); in user_dlm_cluster_lock()
489 status = ocfs2_dlm_lock(conn, level, &lockres->l_lksb, in user_dlm_cluster_lock()
490 local_flags, lockres->l_name, in user_dlm_cluster_lock()
491 lockres->l_namelen); in user_dlm_cluster_lock()
496 status, lockres); in user_dlm_cluster_lock()
497 user_recover_from_dlm_error(lockres); in user_dlm_cluster_lock()
501 user_wait_on_busy_lock(lockres); in user_dlm_cluster_lock()
505 user_dlm_inc_holders(lockres, level); in user_dlm_cluster_lock()
506 spin_unlock(&lockres->l_lock); in user_dlm_cluster_lock()
513 static inline void user_dlm_dec_holders(struct user_lock_res *lockres, in user_dlm_dec_holders() argument
518 BUG_ON(!lockres->l_ex_holders); in user_dlm_dec_holders()
519 lockres->l_ex_holders--; in user_dlm_dec_holders()
522 BUG_ON(!lockres->l_ro_holders); in user_dlm_dec_holders()
523 lockres->l_ro_holders--; in user_dlm_dec_holders()
530 void user_dlm_cluster_unlock(struct user_lock_res *lockres, in user_dlm_cluster_unlock() argument
536 lockres->l_namelen, lockres->l_name); in user_dlm_cluster_unlock()
540 spin_lock(&lockres->l_lock); in user_dlm_cluster_unlock()
541 user_dlm_dec_holders(lockres, level); in user_dlm_cluster_unlock()
542 __user_dlm_cond_queue_lockres(lockres); in user_dlm_cluster_unlock()
543 spin_unlock(&lockres->l_lock); in user_dlm_cluster_unlock()
550 struct user_lock_res *lockres = &DLMFS_I(inode)->ip_lockres; in user_dlm_write_lvb() local
555 spin_lock(&lockres->l_lock); in user_dlm_write_lvb()
557 BUG_ON(lockres->l_level < DLM_LOCK_EX); in user_dlm_write_lvb()
558 lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in user_dlm_write_lvb()
561 spin_unlock(&lockres->l_lock); in user_dlm_write_lvb()
568 struct user_lock_res *lockres = &DLMFS_I(inode)->ip_lockres; in user_dlm_read_lvb() local
574 spin_lock(&lockres->l_lock); in user_dlm_read_lvb()
576 BUG_ON(lockres->l_level < DLM_LOCK_PR); in user_dlm_read_lvb()
577 if (ocfs2_dlm_lvb_valid(&lockres->l_lksb)) { in user_dlm_read_lvb()
578 lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in user_dlm_read_lvb()
583 spin_unlock(&lockres->l_lock); in user_dlm_read_lvb()
587 void user_dlm_lock_res_init(struct user_lock_res *lockres, in user_dlm_lock_res_init() argument
590 memset(lockres, 0, sizeof(*lockres)); in user_dlm_lock_res_init()
592 spin_lock_init(&lockres->l_lock); in user_dlm_lock_res_init()
593 init_waitqueue_head(&lockres->l_event); in user_dlm_lock_res_init()
594 lockres->l_level = DLM_LOCK_IV; in user_dlm_lock_res_init()
595 lockres->l_requested = DLM_LOCK_IV; in user_dlm_lock_res_init()
596 lockres->l_blocking = DLM_LOCK_IV; in user_dlm_lock_res_init()
601 memcpy(lockres->l_name, in user_dlm_lock_res_init()
604 lockres->l_namelen = dentry->d_name.len; in user_dlm_lock_res_init()
607 int user_dlm_destroy_lock(struct user_lock_res *lockres) in user_dlm_destroy_lock() argument
611 cluster_connection_from_user_lockres(lockres); in user_dlm_destroy_lock()
613 mlog(ML_BASTS, "lockres %.*s\n", lockres->l_namelen, lockres->l_name); in user_dlm_destroy_lock()
615 spin_lock(&lockres->l_lock); in user_dlm_destroy_lock()
616 if (lockres->l_flags & USER_LOCK_IN_TEARDOWN) { in user_dlm_destroy_lock()
617 spin_unlock(&lockres->l_lock); in user_dlm_destroy_lock()
621 lockres->l_flags |= USER_LOCK_IN_TEARDOWN; in user_dlm_destroy_lock()
623 while (lockres->l_flags & USER_LOCK_BUSY) { in user_dlm_destroy_lock()
624 spin_unlock(&lockres->l_lock); in user_dlm_destroy_lock()
626 user_wait_on_busy_lock(lockres); in user_dlm_destroy_lock()
628 spin_lock(&lockres->l_lock); in user_dlm_destroy_lock()
631 if (lockres->l_ro_holders || lockres->l_ex_holders) { in user_dlm_destroy_lock()
632 spin_unlock(&lockres->l_lock); in user_dlm_destroy_lock()
637 if (!(lockres->l_flags & USER_LOCK_ATTACHED)) { in user_dlm_destroy_lock()
638 spin_unlock(&lockres->l_lock); in user_dlm_destroy_lock()
642 lockres->l_flags &= ~USER_LOCK_ATTACHED; in user_dlm_destroy_lock()
643 lockres->l_flags |= USER_LOCK_BUSY; in user_dlm_destroy_lock()
644 spin_unlock(&lockres->l_lock); in user_dlm_destroy_lock()
646 status = ocfs2_dlm_unlock(conn, &lockres->l_lksb, DLM_LKF_VALBLK); in user_dlm_destroy_lock()
648 user_log_dlm_error("ocfs2_dlm_unlock", status, lockres); in user_dlm_destroy_lock()
652 user_wait_on_busy_lock(lockres); in user_dlm_destroy_lock()