Lines Matching refs:lockres
50 static inline int user_check_wait_flag(struct user_lock_res *lockres, in user_check_wait_flag() argument
55 spin_lock(&lockres->l_lock); in user_check_wait_flag()
56 ret = lockres->l_flags & flag; in user_check_wait_flag()
57 spin_unlock(&lockres->l_lock); in user_check_wait_flag()
62 static inline void user_wait_on_busy_lock(struct user_lock_res *lockres) in user_wait_on_busy_lock() argument
65 wait_event(lockres->l_event, in user_wait_on_busy_lock()
66 !user_check_wait_flag(lockres, USER_LOCK_BUSY)); in user_wait_on_busy_lock()
69 static inline void user_wait_on_blocked_lock(struct user_lock_res *lockres) in user_wait_on_blocked_lock() argument
72 wait_event(lockres->l_event, in user_wait_on_blocked_lock()
73 !user_check_wait_flag(lockres, USER_LOCK_BLOCKED)); in user_wait_on_blocked_lock()
78 cluster_connection_from_user_lockres(struct user_lock_res *lockres) in cluster_connection_from_user_lockres() argument
82 ip = container_of(lockres, in cluster_connection_from_user_lockres()
89 user_dlm_inode_from_user_lockres(struct user_lock_res *lockres) in user_dlm_inode_from_user_lockres() argument
93 ip = container_of(lockres, in user_dlm_inode_from_user_lockres()
99 static inline void user_recover_from_dlm_error(struct user_lock_res *lockres) in user_recover_from_dlm_error() argument
101 spin_lock(&lockres->l_lock); in user_recover_from_dlm_error()
102 lockres->l_flags &= ~USER_LOCK_BUSY; in user_recover_from_dlm_error()
103 spin_unlock(&lockres->l_lock); in user_recover_from_dlm_error()
128 struct user_lock_res *lockres = user_lksb_to_lock_res(lksb); in user_ast() local
132 lockres->l_namelen, lockres->l_name, lockres->l_level, in user_ast()
133 lockres->l_requested); in user_ast()
135 spin_lock(&lockres->l_lock); in user_ast()
137 status = ocfs2_dlm_lock_status(&lockres->l_lksb); in user_ast()
140 status, lockres->l_namelen, lockres->l_name); in user_ast()
141 spin_unlock(&lockres->l_lock); in user_ast()
145 mlog_bug_on_msg(lockres->l_requested == DLM_LOCK_IV, in user_ast()
147 lockres->l_namelen, lockres->l_name, lockres->l_flags); in user_ast()
150 if (lockres->l_requested < lockres->l_level) { in user_ast()
151 if (lockres->l_requested <= in user_ast()
152 user_highest_compat_lock_level(lockres->l_blocking)) { in user_ast()
153 lockres->l_blocking = DLM_LOCK_NL; in user_ast()
154 lockres->l_flags &= ~USER_LOCK_BLOCKED; in user_ast()
158 lockres->l_level = lockres->l_requested; in user_ast()
159 lockres->l_requested = DLM_LOCK_IV; in user_ast()
160 lockres->l_flags |= USER_LOCK_ATTACHED; in user_ast()
161 lockres->l_flags &= ~USER_LOCK_BUSY; in user_ast()
163 spin_unlock(&lockres->l_lock); in user_ast()
165 wake_up(&lockres->l_event); in user_ast()
168 static inline void user_dlm_grab_inode_ref(struct user_lock_res *lockres) in user_dlm_grab_inode_ref() argument
171 inode = user_dlm_inode_from_user_lockres(lockres); in user_dlm_grab_inode_ref()
178 static void __user_dlm_queue_lockres(struct user_lock_res *lockres) in __user_dlm_queue_lockres() argument
180 if (!(lockres->l_flags & USER_LOCK_QUEUED)) { in __user_dlm_queue_lockres()
181 user_dlm_grab_inode_ref(lockres); in __user_dlm_queue_lockres()
183 INIT_WORK(&lockres->l_work, user_dlm_unblock_lock); in __user_dlm_queue_lockres()
185 queue_work(user_dlm_worker, &lockres->l_work); in __user_dlm_queue_lockres()
186 lockres->l_flags |= USER_LOCK_QUEUED; in __user_dlm_queue_lockres()
190 static void __user_dlm_cond_queue_lockres(struct user_lock_res *lockres) in __user_dlm_cond_queue_lockres() argument
194 if (!(lockres->l_flags & USER_LOCK_BLOCKED)) in __user_dlm_cond_queue_lockres()
197 switch (lockres->l_blocking) { in __user_dlm_cond_queue_lockres()
199 if (!lockres->l_ex_holders && !lockres->l_ro_holders) in __user_dlm_cond_queue_lockres()
203 if (!lockres->l_ex_holders) in __user_dlm_cond_queue_lockres()
211 __user_dlm_queue_lockres(lockres); in __user_dlm_cond_queue_lockres()
216 struct user_lock_res *lockres = user_lksb_to_lock_res(lksb); in user_bast() local
219 lockres->l_namelen, lockres->l_name, level, lockres->l_level); in user_bast()
221 spin_lock(&lockres->l_lock); in user_bast()
222 lockres->l_flags |= USER_LOCK_BLOCKED; in user_bast()
223 if (level > lockres->l_blocking) in user_bast()
224 lockres->l_blocking = level; in user_bast()
226 __user_dlm_queue_lockres(lockres); in user_bast()
227 spin_unlock(&lockres->l_lock); in user_bast()
229 wake_up(&lockres->l_event); in user_bast()
234 struct user_lock_res *lockres = user_lksb_to_lock_res(lksb); in user_unlock_ast() local
237 lockres->l_namelen, lockres->l_name, lockres->l_flags); in user_unlock_ast()
242 spin_lock(&lockres->l_lock); in user_unlock_ast()
246 if (lockres->l_flags & USER_LOCK_IN_TEARDOWN in user_unlock_ast()
247 && !(lockres->l_flags & USER_LOCK_IN_CANCEL)) { in user_unlock_ast()
248 lockres->l_level = DLM_LOCK_IV; in user_unlock_ast()
253 BUG_ON(!(lockres->l_flags & USER_LOCK_IN_CANCEL)); in user_unlock_ast()
254 lockres->l_flags &= ~USER_LOCK_IN_CANCEL; in user_unlock_ast()
257 BUG_ON(!(lockres->l_flags & USER_LOCK_IN_CANCEL)); in user_unlock_ast()
259 lockres->l_requested = DLM_LOCK_IV; /* cancel an in user_unlock_ast()
262 lockres->l_flags &= ~USER_LOCK_IN_CANCEL; in user_unlock_ast()
265 if (lockres->l_flags & USER_LOCK_BLOCKED) in user_unlock_ast()
266 __user_dlm_queue_lockres(lockres); in user_unlock_ast()
269 lockres->l_flags &= ~USER_LOCK_BUSY; in user_unlock_ast()
271 spin_unlock(&lockres->l_lock); in user_unlock_ast()
273 wake_up(&lockres->l_event); in user_unlock_ast()
291 static inline void user_dlm_drop_inode_ref(struct user_lock_res *lockres) in user_dlm_drop_inode_ref() argument
294 inode = user_dlm_inode_from_user_lockres(lockres); in user_dlm_drop_inode_ref()
301 struct user_lock_res *lockres = in user_dlm_unblock_lock() local
304 cluster_connection_from_user_lockres(lockres); in user_dlm_unblock_lock()
306 mlog(0, "lockres %.*s\n", lockres->l_namelen, lockres->l_name); in user_dlm_unblock_lock()
308 spin_lock(&lockres->l_lock); in user_dlm_unblock_lock()
310 mlog_bug_on_msg(!(lockres->l_flags & USER_LOCK_QUEUED), in user_dlm_unblock_lock()
312 lockres->l_namelen, lockres->l_name, lockres->l_flags); in user_dlm_unblock_lock()
316 lockres->l_flags &= ~USER_LOCK_QUEUED; in user_dlm_unblock_lock()
323 if (!(lockres->l_flags & USER_LOCK_BLOCKED)) { in user_dlm_unblock_lock()
325 lockres->l_namelen, lockres->l_name); in user_dlm_unblock_lock()
326 spin_unlock(&lockres->l_lock); in user_dlm_unblock_lock()
330 if (lockres->l_flags & USER_LOCK_IN_TEARDOWN) { in user_dlm_unblock_lock()
332 lockres->l_namelen, lockres->l_name); in user_dlm_unblock_lock()
333 spin_unlock(&lockres->l_lock); in user_dlm_unblock_lock()
337 if (lockres->l_flags & USER_LOCK_BUSY) { in user_dlm_unblock_lock()
338 if (lockres->l_flags & USER_LOCK_IN_CANCEL) { in user_dlm_unblock_lock()
340 lockres->l_namelen, lockres->l_name); in user_dlm_unblock_lock()
341 spin_unlock(&lockres->l_lock); in user_dlm_unblock_lock()
345 lockres->l_flags |= USER_LOCK_IN_CANCEL; in user_dlm_unblock_lock()
346 spin_unlock(&lockres->l_lock); in user_dlm_unblock_lock()
348 status = ocfs2_dlm_unlock(conn, &lockres->l_lksb, in user_dlm_unblock_lock()
351 user_log_dlm_error("ocfs2_dlm_unlock", status, lockres); in user_dlm_unblock_lock()
358 if ((lockres->l_blocking == DLM_LOCK_EX) in user_dlm_unblock_lock()
359 && (lockres->l_ex_holders || lockres->l_ro_holders)) { in user_dlm_unblock_lock()
360 spin_unlock(&lockres->l_lock); in user_dlm_unblock_lock()
362 lockres->l_namelen, lockres->l_name, in user_dlm_unblock_lock()
363 lockres->l_ex_holders, lockres->l_ro_holders); in user_dlm_unblock_lock()
367 if ((lockres->l_blocking == DLM_LOCK_PR) in user_dlm_unblock_lock()
368 && lockres->l_ex_holders) { in user_dlm_unblock_lock()
369 spin_unlock(&lockres->l_lock); in user_dlm_unblock_lock()
371 lockres->l_namelen, lockres->l_name, in user_dlm_unblock_lock()
372 lockres->l_ex_holders); in user_dlm_unblock_lock()
377 new_level = user_highest_compat_lock_level(lockres->l_blocking); in user_dlm_unblock_lock()
378 lockres->l_requested = new_level; in user_dlm_unblock_lock()
379 lockres->l_flags |= USER_LOCK_BUSY; in user_dlm_unblock_lock()
381 lockres->l_namelen, lockres->l_name, lockres->l_level, new_level); in user_dlm_unblock_lock()
382 spin_unlock(&lockres->l_lock); in user_dlm_unblock_lock()
385 status = ocfs2_dlm_lock(conn, new_level, &lockres->l_lksb, in user_dlm_unblock_lock()
387 lockres->l_name, in user_dlm_unblock_lock()
388 lockres->l_namelen); in user_dlm_unblock_lock()
390 user_log_dlm_error("ocfs2_dlm_lock", status, lockres); in user_dlm_unblock_lock()
391 user_recover_from_dlm_error(lockres); in user_dlm_unblock_lock()
395 user_dlm_drop_inode_ref(lockres); in user_dlm_unblock_lock()
398 static inline void user_dlm_inc_holders(struct user_lock_res *lockres, in user_dlm_inc_holders() argument
403 lockres->l_ex_holders++; in user_dlm_inc_holders()
406 lockres->l_ro_holders++; in user_dlm_inc_holders()
417 user_may_continue_on_blocked_lock(struct user_lock_res *lockres, in user_may_continue_on_blocked_lock() argument
420 BUG_ON(!(lockres->l_flags & USER_LOCK_BLOCKED)); in user_may_continue_on_blocked_lock()
422 return wanted <= user_highest_compat_lock_level(lockres->l_blocking); in user_may_continue_on_blocked_lock()
425 int user_dlm_cluster_lock(struct user_lock_res *lockres, in user_dlm_cluster_lock() argument
431 cluster_connection_from_user_lockres(lockres); in user_dlm_cluster_lock()
436 lockres->l_namelen, lockres->l_name); in user_dlm_cluster_lock()
442 lockres->l_namelen, lockres->l_name, level, lkm_flags); in user_dlm_cluster_lock()
450 spin_lock(&lockres->l_lock); in user_dlm_cluster_lock()
455 if ((lockres->l_flags & USER_LOCK_BUSY) && in user_dlm_cluster_lock()
456 (level > lockres->l_level)) { in user_dlm_cluster_lock()
459 spin_unlock(&lockres->l_lock); in user_dlm_cluster_lock()
461 user_wait_on_busy_lock(lockres); in user_dlm_cluster_lock()
465 if ((lockres->l_flags & USER_LOCK_BLOCKED) && in user_dlm_cluster_lock()
466 (!user_may_continue_on_blocked_lock(lockres, level))) { in user_dlm_cluster_lock()
469 spin_unlock(&lockres->l_lock); in user_dlm_cluster_lock()
471 user_wait_on_blocked_lock(lockres); in user_dlm_cluster_lock()
475 if (level > lockres->l_level) { in user_dlm_cluster_lock()
477 if (lockres->l_level != DLM_LOCK_IV) in user_dlm_cluster_lock()
480 lockres->l_requested = level; in user_dlm_cluster_lock()
481 lockres->l_flags |= USER_LOCK_BUSY; in user_dlm_cluster_lock()
482 spin_unlock(&lockres->l_lock); in user_dlm_cluster_lock()
488 status = ocfs2_dlm_lock(conn, level, &lockres->l_lksb, in user_dlm_cluster_lock()
489 local_flags, lockres->l_name, in user_dlm_cluster_lock()
490 lockres->l_namelen); in user_dlm_cluster_lock()
495 status, lockres); in user_dlm_cluster_lock()
496 user_recover_from_dlm_error(lockres); in user_dlm_cluster_lock()
500 user_wait_on_busy_lock(lockres); in user_dlm_cluster_lock()
504 user_dlm_inc_holders(lockres, level); in user_dlm_cluster_lock()
505 spin_unlock(&lockres->l_lock); in user_dlm_cluster_lock()
512 static inline void user_dlm_dec_holders(struct user_lock_res *lockres, in user_dlm_dec_holders() argument
517 BUG_ON(!lockres->l_ex_holders); in user_dlm_dec_holders()
518 lockres->l_ex_holders--; in user_dlm_dec_holders()
521 BUG_ON(!lockres->l_ro_holders); in user_dlm_dec_holders()
522 lockres->l_ro_holders--; in user_dlm_dec_holders()
529 void user_dlm_cluster_unlock(struct user_lock_res *lockres, in user_dlm_cluster_unlock() argument
535 lockres->l_namelen, lockres->l_name); in user_dlm_cluster_unlock()
539 spin_lock(&lockres->l_lock); in user_dlm_cluster_unlock()
540 user_dlm_dec_holders(lockres, level); in user_dlm_cluster_unlock()
541 __user_dlm_cond_queue_lockres(lockres); in user_dlm_cluster_unlock()
542 spin_unlock(&lockres->l_lock); in user_dlm_cluster_unlock()
549 struct user_lock_res *lockres = &DLMFS_I(inode)->ip_lockres; in user_dlm_write_lvb() local
554 spin_lock(&lockres->l_lock); in user_dlm_write_lvb()
556 BUG_ON(lockres->l_level < DLM_LOCK_EX); in user_dlm_write_lvb()
557 lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in user_dlm_write_lvb()
560 spin_unlock(&lockres->l_lock); in user_dlm_write_lvb()
567 struct user_lock_res *lockres = &DLMFS_I(inode)->ip_lockres; in user_dlm_read_lvb() local
573 spin_lock(&lockres->l_lock); in user_dlm_read_lvb()
575 BUG_ON(lockres->l_level < DLM_LOCK_PR); in user_dlm_read_lvb()
576 if (ocfs2_dlm_lvb_valid(&lockres->l_lksb)) { in user_dlm_read_lvb()
577 lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in user_dlm_read_lvb()
582 spin_unlock(&lockres->l_lock); in user_dlm_read_lvb()
586 void user_dlm_lock_res_init(struct user_lock_res *lockres, in user_dlm_lock_res_init() argument
589 memset(lockres, 0, sizeof(*lockres)); in user_dlm_lock_res_init()
591 spin_lock_init(&lockres->l_lock); in user_dlm_lock_res_init()
592 init_waitqueue_head(&lockres->l_event); in user_dlm_lock_res_init()
593 lockres->l_level = DLM_LOCK_IV; in user_dlm_lock_res_init()
594 lockres->l_requested = DLM_LOCK_IV; in user_dlm_lock_res_init()
595 lockres->l_blocking = DLM_LOCK_IV; in user_dlm_lock_res_init()
600 memcpy(lockres->l_name, in user_dlm_lock_res_init()
603 lockres->l_namelen = dentry->d_name.len; in user_dlm_lock_res_init()
606 int user_dlm_destroy_lock(struct user_lock_res *lockres) in user_dlm_destroy_lock() argument
610 cluster_connection_from_user_lockres(lockres); in user_dlm_destroy_lock()
612 mlog(ML_BASTS, "lockres %.*s\n", lockres->l_namelen, lockres->l_name); in user_dlm_destroy_lock()
614 spin_lock(&lockres->l_lock); in user_dlm_destroy_lock()
615 if (lockres->l_flags & USER_LOCK_IN_TEARDOWN) { in user_dlm_destroy_lock()
616 spin_unlock(&lockres->l_lock); in user_dlm_destroy_lock()
620 lockres->l_flags |= USER_LOCK_IN_TEARDOWN; in user_dlm_destroy_lock()
622 while (lockres->l_flags & USER_LOCK_BUSY) { in user_dlm_destroy_lock()
623 spin_unlock(&lockres->l_lock); in user_dlm_destroy_lock()
625 user_wait_on_busy_lock(lockres); in user_dlm_destroy_lock()
627 spin_lock(&lockres->l_lock); in user_dlm_destroy_lock()
630 if (lockres->l_ro_holders || lockres->l_ex_holders) { in user_dlm_destroy_lock()
631 spin_unlock(&lockres->l_lock); in user_dlm_destroy_lock()
636 if (!(lockres->l_flags & USER_LOCK_ATTACHED)) { in user_dlm_destroy_lock()
637 spin_unlock(&lockres->l_lock); in user_dlm_destroy_lock()
641 lockres->l_flags &= ~USER_LOCK_ATTACHED; in user_dlm_destroy_lock()
642 lockres->l_flags |= USER_LOCK_BUSY; in user_dlm_destroy_lock()
643 spin_unlock(&lockres->l_lock); in user_dlm_destroy_lock()
645 status = ocfs2_dlm_unlock(conn, &lockres->l_lksb, DLM_LKF_VALBLK); in user_dlm_destroy_lock()
647 user_log_dlm_error("ocfs2_dlm_unlock", status, lockres); in user_dlm_destroy_lock()
651 user_wait_on_busy_lock(lockres); in user_dlm_destroy_lock()