Lines Matching +full:lock +full:- +full:status

1 // SPDX-License-Identifier: GPL-2.0-or-later
65 * Return value from ->downconvert_worker functions.
74 * ->post_unlock callback */
76 * ->post_unlock() callback. */
117 struct ocfs2_meta_lvb *lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in ocfs2_dump_meta_lvb_info()
120 lockres->l_name, function, line); in ocfs2_dump_meta_lvb_info()
122 lvb->lvb_version, be32_to_cpu(lvb->lvb_iclusters), in ocfs2_dump_meta_lvb_info()
123 be32_to_cpu(lvb->lvb_igeneration)); in ocfs2_dump_meta_lvb_info()
125 (unsigned long long)be64_to_cpu(lvb->lvb_isize), in ocfs2_dump_meta_lvb_info()
126 be32_to_cpu(lvb->lvb_iuid), be32_to_cpu(lvb->lvb_igid), in ocfs2_dump_meta_lvb_info()
127 be16_to_cpu(lvb->lvb_imode)); in ocfs2_dump_meta_lvb_info()
129 "mtime_packed 0x%llx iattr 0x%x\n", be16_to_cpu(lvb->lvb_inlink), in ocfs2_dump_meta_lvb_info()
130 (long long)be64_to_cpu(lvb->lvb_iatime_packed), in ocfs2_dump_meta_lvb_info()
131 (long long)be64_to_cpu(lvb->lvb_ictime_packed), in ocfs2_dump_meta_lvb_info()
132 (long long)be64_to_cpu(lvb->lvb_imtime_packed), in ocfs2_dump_meta_lvb_info()
133 be32_to_cpu(lvb->lvb_iattr)); in ocfs2_dump_meta_lvb_info()
138 * OCFS2 Lock Resource Operations
142 * The most basic of lock types can point ->l_priv to their respective
145 * Right now, each lock type also needs to implement an init function,
146 * and trivial lock/unlock wrappers. ocfs2_simple_drop_lockres()
147 * should be called when the lock is no longer needed (i.e., object
153 * this callback if ->l_priv is not an ocfs2_super pointer
164 * by ->downconvert_worker()
169 * Allow a lock type to add checks to determine whether it is
170 * safe to downconvert a lock. Return 0 to re-queue the
181 * Allows a lock type to populate the lock value block. This
182 * is called on downconvert, and when we drop a lock.
193 * that a lock will be downconverted. This is called without
204 * of a lock type. Descriptions of each individual flag follow.
211 * meaningful (PRMODE or EXMODE) lock level is first obtained. If this
220 * Indicate that a lock type makes use of the lock value block. The
221 * ->set_lvb lock type callback must be defined.
289 return lockres->l_type == OCFS2_LOCK_TYPE_META || in ocfs2_is_inode_lock()
290 lockres->l_type == OCFS2_LOCK_TYPE_RW || in ocfs2_is_inode_lock()
291 lockres->l_type == OCFS2_LOCK_TYPE_OPEN; in ocfs2_is_inode_lock()
303 return (struct inode *) lockres->l_priv; in ocfs2_lock_res_inode()
308 BUG_ON(lockres->l_type != OCFS2_LOCK_TYPE_DENTRY); in ocfs2_lock_res_dl()
310 return (struct ocfs2_dentry_lock *)lockres->l_priv; in ocfs2_lock_res_dl()
315 BUG_ON(lockres->l_type != OCFS2_LOCK_TYPE_QINFO); in ocfs2_lock_res_qinfo()
317 return (struct ocfs2_mem_dqinfo *)lockres->l_priv; in ocfs2_lock_res_qinfo()
328 if (lockres->l_ops->get_osb) in ocfs2_get_lockres_osb()
329 return lockres->l_ops->get_osb(lockres); in ocfs2_get_lockres_osb()
331 return (struct ocfs2_super *)lockres->l_priv; in ocfs2_get_lockres_osb()
359 if ((_lockres)->l_type != OCFS2_LOCK_TYPE_DENTRY) \
361 _err, _func, _lockres->l_name); \
364 _err, _func, OCFS2_DENTRY_LOCK_INO_START - 1, (_lockres)->l_name, \
400 BUG_ON(len != (OCFS2_LOCK_ID_MAX_LEN - 1)); in ocfs2_build_lock_name()
402 mlog(0, "built lock resource with name: %s\n", name); in ocfs2_build_lock_name()
410 mlog(0, "Add tracking for lockres %s\n", res->l_name); in ocfs2_add_lockres_tracking()
413 list_add(&res->l_debug_list, &dlm_debug->d_lockres_tracking); in ocfs2_add_lockres_tracking()
420 if (!list_empty(&res->l_debug_list)) in ocfs2_remove_lockres_tracking()
421 list_del_init(&res->l_debug_list); in ocfs2_remove_lockres_tracking()
428 res->l_lock_refresh = 0; in ocfs2_init_lock_stats()
429 res->l_lock_wait = 0; in ocfs2_init_lock_stats()
430 memset(&res->l_lock_prmode, 0, sizeof(struct ocfs2_lock_stats)); in ocfs2_init_lock_stats()
431 memset(&res->l_lock_exmode, 0, sizeof(struct ocfs2_lock_stats)); in ocfs2_init_lock_stats()
442 stats = &res->l_lock_prmode; in ocfs2_update_lock_stats()
444 stats = &res->l_lock_exmode; in ocfs2_update_lock_stats()
448 kt = ktime_sub(ktime_get(), mw->mw_lock_start); in ocfs2_update_lock_stats()
451 stats->ls_gets++; in ocfs2_update_lock_stats()
452 stats->ls_total += ktime_to_ns(kt); in ocfs2_update_lock_stats()
454 if (unlikely(stats->ls_gets == 0)) { in ocfs2_update_lock_stats()
455 stats->ls_gets++; in ocfs2_update_lock_stats()
456 stats->ls_total = ktime_to_ns(kt); in ocfs2_update_lock_stats()
459 if (stats->ls_max < usec) in ocfs2_update_lock_stats()
460 stats->ls_max = usec; in ocfs2_update_lock_stats()
463 stats->ls_fail++; in ocfs2_update_lock_stats()
465 stats->ls_last = ktime_to_us(ktime_get_real()); in ocfs2_update_lock_stats()
470 lockres->l_lock_refresh++; in ocfs2_track_lock_refresh()
477 if (list_empty(&lockres->l_mask_waiters)) { in ocfs2_track_lock_wait()
478 lockres->l_lock_wait = 0; in ocfs2_track_lock_wait()
482 mw = list_first_entry(&lockres->l_mask_waiters, in ocfs2_track_lock_wait()
484 lockres->l_lock_wait = in ocfs2_track_lock_wait()
485 ktime_to_us(ktime_mono_to_real(mw->mw_lock_start)); in ocfs2_track_lock_wait()
490 mw->mw_lock_start = ktime_get(); in ocfs2_init_start_time()
517 res->l_type = type; in ocfs2_lock_res_init_common()
518 res->l_ops = ops; in ocfs2_lock_res_init_common()
519 res->l_priv = priv; in ocfs2_lock_res_init_common()
521 res->l_level = DLM_LOCK_IV; in ocfs2_lock_res_init_common()
522 res->l_requested = DLM_LOCK_IV; in ocfs2_lock_res_init_common()
523 res->l_blocking = DLM_LOCK_IV; in ocfs2_lock_res_init_common()
524 res->l_action = OCFS2_AST_INVALID; in ocfs2_lock_res_init_common()
525 res->l_unlock_action = OCFS2_UNLOCK_INVALID; in ocfs2_lock_res_init_common()
527 res->l_flags = OCFS2_LOCK_INITIALIZED; in ocfs2_lock_res_init_common()
529 ocfs2_add_lockres_tracking(res, osb->osb_dlm_debug); in ocfs2_lock_res_init_common()
534 lockdep_init_map(&res->l_lockdep_map, ocfs2_lock_type_strings[type], in ocfs2_lock_res_init_common()
537 res->l_lockdep_map.key = NULL; in ocfs2_lock_res_init_common()
543 /* This also clears out the lock status block */ in ocfs2_lock_res_init_once()
545 spin_lock_init(&res->l_lock); in ocfs2_lock_res_init_once()
546 init_waitqueue_head(&res->l_event); in ocfs2_lock_res_init_once()
547 INIT_LIST_HEAD(&res->l_blocked_list); in ocfs2_lock_res_init_once()
548 INIT_LIST_HEAD(&res->l_mask_waiters); in ocfs2_lock_res_init_once()
549 INIT_LIST_HEAD(&res->l_holders); in ocfs2_lock_res_init_once()
575 ocfs2_build_lock_name(type, OCFS2_I(inode)->ip_blkno, in ocfs2_inode_lock_res_init()
576 generation, res->l_name); in ocfs2_inode_lock_res_init()
577 ocfs2_lock_res_init_common(OCFS2_SB(inode->i_sb), res, type, ops, inode); in ocfs2_inode_lock_res_init()
584 return OCFS2_SB(inode->i_sb); in ocfs2_get_inode_osb()
589 struct ocfs2_mem_dqinfo *info = lockres->l_priv; in ocfs2_get_qinfo_osb()
591 return OCFS2_SB(info->dqi_gi.dqi_sb); in ocfs2_get_qinfo_osb()
596 struct ocfs2_file_private *fp = lockres->l_priv; in ocfs2_get_file_osb()
598 return OCFS2_SB(fp->fp_file->f_mapping->host->i_sb); in ocfs2_get_file_osb()
605 memcpy(&inode_blkno_be, &lockres->l_name[OCFS2_DENTRY_LOCK_INO_START], in ocfs2_get_dentry_lock_ino()
613 struct ocfs2_dentry_lock *dl = lockres->l_priv; in ocfs2_get_dentry_osb()
615 return OCFS2_SB(dl->dl_inode->i_sb); in ocfs2_get_dentry_osb()
622 u64 inode_blkno = OCFS2_I(inode)->ip_blkno; in ocfs2_dentry_lock_res_init()
624 struct ocfs2_lock_res *lockres = &dl->dl_lockres; in ocfs2_dentry_lock_res_init()
629 * Unfortunately, the standard lock naming scheme won't work in ocfs2_dentry_lock_res_init()
635 * binary lock names. The stringified names have been a in ocfs2_dentry_lock_res_init()
639 * NOTE: We also drop the standard "pad" value (the total lock in ocfs2_dentry_lock_res_init()
640 * name size stays the same though - the last part is all in ocfs2_dentry_lock_res_init()
643 len = snprintf(lockres->l_name, OCFS2_DENTRY_LOCK_INO_START, in ocfs2_dentry_lock_res_init()
648 BUG_ON(len != (OCFS2_DENTRY_LOCK_INO_START - 1)); in ocfs2_dentry_lock_res_init()
650 memcpy(&lockres->l_name[OCFS2_DENTRY_LOCK_INO_START], &inode_blkno_be, in ocfs2_dentry_lock_res_init()
653 ocfs2_lock_res_init_common(OCFS2_SB(inode->i_sb), lockres, in ocfs2_dentry_lock_res_init()
665 0, res->l_name); in ocfs2_super_lock_res_init()
676 ocfs2_build_lock_name(OCFS2_LOCK_TYPE_RENAME, 0, 0, res->l_name); in ocfs2_rename_lock_res_init()
687 ocfs2_build_lock_name(OCFS2_LOCK_TYPE_NFS_SYNC, 0, 0, res->l_name); in ocfs2_nfs_sync_lock_res_init()
694 ocfs2_nfs_sync_lock_res_init(&osb->osb_nfs_sync_lockres, osb); in ocfs2_nfs_sync_lock_init()
695 init_rwsem(&osb->nfs_sync_rwlock); in ocfs2_nfs_sync_lock_init()
700 struct ocfs2_lock_res *lockres = &osb->osb_trim_fs_lockres; in ocfs2_trim_fs_lock_res_init()
703 mutex_lock(&osb->obs_trim_fs_mutex); in ocfs2_trim_fs_lock_res_init()
706 ocfs2_build_lock_name(OCFS2_LOCK_TYPE_TRIM_FS, 0, 0, lockres->l_name); in ocfs2_trim_fs_lock_res_init()
713 struct ocfs2_lock_res *lockres = &osb->osb_trim_fs_lockres; in ocfs2_trim_fs_lock_res_uninit()
718 mutex_unlock(&osb->obs_trim_fs_mutex); in ocfs2_trim_fs_lock_res_uninit()
725 ocfs2_build_lock_name(OCFS2_LOCK_TYPE_ORPHAN_SCAN, 0, 0, res->l_name); in ocfs2_orphan_scan_lock_res_init()
733 struct inode *inode = fp->fp_file->f_mapping->host; in ocfs2_file_lock_res_init()
737 ocfs2_build_lock_name(OCFS2_LOCK_TYPE_FLOCK, oi->ip_blkno, in ocfs2_file_lock_res_init()
738 inode->i_generation, lockres->l_name); in ocfs2_file_lock_res_init()
739 ocfs2_lock_res_init_common(OCFS2_SB(inode->i_sb), lockres, in ocfs2_file_lock_res_init()
742 lockres->l_flags |= OCFS2_LOCK_NOCACHE; in ocfs2_file_lock_res_init()
749 ocfs2_build_lock_name(OCFS2_LOCK_TYPE_QINFO, info->dqi_gi.dqi_type, in ocfs2_qinfo_lock_res_init()
750 0, lockres->l_name); in ocfs2_qinfo_lock_res_init()
751 ocfs2_lock_res_init_common(OCFS2_SB(info->dqi_gi.dqi_sb), lockres, in ocfs2_qinfo_lock_res_init()
762 generation, lockres->l_name); in ocfs2_refcount_lock_res_init()
769 if (!(res->l_flags & OCFS2_LOCK_INITIALIZED)) in ocfs2_lock_res_free()
774 mlog_bug_on_msg(!list_empty(&res->l_blocked_list), in ocfs2_lock_res_free()
776 res->l_name); in ocfs2_lock_res_free()
777 mlog_bug_on_msg(!list_empty(&res->l_mask_waiters), in ocfs2_lock_res_free()
779 res->l_name); in ocfs2_lock_res_free()
780 mlog_bug_on_msg(spin_is_locked(&res->l_lock), in ocfs2_lock_res_free()
782 res->l_name); in ocfs2_lock_res_free()
783 mlog_bug_on_msg(res->l_ro_holders, in ocfs2_lock_res_free()
785 res->l_name, res->l_ro_holders); in ocfs2_lock_res_free()
786 mlog_bug_on_msg(res->l_ex_holders, in ocfs2_lock_res_free()
788 res->l_name, res->l_ex_holders); in ocfs2_lock_res_free()
790 /* Need to clear out the lock status block for the dlm */ in ocfs2_lock_res_free()
791 memset(&res->l_lksb, 0, sizeof(res->l_lksb)); in ocfs2_lock_res_free()
793 res->l_flags = 0UL; in ocfs2_lock_res_free()
803 INIT_LIST_HEAD(&oh->oh_list); in ocfs2_add_holder()
804 oh->oh_owner_pid = get_pid(task_pid(current)); in ocfs2_add_holder()
806 spin_lock(&lockres->l_lock); in ocfs2_add_holder()
807 list_add_tail(&oh->oh_list, &lockres->l_holders); in ocfs2_add_holder()
808 spin_unlock(&lockres->l_lock); in ocfs2_add_holder()
817 spin_lock(&lockres->l_lock); in ocfs2_pid_holder()
818 list_for_each_entry(oh, &lockres->l_holders, oh_list) { in ocfs2_pid_holder()
819 if (oh->oh_owner_pid == pid) { in ocfs2_pid_holder()
820 spin_unlock(&lockres->l_lock); in ocfs2_pid_holder()
824 spin_unlock(&lockres->l_lock); in ocfs2_pid_holder()
831 spin_lock(&lockres->l_lock); in ocfs2_remove_holder()
832 list_del(&oh->oh_list); in ocfs2_remove_holder()
833 spin_unlock(&lockres->l_lock); in ocfs2_remove_holder()
835 put_pid(oh->oh_owner_pid); in ocfs2_remove_holder()
846 lockres->l_ex_holders++; in ocfs2_inc_holders()
849 lockres->l_ro_holders++; in ocfs2_inc_holders()
863 BUG_ON(!lockres->l_ex_holders); in ocfs2_dec_holders()
864 lockres->l_ex_holders--; in ocfs2_dec_holders()
867 BUG_ON(!lockres->l_ro_holders); in ocfs2_dec_holders()
868 lockres->l_ro_holders--; in ocfs2_dec_holders()
875 /* WARNING: This function lives in a world where the only three lock
877 * lock types are added. */
894 assert_spin_locked(&lockres->l_lock); in lockres_set_flags()
896 lockres->l_flags = newflags; in lockres_set_flags()
898 list_for_each_entry_safe(mw, tmp, &lockres->l_mask_waiters, mw_item) { in lockres_set_flags()
899 if ((lockres->l_flags & mw->mw_mask) != mw->mw_goal) in lockres_set_flags()
902 list_del_init(&mw->mw_item); in lockres_set_flags()
903 mw->mw_status = 0; in lockres_set_flags()
904 complete(&mw->mw_complete); in lockres_set_flags()
910 lockres_set_flags(lockres, lockres->l_flags | or); in lockres_or_flags()
915 lockres_set_flags(lockres, lockres->l_flags & ~clear); in lockres_clear_flags()
920 BUG_ON(!(lockres->l_flags & OCFS2_LOCK_BUSY)); in ocfs2_generic_handle_downconvert_action()
921 BUG_ON(!(lockres->l_flags & OCFS2_LOCK_ATTACHED)); in ocfs2_generic_handle_downconvert_action()
922 BUG_ON(!(lockres->l_flags & OCFS2_LOCK_BLOCKED)); in ocfs2_generic_handle_downconvert_action()
923 BUG_ON(lockres->l_blocking <= DLM_LOCK_NL); in ocfs2_generic_handle_downconvert_action()
925 lockres->l_level = lockres->l_requested; in ocfs2_generic_handle_downconvert_action()
926 if (lockres->l_level <= in ocfs2_generic_handle_downconvert_action()
927 ocfs2_highest_compat_lock_level(lockres->l_blocking)) { in ocfs2_generic_handle_downconvert_action()
928 lockres->l_blocking = DLM_LOCK_NL; in ocfs2_generic_handle_downconvert_action()
936 BUG_ON(!(lockres->l_flags & OCFS2_LOCK_BUSY)); in ocfs2_generic_handle_convert_action()
937 BUG_ON(!(lockres->l_flags & OCFS2_LOCK_ATTACHED)); in ocfs2_generic_handle_convert_action()
943 if (lockres->l_level == DLM_LOCK_NL && in ocfs2_generic_handle_convert_action()
944 lockres->l_ops->flags & LOCK_TYPE_REQUIRES_REFRESH) in ocfs2_generic_handle_convert_action()
947 lockres->l_level = lockres->l_requested; in ocfs2_generic_handle_convert_action()
952 * downconverting the lock before the upconvert has fully completed. in ocfs2_generic_handle_convert_action()
953 * Do not prevent the dc thread from downconverting if NONBLOCK lock in ocfs2_generic_handle_convert_action()
956 if (!(lockres->l_flags & OCFS2_LOCK_NONBLOCK_FINISHED)) in ocfs2_generic_handle_convert_action()
966 BUG_ON((!(lockres->l_flags & OCFS2_LOCK_BUSY))); in ocfs2_generic_handle_attach_action()
967 BUG_ON(lockres->l_flags & OCFS2_LOCK_ATTACHED); in ocfs2_generic_handle_attach_action()
969 if (lockres->l_requested > DLM_LOCK_NL && in ocfs2_generic_handle_attach_action()
970 !(lockres->l_flags & OCFS2_LOCK_LOCAL) && in ocfs2_generic_handle_attach_action()
971 lockres->l_ops->flags & LOCK_TYPE_REQUIRES_REFRESH) in ocfs2_generic_handle_attach_action()
974 lockres->l_level = lockres->l_requested; in ocfs2_generic_handle_attach_action()
984 assert_spin_locked(&lockres->l_lock); in ocfs2_generic_handle_bast()
986 if (level > lockres->l_blocking) { in ocfs2_generic_handle_bast()
992 ocfs2_highest_compat_lock_level(lockres->l_blocking)) in ocfs2_generic_handle_bast()
995 lockres->l_blocking = level; in ocfs2_generic_handle_bast()
999 lockres->l_name, level, lockres->l_level, lockres->l_blocking, in ocfs2_generic_handle_bast()
1024 * new locking action? The other path has re-set PENDING. Our path
1025 * cannot clear PENDING, because that will re-open the original race
1071 assert_spin_locked(&lockres->l_lock); in __lockres_clear_pending()
1077 if (!(lockres->l_flags & OCFS2_LOCK_PENDING) || in __lockres_clear_pending()
1078 (lockres->l_pending_gen != generation)) in __lockres_clear_pending()
1082 lockres->l_pending_gen++; in __lockres_clear_pending()
1088 if (lockres->l_flags & OCFS2_LOCK_BLOCKED) in __lockres_clear_pending()
1099 spin_lock_irqsave(&lockres->l_lock, flags); in lockres_clear_pending()
1101 spin_unlock_irqrestore(&lockres->l_lock, flags); in lockres_clear_pending()
1106 assert_spin_locked(&lockres->l_lock); in lockres_set_pending()
1107 BUG_ON(!(lockres->l_flags & OCFS2_LOCK_BUSY)); in lockres_set_pending()
1111 return lockres->l_pending_gen; in lockres_set_pending()
1124 "type %s\n", lockres->l_name, level, lockres->l_level, in ocfs2_blocking_ast()
1125 ocfs2_lock_type_string(lockres->l_type)); in ocfs2_blocking_ast()
1128 * We can skip the bast for locks which don't enable caching - in ocfs2_blocking_ast()
1131 if (lockres->l_flags & OCFS2_LOCK_NOCACHE) in ocfs2_blocking_ast()
1134 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_blocking_ast()
1138 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_blocking_ast()
1140 wake_up(&lockres->l_event); in ocfs2_blocking_ast()
1150 int status; in ocfs2_locking_ast() local
1152 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_locking_ast()
1154 status = ocfs2_dlm_lock_status(&lockres->l_lksb); in ocfs2_locking_ast()
1156 if (status == -EAGAIN) { in ocfs2_locking_ast()
1161 if (status) { in ocfs2_locking_ast()
1162 mlog(ML_ERROR, "lockres %s: lksb status value of %d!\n", in ocfs2_locking_ast()
1163 lockres->l_name, status); in ocfs2_locking_ast()
1164 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_locking_ast()
1169 "level %d => %d\n", lockres->l_name, lockres->l_action, in ocfs2_locking_ast()
1170 lockres->l_unlock_action, lockres->l_level, lockres->l_requested); in ocfs2_locking_ast()
1172 switch(lockres->l_action) { in ocfs2_locking_ast()
1186 lockres->l_name, lockres->l_action, lockres->l_flags, in ocfs2_locking_ast()
1187 lockres->l_unlock_action); in ocfs2_locking_ast()
1193 lockres->l_action = OCFS2_AST_INVALID; in ocfs2_locking_ast()
1195 /* Did we try to cancel this lock? Clear that state */ in ocfs2_locking_ast()
1196 if (lockres->l_unlock_action == OCFS2_UNLOCK_CANCEL_CONVERT) in ocfs2_locking_ast()
1197 lockres->l_unlock_action = OCFS2_UNLOCK_INVALID; in ocfs2_locking_ast()
1201 * know that dlm_lock() has been called :-) in ocfs2_locking_ast()
1202 * Because we can't have two lock calls in flight at once, we in ocfs2_locking_ast()
1203 * can use lockres->l_pending_gen. in ocfs2_locking_ast()
1205 __lockres_clear_pending(lockres, lockres->l_pending_gen, osb); in ocfs2_locking_ast()
1207 wake_up(&lockres->l_event); in ocfs2_locking_ast()
1208 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_locking_ast()
1217 lockres->l_name, lockres->l_unlock_action); in ocfs2_unlock_ast()
1219 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_unlock_ast()
1221 mlog(ML_ERROR, "Dlm passes error %d for lock %s, " in ocfs2_unlock_ast()
1222 "unlock_action %d\n", error, lockres->l_name, in ocfs2_unlock_ast()
1223 lockres->l_unlock_action); in ocfs2_unlock_ast()
1224 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_unlock_ast()
1228 switch(lockres->l_unlock_action) { in ocfs2_unlock_ast()
1230 mlog(0, "Cancel convert success for %s\n", lockres->l_name); in ocfs2_unlock_ast()
1231 lockres->l_action = OCFS2_AST_INVALID; in ocfs2_unlock_ast()
1232 /* Downconvert thread may have requeued this lock, we in ocfs2_unlock_ast()
1234 if (lockres->l_flags & OCFS2_LOCK_BLOCKED) in ocfs2_unlock_ast()
1238 lockres->l_level = DLM_LOCK_IV; in ocfs2_unlock_ast()
1245 lockres->l_unlock_action = OCFS2_UNLOCK_INVALID; in ocfs2_unlock_ast()
1246 wake_up(&lockres->l_event); in ocfs2_unlock_ast()
1247 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_unlock_ast()
1251 * This is the filesystem locking protocol. It provides the lock handling
1257 * lock, orders them differently, does different things underneath a lock),
1293 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_recover_from_dlm_error()
1297 lockres->l_action = OCFS2_AST_INVALID; in ocfs2_recover_from_dlm_error()
1299 lockres->l_unlock_action = OCFS2_UNLOCK_INVALID; in ocfs2_recover_from_dlm_error()
1300 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_recover_from_dlm_error()
1302 wake_up(&lockres->l_event); in ocfs2_recover_from_dlm_error()
1305 /* Note: If we detect another process working on the lock (i.e.,
1318 mlog(0, "lock %s, level = %d, flags = %u\n", lockres->l_name, level, in ocfs2_lock_create()
1321 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_lock_create()
1322 if ((lockres->l_flags & OCFS2_LOCK_ATTACHED) || in ocfs2_lock_create()
1323 (lockres->l_flags & OCFS2_LOCK_BUSY)) { in ocfs2_lock_create()
1324 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_lock_create()
1328 lockres->l_action = OCFS2_AST_ATTACH; in ocfs2_lock_create()
1329 lockres->l_requested = level; in ocfs2_lock_create()
1332 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_lock_create()
1334 ret = ocfs2_dlm_lock(osb->cconn, in ocfs2_lock_create()
1336 &lockres->l_lksb, in ocfs2_lock_create()
1338 lockres->l_name, in ocfs2_lock_create()
1339 OCFS2_LOCK_ID_MAX_LEN - 1); in ocfs2_lock_create()
1346 mlog(0, "lock %s, return from ocfs2_dlm_lock\n", lockres->l_name); in ocfs2_lock_create()
1358 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_check_wait_flag()
1359 ret = lockres->l_flags & flag; in ocfs2_check_wait_flag()
1360 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_check_wait_flag()
1368 wait_event(lockres->l_event, in ocfs2_wait_on_busy_lock()
1375 wait_event(lockres->l_event, in ocfs2_wait_on_refreshing_lock()
1379 /* predict what lock level we'll be dropping down to on behalf
1385 BUG_ON(!(lockres->l_flags & OCFS2_LOCK_BLOCKED)); in ocfs2_may_continue_on_blocked_lock()
1387 return wanted <= ocfs2_highest_compat_lock_level(lockres->l_blocking); in ocfs2_may_continue_on_blocked_lock()
1392 INIT_LIST_HEAD(&mw->mw_item); in ocfs2_init_mask_waiter()
1393 init_completion(&mw->mw_complete); in ocfs2_init_mask_waiter()
1399 wait_for_completion(&mw->mw_complete); in ocfs2_wait_for_mask()
1400 /* Re-arm the completion in case we want to wait on it again */ in ocfs2_wait_for_mask()
1401 reinit_completion(&mw->mw_complete); in ocfs2_wait_for_mask()
1402 return mw->mw_status; in ocfs2_wait_for_mask()
1410 BUG_ON(!list_empty(&mw->mw_item)); in lockres_add_mask_waiter()
1412 assert_spin_locked(&lockres->l_lock); in lockres_add_mask_waiter()
1414 list_add_tail(&mw->mw_item, &lockres->l_mask_waiters); in lockres_add_mask_waiter()
1415 mw->mw_mask = mask; in lockres_add_mask_waiter()
1416 mw->mw_goal = goal; in lockres_add_mask_waiter()
1420 /* returns 0 if the mw that was removed was already satisfied, -EBUSY
1427 assert_spin_locked(&lockres->l_lock); in __lockres_remove_mask_waiter()
1428 if (!list_empty(&mw->mw_item)) { in __lockres_remove_mask_waiter()
1429 if ((lockres->l_flags & mw->mw_mask) != mw->mw_goal) in __lockres_remove_mask_waiter()
1430 ret = -EBUSY; in __lockres_remove_mask_waiter()
1432 list_del_init(&mw->mw_item); in __lockres_remove_mask_waiter()
1433 init_completion(&mw->mw_complete); in __lockres_remove_mask_waiter()
1446 spin_lock_irqsave(&lockres->l_lock, flags); in lockres_remove_mask_waiter()
1448 spin_unlock_irqrestore(&lockres->l_lock, flags); in lockres_remove_mask_waiter()
1459 ret = wait_for_completion_interruptible(&mw->mw_complete); in ocfs2_wait_for_mask_interruptible()
1463 ret = mw->mw_status; in ocfs2_wait_for_mask_interruptible()
1464 /* Re-arm the completion in case we want to wait on it again */ in ocfs2_wait_for_mask_interruptible()
1465 reinit_completion(&mw->mw_complete); in ocfs2_wait_for_mask_interruptible()
1478 int wait, catch_signals = !(osb->s_mount_opt & OCFS2_MOUNT_NOINTR); in __ocfs2_cluster_lock()
1486 if (!(lockres->l_flags & OCFS2_LOCK_INITIALIZED)) { in __ocfs2_cluster_lock()
1487 mlog_errno(-EINVAL); in __ocfs2_cluster_lock()
1488 return -EINVAL; in __ocfs2_cluster_lock()
1493 if (lockres->l_ops->flags & LOCK_TYPE_USES_LVB) in __ocfs2_cluster_lock()
1499 spin_lock_irqsave(&lockres->l_lock, flags); in __ocfs2_cluster_lock()
1502 ret = -ERESTARTSYS; in __ocfs2_cluster_lock()
1506 mlog_bug_on_msg(lockres->l_flags & OCFS2_LOCK_FREEING, in __ocfs2_cluster_lock()
1507 "Cluster lock called on freeing lockres %s! flags " in __ocfs2_cluster_lock()
1508 "0x%lx\n", lockres->l_name, lockres->l_flags); in __ocfs2_cluster_lock()
1511 * here. If the lock is blocked waiting on a downconvert, in __ocfs2_cluster_lock()
1513 if (lockres->l_flags & OCFS2_LOCK_BUSY && in __ocfs2_cluster_lock()
1514 level > lockres->l_level) { in __ocfs2_cluster_lock()
1522 if (lockres->l_flags & OCFS2_LOCK_UPCONVERT_FINISHING) { in __ocfs2_cluster_lock()
1524 * We've upconverted. If the lock now has a level we can in __ocfs2_cluster_lock()
1525 * work with, we take it. If, however, the lock is not at the in __ocfs2_cluster_lock()
1531 * requesting PR take the lock. in __ocfs2_cluster_lock()
1533 * here will take the lock. The others will have to go thru the in __ocfs2_cluster_lock()
1537 if (level <= lockres->l_level) in __ocfs2_cluster_lock()
1541 if (lockres->l_flags & OCFS2_LOCK_BLOCKED && in __ocfs2_cluster_lock()
1543 /* is the lock is currently blocked on behalf of in __ocfs2_cluster_lock()
1550 if (level > lockres->l_level) { in __ocfs2_cluster_lock()
1552 ret = -EAGAIN; in __ocfs2_cluster_lock()
1558 if (lockres->l_action != OCFS2_AST_INVALID) in __ocfs2_cluster_lock()
1560 lockres->l_name, lockres->l_action); in __ocfs2_cluster_lock()
1562 if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED)) { in __ocfs2_cluster_lock()
1563 lockres->l_action = OCFS2_AST_ATTACH; in __ocfs2_cluster_lock()
1566 lockres->l_action = OCFS2_AST_CONVERT; in __ocfs2_cluster_lock()
1570 lockres->l_requested = level; in __ocfs2_cluster_lock()
1573 spin_unlock_irqrestore(&lockres->l_lock, flags); in __ocfs2_cluster_lock()
1579 lockres->l_name, lockres->l_level, level); in __ocfs2_cluster_lock()
1581 /* call dlm_lock to upgrade lock now */ in __ocfs2_cluster_lock()
1582 ret = ocfs2_dlm_lock(osb->cconn, in __ocfs2_cluster_lock()
1584 &lockres->l_lksb, in __ocfs2_cluster_lock()
1586 lockres->l_name, in __ocfs2_cluster_lock()
1587 OCFS2_LOCK_ID_MAX_LEN - 1); in __ocfs2_cluster_lock()
1591 (ret != -EAGAIN)) { in __ocfs2_cluster_lock()
1600 mlog(0, "lock %s, successful return from ocfs2_dlm_lock\n", in __ocfs2_cluster_lock()
1601 lockres->l_name); in __ocfs2_cluster_lock()
1620 kick_dc = (lockres->l_flags & OCFS2_LOCK_BLOCKED); in __ocfs2_cluster_lock()
1622 spin_unlock_irqrestore(&lockres->l_lock, flags); in __ocfs2_cluster_lock()
1627 * This is helping work around a lock inversion between the page lock in __ocfs2_cluster_lock()
1628 * and dlm locks. One path holds the page lock while calling aops in __ocfs2_cluster_lock()
1632 * off to unlock its page lock before trying the dlm lock again. in __ocfs2_cluster_lock()
1637 spin_lock_irqsave(&lockres->l_lock, flags); in __ocfs2_cluster_lock()
1642 spin_unlock_irqrestore(&lockres->l_lock, flags); in __ocfs2_cluster_lock()
1643 ret = -EAGAIN; in __ocfs2_cluster_lock()
1645 spin_unlock_irqrestore(&lockres->l_lock, flags); in __ocfs2_cluster_lock()
1658 if (!ret && lockres->l_lockdep_map.key != NULL) { in __ocfs2_cluster_lock()
1660 rwsem_acquire_read(&lockres->l_lockdep_map, l_subclass, in __ocfs2_cluster_lock()
1664 rwsem_acquire(&lockres->l_lockdep_map, l_subclass, in __ocfs2_cluster_lock()
1690 spin_lock_irqsave(&lockres->l_lock, flags); in __ocfs2_cluster_unlock()
1693 spin_unlock_irqrestore(&lockres->l_lock, flags); in __ocfs2_cluster_unlock()
1695 if (lockres->l_lockdep_map.key != NULL) in __ocfs2_cluster_unlock()
1696 rwsem_release(&lockres->l_lockdep_map, caller_ip); in __ocfs2_cluster_unlock()
1709 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_create_new_lock()
1710 BUG_ON(lockres->l_flags & OCFS2_LOCK_ATTACHED); in ocfs2_create_new_lock()
1712 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_create_new_lock()
1717 /* Grants us an EX lock on the data and metadata resources, skipping
1722 * with creating a new lock resource. */
1726 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_create_new_inode_locks()
1730 mlog(0, "Inode %llu\n", (unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_create_new_inode_locks()
1736 * is concerned, this is basically like acquiring an EX lock in ocfs2_create_new_inode_locks()
1737 * on a resource which has an invalid one -- we'll set it in ocfs2_create_new_inode_locks()
1740 ret = ocfs2_create_new_lock(osb, &OCFS2_I(inode)->ip_rw_lockres, 1, 1); in ocfs2_create_new_inode_locks()
1747 * We don't want to use DLM_LKF_LOCAL on a meta data lock as they in ocfs2_create_new_inode_locks()
1748 * don't use a generation in their lock names. in ocfs2_create_new_inode_locks()
1750 ret = ocfs2_create_new_lock(osb, &OCFS2_I(inode)->ip_inode_lockres, 1, 0); in ocfs2_create_new_inode_locks()
1756 ret = ocfs2_create_new_lock(osb, &OCFS2_I(inode)->ip_open_lockres, 0, 0); in ocfs2_create_new_inode_locks()
1766 int status, level; in ocfs2_rw_lock() local
1768 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_rw_lock()
1770 mlog(0, "inode %llu take %s RW lock\n", in ocfs2_rw_lock()
1771 (unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_rw_lock()
1777 lockres = &OCFS2_I(inode)->ip_rw_lockres; in ocfs2_rw_lock()
1781 status = ocfs2_cluster_lock(osb, lockres, level, 0, 0); in ocfs2_rw_lock()
1782 if (status < 0) in ocfs2_rw_lock()
1783 mlog_errno(status); in ocfs2_rw_lock()
1785 return status; in ocfs2_rw_lock()
1790 int status, level; in ocfs2_try_rw_lock() local
1792 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_try_rw_lock()
1794 mlog(0, "inode %llu try to take %s RW lock\n", in ocfs2_try_rw_lock()
1795 (unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_try_rw_lock()
1801 lockres = &OCFS2_I(inode)->ip_rw_lockres; in ocfs2_try_rw_lock()
1805 status = ocfs2_cluster_lock(osb, lockres, level, DLM_LKF_NOQUEUE, 0); in ocfs2_try_rw_lock()
1806 return status; in ocfs2_try_rw_lock()
1812 struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_rw_lockres; in ocfs2_rw_unlock()
1813 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_rw_unlock()
1815 mlog(0, "inode %llu drop %s RW lock\n", in ocfs2_rw_unlock()
1816 (unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_rw_unlock()
1824 * ocfs2_open_lock always get PR mode lock.
1828 int status = 0; in ocfs2_open_lock() local
1830 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_open_lock()
1832 mlog(0, "inode %llu take PRMODE open lock\n", in ocfs2_open_lock()
1833 (unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_open_lock()
1838 lockres = &OCFS2_I(inode)->ip_open_lockres; in ocfs2_open_lock()
1840 status = ocfs2_cluster_lock(osb, lockres, DLM_LOCK_PR, 0, 0); in ocfs2_open_lock()
1841 if (status < 0) in ocfs2_open_lock()
1842 mlog_errno(status); in ocfs2_open_lock()
1845 return status; in ocfs2_open_lock()
1850 int status = 0, level; in ocfs2_try_open_lock() local
1852 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_try_open_lock()
1854 mlog(0, "inode %llu try to take %s open lock\n", in ocfs2_try_open_lock()
1855 (unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_try_open_lock()
1860 status = -EROFS; in ocfs2_try_open_lock()
1867 lockres = &OCFS2_I(inode)->ip_open_lockres; in ocfs2_try_open_lock()
1872 * The file system may already holding a PRMODE/EXMODE open lock. in ocfs2_try_open_lock()
1874 * other nodes and the -EAGAIN will indicate to the caller that in ocfs2_try_open_lock()
1877 status = ocfs2_cluster_lock(osb, lockres, level, DLM_LKF_NOQUEUE, 0); in ocfs2_try_open_lock()
1880 return status; in ocfs2_try_open_lock()
1888 struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_open_lockres; in ocfs2_open_unlock()
1889 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_open_unlock()
1891 mlog(0, "inode %llu drop open lock\n", in ocfs2_open_unlock()
1892 (unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_open_unlock()
1897 if(lockres->l_ro_holders) in ocfs2_open_unlock()
1899 if(lockres->l_ex_holders) in ocfs2_open_unlock()
1917 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_flock_handle_signal()
1918 if (lockres->l_flags & OCFS2_LOCK_BUSY) { in ocfs2_flock_handle_signal()
1921 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_flock_handle_signal()
1930 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_flock_handle_signal()
1936 ret = -ERESTARTSYS; in ocfs2_flock_handle_signal()
1938 * We may still have gotten the lock, in which case there's no in ocfs2_flock_handle_signal()
1941 if (lockres->l_level == level) in ocfs2_flock_handle_signal()
1945 lockres->l_flags, lockres->l_level, lockres->l_action); in ocfs2_flock_handle_signal()
1947 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_flock_handle_signal()
1956 * different from all other cluster lock types that we implement a
1957 * separate path to the "low-level" dlm calls. In particular:
1959 * - No optimization of lock levels is done - we take at exactly
1962 * - No lock caching is employed. We immediately downconvert to
1963 * no-lock at unlock time. This also means flock locks never go on
1966 * - Since userspace can trivially deadlock itself with flock, we make
1970 * - Access to any flock lockres doesn't require concurrency, so we
1979 struct ocfs2_file_private *fp = file->private_data; in ocfs2_file_lock()
1980 struct ocfs2_lock_res *lockres = &fp->fp_flock; in ocfs2_file_lock()
1981 struct ocfs2_super *osb = OCFS2_SB(file->f_mapping->host->i_sb); in ocfs2_file_lock()
1986 if ((lockres->l_flags & OCFS2_LOCK_BUSY) || in ocfs2_file_lock()
1987 (lockres->l_level > DLM_LOCK_NL)) { in ocfs2_file_lock()
1989 "File lock \"%s\" has busy or locked state: flags: 0x%lx, " in ocfs2_file_lock()
1990 "level: %u\n", lockres->l_name, lockres->l_flags, in ocfs2_file_lock()
1991 lockres->l_level); in ocfs2_file_lock()
1992 return -EINVAL; in ocfs2_file_lock()
1995 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_file_lock()
1996 if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED)) { in ocfs2_file_lock()
1998 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_file_lock()
2001 * Get the lock at NLMODE to start - that way we in ocfs2_file_lock()
2015 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_file_lock()
2018 lockres->l_action = OCFS2_AST_CONVERT; in ocfs2_file_lock()
2020 lockres->l_requested = level; in ocfs2_file_lock()
2024 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_file_lock()
2026 ret = ocfs2_dlm_lock(osb->cconn, level, &lockres->l_lksb, lkm_flags, in ocfs2_file_lock()
2027 lockres->l_name, OCFS2_LOCK_ID_MAX_LEN - 1); in ocfs2_file_lock()
2029 if (!trylock || (ret != -EAGAIN)) { in ocfs2_file_lock()
2031 ret = -EINVAL; in ocfs2_file_lock()
2040 if (ret == -ERESTARTSYS) { in ocfs2_file_lock()
2051 * outstanding lock request, so a cancel convert is in ocfs2_file_lock()
2052 * required. We intentionally overwrite 'ret' - if the in ocfs2_file_lock()
2053 * cancel fails and the lock was granted, it's easier in ocfs2_file_lock()
2057 } else if (!ret && (level > lockres->l_level)) { in ocfs2_file_lock()
2060 ret = -EAGAIN; in ocfs2_file_lock()
2065 mlog(0, "Lock: \"%s\" ex: %d, trylock: %d, returns: %d\n", in ocfs2_file_lock()
2066 lockres->l_name, ex, trylock, ret); in ocfs2_file_lock()
2075 struct ocfs2_file_private *fp = file->private_data; in ocfs2_file_unlock()
2076 struct ocfs2_lock_res *lockres = &fp->fp_flock; in ocfs2_file_unlock()
2077 struct ocfs2_super *osb = OCFS2_SB(file->f_mapping->host->i_sb); in ocfs2_file_unlock()
2082 if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED)) in ocfs2_file_unlock()
2085 if (lockres->l_level == DLM_LOCK_NL) in ocfs2_file_unlock()
2089 lockres->l_name, lockres->l_flags, lockres->l_level, in ocfs2_file_unlock()
2090 lockres->l_action); in ocfs2_file_unlock()
2092 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_file_unlock()
2097 lockres->l_blocking = DLM_LOCK_EX; in ocfs2_file_unlock()
2101 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_file_unlock()
2119 /* If we know that another node is waiting on our lock, kick in ocfs2_downconvert_on_unlock()
2120 * the downconvert thread * pre-emptively when we reach a release in ocfs2_downconvert_on_unlock()
2122 if (lockres->l_flags & OCFS2_LOCK_BLOCKED) { in ocfs2_downconvert_on_unlock()
2123 switch(lockres->l_blocking) { in ocfs2_downconvert_on_unlock()
2125 if (!lockres->l_ex_holders && !lockres->l_ro_holders) in ocfs2_downconvert_on_unlock()
2129 if (!lockres->l_ex_holders) in ocfs2_downconvert_on_unlock()
2142 #define OCFS2_SEC_SHIFT (64 - OCFS2_SEC_BITS)
2143 #define OCFS2_NSEC_MASK ((1ULL << OCFS2_SEC_SHIFT) - 1)
2150 u64 sec = clamp_t(time64_t, spec->tv_sec, 0, 0x3ffffffffull); in ocfs2_pack_timespec()
2151 u32 nsec = spec->tv_nsec; in ocfs2_pack_timespec()
2164 struct ocfs2_lock_res *lockres = &oi->ip_inode_lockres; in __ocfs2_stuff_meta_lvb()
2168 lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in __ocfs2_stuff_meta_lvb()
2171 * Invalidate the LVB of a deleted inode - this way other in __ocfs2_stuff_meta_lvb()
2173 * status. in __ocfs2_stuff_meta_lvb()
2175 if (oi->ip_flags & OCFS2_INODE_DELETED) { in __ocfs2_stuff_meta_lvb()
2176 lvb->lvb_version = 0; in __ocfs2_stuff_meta_lvb()
2180 lvb->lvb_version = OCFS2_LVB_VERSION; in __ocfs2_stuff_meta_lvb()
2181 lvb->lvb_isize = cpu_to_be64(i_size_read(inode)); in __ocfs2_stuff_meta_lvb()
2182 lvb->lvb_iclusters = cpu_to_be32(oi->ip_clusters); in __ocfs2_stuff_meta_lvb()
2183 lvb->lvb_iuid = cpu_to_be32(i_uid_read(inode)); in __ocfs2_stuff_meta_lvb()
2184 lvb->lvb_igid = cpu_to_be32(i_gid_read(inode)); in __ocfs2_stuff_meta_lvb()
2185 lvb->lvb_imode = cpu_to_be16(inode->i_mode); in __ocfs2_stuff_meta_lvb()
2186 lvb->lvb_inlink = cpu_to_be16(inode->i_nlink); in __ocfs2_stuff_meta_lvb()
2188 lvb->lvb_iatime_packed = cpu_to_be64(ocfs2_pack_timespec(&ts)); in __ocfs2_stuff_meta_lvb()
2190 lvb->lvb_ictime_packed = cpu_to_be64(ocfs2_pack_timespec(&ts)); in __ocfs2_stuff_meta_lvb()
2192 lvb->lvb_imtime_packed = cpu_to_be64(ocfs2_pack_timespec(&ts)); in __ocfs2_stuff_meta_lvb()
2193 lvb->lvb_iattr = cpu_to_be32(oi->ip_attr); in __ocfs2_stuff_meta_lvb()
2194 lvb->lvb_idynfeatures = cpu_to_be16(oi->ip_dyn_features); in __ocfs2_stuff_meta_lvb()
2195 lvb->lvb_igeneration = cpu_to_be32(inode->i_generation); in __ocfs2_stuff_meta_lvb()
2204 spec->tv_sec = packed_time >> OCFS2_SEC_SHIFT; in ocfs2_unpack_timespec()
2205 spec->tv_nsec = packed_time & OCFS2_NSEC_MASK; in ocfs2_unpack_timespec()
2211 struct ocfs2_lock_res *lockres = &oi->ip_inode_lockres; in ocfs2_refresh_inode_from_lvb()
2217 lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in ocfs2_refresh_inode_from_lvb()
2218 if (inode_wrong_type(inode, be16_to_cpu(lvb->lvb_imode))) in ocfs2_refresh_inode_from_lvb()
2219 return -ESTALE; in ocfs2_refresh_inode_from_lvb()
2221 /* We're safe here without the lockres lock... */ in ocfs2_refresh_inode_from_lvb()
2222 spin_lock(&oi->ip_lock); in ocfs2_refresh_inode_from_lvb()
2223 oi->ip_clusters = be32_to_cpu(lvb->lvb_iclusters); in ocfs2_refresh_inode_from_lvb()
2224 i_size_write(inode, be64_to_cpu(lvb->lvb_isize)); in ocfs2_refresh_inode_from_lvb()
2226 oi->ip_attr = be32_to_cpu(lvb->lvb_iattr); in ocfs2_refresh_inode_from_lvb()
2227 oi->ip_dyn_features = be16_to_cpu(lvb->lvb_idynfeatures); in ocfs2_refresh_inode_from_lvb()
2230 /* fast-symlinks are a special case */ in ocfs2_refresh_inode_from_lvb()
2231 if (S_ISLNK(inode->i_mode) && !oi->ip_clusters) in ocfs2_refresh_inode_from_lvb()
2232 inode->i_blocks = 0; in ocfs2_refresh_inode_from_lvb()
2234 inode->i_blocks = ocfs2_inode_sector_count(inode); in ocfs2_refresh_inode_from_lvb()
2236 i_uid_write(inode, be32_to_cpu(lvb->lvb_iuid)); in ocfs2_refresh_inode_from_lvb()
2237 i_gid_write(inode, be32_to_cpu(lvb->lvb_igid)); in ocfs2_refresh_inode_from_lvb()
2238 inode->i_mode = be16_to_cpu(lvb->lvb_imode); in ocfs2_refresh_inode_from_lvb()
2239 set_nlink(inode, be16_to_cpu(lvb->lvb_inlink)); in ocfs2_refresh_inode_from_lvb()
2240 ocfs2_unpack_timespec(&ts, be64_to_cpu(lvb->lvb_iatime_packed)); in ocfs2_refresh_inode_from_lvb()
2242 ocfs2_unpack_timespec(&ts, be64_to_cpu(lvb->lvb_imtime_packed)); in ocfs2_refresh_inode_from_lvb()
2244 ocfs2_unpack_timespec(&ts, be64_to_cpu(lvb->lvb_ictime_packed)); in ocfs2_refresh_inode_from_lvb()
2246 spin_unlock(&oi->ip_lock); in ocfs2_refresh_inode_from_lvb()
2253 struct ocfs2_meta_lvb *lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in ocfs2_meta_lvb_is_trustable()
2255 if (ocfs2_dlm_lvb_valid(&lockres->l_lksb) in ocfs2_meta_lvb_is_trustable()
2256 && lvb->lvb_version == OCFS2_LVB_VERSION in ocfs2_meta_lvb_is_trustable()
2257 && be32_to_cpu(lvb->lvb_igeneration) == inode->i_generation) in ocfs2_meta_lvb_is_trustable()
2262 /* Determine whether a lock resource needs to be refreshed, and
2272 int status = 0; in ocfs2_should_refresh_lock_res() local
2275 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_should_refresh_lock_res()
2276 if (!(lockres->l_flags & OCFS2_LOCK_NEEDS_REFRESH)) { in ocfs2_should_refresh_lock_res()
2277 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_should_refresh_lock_res()
2281 if (lockres->l_flags & OCFS2_LOCK_REFRESHING) { in ocfs2_should_refresh_lock_res()
2282 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_should_refresh_lock_res()
2288 /* Ok, I'll be the one to refresh this lock. */ in ocfs2_should_refresh_lock_res()
2290 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_should_refresh_lock_res()
2292 status = 1; in ocfs2_should_refresh_lock_res()
2294 mlog(0, "status %d\n", status); in ocfs2_should_refresh_lock_res()
2295 return status; in ocfs2_should_refresh_lock_res()
2298 /* If status is non zero, I'll mark it as not being in refresh
2301 int status) in ocfs2_complete_lock_res_refresh() argument
2305 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_complete_lock_res_refresh()
2307 if (!status) in ocfs2_complete_lock_res_refresh()
2309 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_complete_lock_res_refresh()
2311 wake_up(&lockres->l_event); in ocfs2_complete_lock_res_refresh()
2318 int status = 0; in ocfs2_inode_lock_update() local
2320 struct ocfs2_lock_res *lockres = &oi->ip_inode_lockres; in ocfs2_inode_lock_update()
2322 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_inode_lock_update()
2327 spin_lock(&oi->ip_lock); in ocfs2_inode_lock_update()
2328 if (oi->ip_flags & OCFS2_INODE_DELETED) { in ocfs2_inode_lock_update()
2330 "were waiting on a lock. ip_flags = 0x%x\n", in ocfs2_inode_lock_update()
2331 (unsigned long long)oi->ip_blkno, oi->ip_flags); in ocfs2_inode_lock_update()
2332 spin_unlock(&oi->ip_lock); in ocfs2_inode_lock_update()
2333 status = -ENOENT; in ocfs2_inode_lock_update()
2336 spin_unlock(&oi->ip_lock); in ocfs2_inode_lock_update()
2349 (unsigned long long)oi->ip_blkno); in ocfs2_inode_lock_update()
2350 status = ocfs2_refresh_inode_from_lvb(inode); in ocfs2_inode_lock_update()
2355 status = ocfs2_read_inode_block(inode, bh); in ocfs2_inode_lock_update()
2356 if (status < 0) { in ocfs2_inode_lock_update()
2357 mlog_errno(status); in ocfs2_inode_lock_update()
2360 fe = (struct ocfs2_dinode *) (*bh)->b_data; in ocfs2_inode_lock_update()
2361 if (inode_wrong_type(inode, le16_to_cpu(fe->i_mode))) { in ocfs2_inode_lock_update()
2362 status = -ESTALE; in ocfs2_inode_lock_update()
2375 mlog_bug_on_msg(inode->i_generation != in ocfs2_inode_lock_update()
2376 le32_to_cpu(fe->i_generation), in ocfs2_inode_lock_update()
2378 "inode->i_generation: %u\n", in ocfs2_inode_lock_update()
2379 (unsigned long long)oi->ip_blkno, in ocfs2_inode_lock_update()
2380 le32_to_cpu(fe->i_generation), in ocfs2_inode_lock_update()
2381 inode->i_generation); in ocfs2_inode_lock_update()
2382 mlog_bug_on_msg(le64_to_cpu(fe->i_dtime) || in ocfs2_inode_lock_update()
2383 !(fe->i_flags & cpu_to_le32(OCFS2_VALID_FL)), in ocfs2_inode_lock_update()
2385 (unsigned long long)oi->ip_blkno, in ocfs2_inode_lock_update()
2386 (unsigned long long)le64_to_cpu(fe->i_dtime), in ocfs2_inode_lock_update()
2387 le32_to_cpu(fe->i_flags)); in ocfs2_inode_lock_update()
2393 status = 0; in ocfs2_inode_lock_update()
2395 ocfs2_complete_lock_res_refresh(lockres, status); in ocfs2_inode_lock_update()
2397 return status; in ocfs2_inode_lock_update()
2404 int status; in ocfs2_assign_bh() local
2415 status = ocfs2_read_inode_block(inode, ret_bh); in ocfs2_assign_bh()
2416 if (status < 0) in ocfs2_assign_bh()
2417 mlog_errno(status); in ocfs2_assign_bh()
2419 return status; in ocfs2_assign_bh()
2424 * the result of the lock will be communicated via the callback.
2432 int status, level, acquired; in ocfs2_inode_lock_full_nested() local
2435 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_inode_lock_full_nested()
2438 mlog(0, "inode %llu, take %s META lock\n", in ocfs2_inode_lock_full_nested()
2439 (unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_inode_lock_full_nested()
2442 status = 0; in ocfs2_inode_lock_full_nested()
2444 /* We'll allow faking a readonly metadata lock for in ocfs2_inode_lock_full_nested()
2448 status = -EROFS; in ocfs2_inode_lock_full_nested()
2459 lockres = &OCFS2_I(inode)->ip_inode_lockres; in ocfs2_inode_lock_full_nested()
2465 status = __ocfs2_cluster_lock(osb, lockres, level, dlm_flags, in ocfs2_inode_lock_full_nested()
2467 if (status < 0) { in ocfs2_inode_lock_full_nested()
2468 if (status != -EAGAIN) in ocfs2_inode_lock_full_nested()
2469 mlog_errno(status); in ocfs2_inode_lock_full_nested()
2473 /* Notify the error cleanup path to drop the cluster lock. */ in ocfs2_inode_lock_full_nested()
2478 * committed to owning this lock so we don't allow signals to in ocfs2_inode_lock_full_nested()
2490 if (inode->i_state & I_NEW) { in ocfs2_inode_lock_full_nested()
2491 status = 0; in ocfs2_inode_lock_full_nested()
2502 status = ocfs2_inode_lock_update(inode, &local_bh); in ocfs2_inode_lock_full_nested()
2503 if (status < 0) { in ocfs2_inode_lock_full_nested()
2504 if (status != -ENOENT) in ocfs2_inode_lock_full_nested()
2505 mlog_errno(status); in ocfs2_inode_lock_full_nested()
2510 status = ocfs2_assign_bh(inode, ret_bh, local_bh); in ocfs2_inode_lock_full_nested()
2511 if (status < 0) { in ocfs2_inode_lock_full_nested()
2512 mlog_errno(status); in ocfs2_inode_lock_full_nested()
2518 if (status < 0) { in ocfs2_inode_lock_full_nested()
2528 return status; in ocfs2_inode_lock_full_nested()
2532 * This is working around a lock inversion between tasks acquiring DLM
2533 * locks while holding a folio lock and the downconvert thread which
2534 * blocks dlm lock acquiry while acquiring folio locks.
2538 * code that aop methods pass up to the VFS -- test for errors with != 0. **
2540 * The DLM is called such that it returns -EAGAIN if it would have
2553 if (ret == -EAGAIN) { in ocfs2_inode_lock_with_folio()
2556 * If we can't get inode lock immediately, we should not return in ocfs2_inode_lock_with_folio()
2558 * The method is to get a blocking lock and immediately unlock in ocfs2_inode_lock_with_folio()
2560 * lots of retries, and benefits fairness in getting lock. in ocfs2_inode_lock_with_folio()
2582 if (ret != -EAGAIN) in ocfs2_inode_lock_atime()
2588 * If we should update atime, we will get EX lock, in ocfs2_inode_lock_atime()
2589 * otherwise we just get PR lock. in ocfs2_inode_lock_atime()
2601 if (ret != -EAGAIN) in ocfs2_inode_lock_atime()
2619 struct ocfs2_lock_res *lockres = &OCFS2_I(inode)->ip_inode_lockres; in ocfs2_inode_unlock()
2620 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); in ocfs2_inode_unlock()
2622 mlog(0, "inode %llu drop %s META lock\n", in ocfs2_inode_unlock()
2623 (unsigned long long)OCFS2_I(inode)->ip_blkno, in ocfs2_inode_unlock()
2633 * locking issue. The idea is to keep track of a lock holder on the stack of
2634 * the current process. If there's a lock holder on the stack, we know the
2638 * return < 0 on error, return == 0 if there's no lock holder on the stack
2640 * return == -1 if this lock attempt will cause an upgrade which is forbidden.
2642 * When taking lock levels into account,we face some different situations.
2644 * 1. no lock is held
2645 * In this case, just lock the inode as requested and return 0
2647 * 2. We are holding a lock
2656 * 2.1 lock level that is been held is compatible
2657 * with the wanted level, so no lock action will be tacken.
2662 * lock upgrade may cause dead lock. The following illustrates
2677 int status = 0; in ocfs2_inode_lock_tracker() local
2683 lockres = &OCFS2_I(inode)->ip_inode_lockres; in ocfs2_inode_lock_tracker()
2689 * We haven't got any lock before. in ocfs2_inode_lock_tracker()
2691 status = ocfs2_inode_lock_full(inode, ret_bh, ex, 0); in ocfs2_inode_lock_tracker()
2692 if (status < 0) { in ocfs2_inode_lock_tracker()
2693 if (status != -ENOENT) in ocfs2_inode_lock_tracker()
2694 mlog_errno(status); in ocfs2_inode_lock_tracker()
2695 return status; in ocfs2_inode_lock_tracker()
2698 oh->oh_ex = ex; in ocfs2_inode_lock_tracker()
2703 if (unlikely(ex && !tmp_oh->oh_ex)) { in ocfs2_inode_lock_tracker()
2705 * case 2.2 upgrade may cause dead lock, forbid it. in ocfs2_inode_lock_tracker()
2710 return -EINVAL; in ocfs2_inode_lock_tracker()
2715 * ignore the lock level and just update it. in ocfs2_inode_lock_tracker()
2718 status = ocfs2_inode_lock_full(inode, ret_bh, ex, in ocfs2_inode_lock_tracker()
2720 if (status < 0) { in ocfs2_inode_lock_tracker()
2721 if (status != -ENOENT) in ocfs2_inode_lock_tracker()
2722 mlog_errno(status); in ocfs2_inode_lock_tracker()
2723 return status; in ocfs2_inode_lock_tracker()
2736 lockres = &OCFS2_I(inode)->ip_inode_lockres; in ocfs2_inode_unlock_tracker()
2738 * lock previously. in ocfs2_inode_unlock_tracker()
2740 * If had_lock is 0, we will release the lock. in ocfs2_inode_unlock_tracker()
2743 ocfs2_inode_unlock(inode, oh->oh_ex); in ocfs2_inode_unlock_tracker()
2752 int status = 0; in ocfs2_orphan_scan_lock() local
2755 return -EROFS; in ocfs2_orphan_scan_lock()
2760 lockres = &osb->osb_orphan_scan.os_lockres; in ocfs2_orphan_scan_lock()
2761 status = ocfs2_cluster_lock(osb, lockres, DLM_LOCK_EX, 0, 0); in ocfs2_orphan_scan_lock()
2762 if (status < 0) in ocfs2_orphan_scan_lock()
2763 return status; in ocfs2_orphan_scan_lock()
2765 lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in ocfs2_orphan_scan_lock()
2766 if (ocfs2_dlm_lvb_valid(&lockres->l_lksb) && in ocfs2_orphan_scan_lock()
2767 lvb->lvb_version == OCFS2_ORPHAN_LVB_VERSION) in ocfs2_orphan_scan_lock()
2768 *seqno = be32_to_cpu(lvb->lvb_os_seqno); in ocfs2_orphan_scan_lock()
2770 *seqno = osb->osb_orphan_scan.os_seqno + 1; in ocfs2_orphan_scan_lock()
2772 return status; in ocfs2_orphan_scan_lock()
2781 lockres = &osb->osb_orphan_scan.os_lockres; in ocfs2_orphan_scan_unlock()
2782 lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in ocfs2_orphan_scan_unlock()
2783 lvb->lvb_version = OCFS2_ORPHAN_LVB_VERSION; in ocfs2_orphan_scan_unlock()
2784 lvb->lvb_os_seqno = cpu_to_be32(seqno); in ocfs2_orphan_scan_unlock()
2792 int status = 0; in ocfs2_super_lock() local
2794 struct ocfs2_lock_res *lockres = &osb->osb_super_lockres; in ocfs2_super_lock()
2797 return -EROFS; in ocfs2_super_lock()
2802 status = ocfs2_cluster_lock(osb, lockres, level, 0, 0); in ocfs2_super_lock()
2803 if (status < 0) { in ocfs2_super_lock()
2804 mlog_errno(status); in ocfs2_super_lock()
2808 /* The super block lock path is really in the best position to in ocfs2_super_lock()
2809 * know when resources covered by the lock need to be in ocfs2_super_lock()
2812 status = ocfs2_should_refresh_lock_res(lockres); in ocfs2_super_lock()
2813 if (status) { in ocfs2_super_lock()
2814 status = ocfs2_refresh_slot_info(osb); in ocfs2_super_lock()
2816 ocfs2_complete_lock_res_refresh(lockres, status); in ocfs2_super_lock()
2818 if (status < 0) { in ocfs2_super_lock()
2820 mlog_errno(status); in ocfs2_super_lock()
2825 return status; in ocfs2_super_lock()
2832 struct ocfs2_lock_res *lockres = &osb->osb_super_lockres; in ocfs2_super_unlock()
2840 int status; in ocfs2_rename_lock() local
2841 struct ocfs2_lock_res *lockres = &osb->osb_rename_lockres; in ocfs2_rename_lock()
2844 return -EROFS; in ocfs2_rename_lock()
2849 status = ocfs2_cluster_lock(osb, lockres, DLM_LOCK_EX, 0, 0); in ocfs2_rename_lock()
2850 if (status < 0) in ocfs2_rename_lock()
2851 mlog_errno(status); in ocfs2_rename_lock()
2853 return status; in ocfs2_rename_lock()
2858 struct ocfs2_lock_res *lockres = &osb->osb_rename_lockres; in ocfs2_rename_unlock()
2866 int status; in ocfs2_nfs_sync_lock() local
2867 struct ocfs2_lock_res *lockres = &osb->osb_nfs_sync_lockres; in ocfs2_nfs_sync_lock()
2870 return -EROFS; in ocfs2_nfs_sync_lock()
2873 down_write(&osb->nfs_sync_rwlock); in ocfs2_nfs_sync_lock()
2875 down_read(&osb->nfs_sync_rwlock); in ocfs2_nfs_sync_lock()
2880 status = ocfs2_cluster_lock(osb, lockres, ex ? LKM_EXMODE : LKM_PRMODE, in ocfs2_nfs_sync_lock()
2882 if (status < 0) { in ocfs2_nfs_sync_lock()
2883 mlog(ML_ERROR, "lock on nfs sync lock failed %d\n", status); in ocfs2_nfs_sync_lock()
2886 up_write(&osb->nfs_sync_rwlock); in ocfs2_nfs_sync_lock()
2888 up_read(&osb->nfs_sync_rwlock); in ocfs2_nfs_sync_lock()
2891 return status; in ocfs2_nfs_sync_lock()
2896 struct ocfs2_lock_res *lockres = &osb->osb_nfs_sync_lockres; in ocfs2_nfs_sync_unlock()
2902 up_write(&osb->nfs_sync_rwlock); in ocfs2_nfs_sync_unlock()
2904 up_read(&osb->nfs_sync_rwlock); in ocfs2_nfs_sync_unlock()
2910 int status; in ocfs2_trim_fs_lock() local
2912 struct ocfs2_lock_res *lockres = &osb->osb_trim_fs_lockres; in ocfs2_trim_fs_lock()
2915 info->tf_valid = 0; in ocfs2_trim_fs_lock()
2918 return -EROFS; in ocfs2_trim_fs_lock()
2923 status = ocfs2_cluster_lock(osb, lockres, DLM_LOCK_EX, in ocfs2_trim_fs_lock()
2925 if (status < 0) { in ocfs2_trim_fs_lock()
2926 if (status != -EAGAIN) in ocfs2_trim_fs_lock()
2927 mlog_errno(status); in ocfs2_trim_fs_lock()
2928 return status; in ocfs2_trim_fs_lock()
2932 lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in ocfs2_trim_fs_lock()
2933 if (ocfs2_dlm_lvb_valid(&lockres->l_lksb) && in ocfs2_trim_fs_lock()
2934 lvb->lvb_version == OCFS2_TRIMFS_LVB_VERSION) { in ocfs2_trim_fs_lock()
2935 info->tf_valid = 1; in ocfs2_trim_fs_lock()
2936 info->tf_success = lvb->lvb_success; in ocfs2_trim_fs_lock()
2937 info->tf_nodenum = be32_to_cpu(lvb->lvb_nodenum); in ocfs2_trim_fs_lock()
2938 info->tf_start = be64_to_cpu(lvb->lvb_start); in ocfs2_trim_fs_lock()
2939 info->tf_len = be64_to_cpu(lvb->lvb_len); in ocfs2_trim_fs_lock()
2940 info->tf_minlen = be64_to_cpu(lvb->lvb_minlen); in ocfs2_trim_fs_lock()
2941 info->tf_trimlen = be64_to_cpu(lvb->lvb_trimlen); in ocfs2_trim_fs_lock()
2945 return status; in ocfs2_trim_fs_lock()
2952 struct ocfs2_lock_res *lockres = &osb->osb_trim_fs_lockres; in ocfs2_trim_fs_unlock()
2958 lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in ocfs2_trim_fs_unlock()
2959 lvb->lvb_version = OCFS2_TRIMFS_LVB_VERSION; in ocfs2_trim_fs_unlock()
2960 lvb->lvb_success = info->tf_success; in ocfs2_trim_fs_unlock()
2961 lvb->lvb_nodenum = cpu_to_be32(info->tf_nodenum); in ocfs2_trim_fs_unlock()
2962 lvb->lvb_start = cpu_to_be64(info->tf_start); in ocfs2_trim_fs_unlock()
2963 lvb->lvb_len = cpu_to_be64(info->tf_len); in ocfs2_trim_fs_unlock()
2964 lvb->lvb_minlen = cpu_to_be64(info->tf_minlen); in ocfs2_trim_fs_unlock()
2965 lvb->lvb_trimlen = cpu_to_be64(info->tf_trimlen); in ocfs2_trim_fs_unlock()
2975 struct ocfs2_dentry_lock *dl = dentry->d_fsdata; in ocfs2_dentry_lock()
2976 struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb); in ocfs2_dentry_lock()
2982 return -EROFS; in ocfs2_dentry_lock()
2989 ret = ocfs2_cluster_lock(osb, &dl->dl_lockres, level, 0, 0); in ocfs2_dentry_lock()
2999 struct ocfs2_dentry_lock *dl = dentry->d_fsdata; in ocfs2_dentry_unlock()
3000 struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb); in ocfs2_dentry_unlock()
3003 ocfs2_cluster_unlock(osb, &dl->dl_lockres, level); in ocfs2_dentry_unlock()
3021 kref_put(&dlm_debug->d_refcnt, ocfs2_dlm_debug_free); in ocfs2_put_dlm_debug()
3026 kref_get(&debug->d_refcnt); in ocfs2_get_dlm_debug()
3035 mlog_errno(-ENOMEM); in ocfs2_new_dlm_debug()
3039 kref_init(&dlm_debug->d_refcnt); in ocfs2_new_dlm_debug()
3040 INIT_LIST_HEAD(&dlm_debug->d_lockres_tracking); in ocfs2_new_dlm_debug()
3041 dlm_debug->d_filter_secs = 0; in ocfs2_new_dlm_debug()
3046 /* Access to this is arbitrated for us via seq_file->sem. */
3057 struct ocfs2_dlm_debug *dlm_debug = priv->p_dlm_debug; in ocfs2_dlm_next_res()
3061 list_for_each_entry(iter, &start->l_debug_list, l_debug_list) { in ocfs2_dlm_next_res()
3063 if (&iter->l_debug_list == &dlm_debug->d_lockres_tracking) { in ocfs2_dlm_next_res()
3070 if (iter->l_ops != NULL) { in ocfs2_dlm_next_res()
3081 struct ocfs2_dlm_seq_priv *priv = m->private; in ocfs2_dlm_seq_start()
3085 iter = ocfs2_dlm_next_res(&priv->p_iter_res, priv); in ocfs2_dlm_seq_start()
3094 priv->p_tmp_res = *iter; in ocfs2_dlm_seq_start()
3095 iter = &priv->p_tmp_res; in ocfs2_dlm_seq_start()
3108 struct ocfs2_dlm_seq_priv *priv = m->private; in ocfs2_dlm_seq_next()
3110 struct ocfs2_lock_res *dummy = &priv->p_iter_res; in ocfs2_dlm_seq_next()
3115 list_del_init(&dummy->l_debug_list); in ocfs2_dlm_seq_next()
3117 list_add(&dummy->l_debug_list, &iter->l_debug_list); in ocfs2_dlm_seq_next()
3118 priv->p_tmp_res = *iter; in ocfs2_dlm_seq_next()
3119 iter = &priv->p_tmp_res; in ocfs2_dlm_seq_next()
3130 * - Lock stats printed
3132 * - Max time in lock stats is in usecs (instead of nsecs)
3134 * - Add last pr/ex unlock times and first lock wait time in usecs
3145 ((struct ocfs2_dlm_seq_priv *)m->private)->p_dlm_debug; in ocfs2_dlm_seq_show()
3149 return -EINVAL; in ocfs2_dlm_seq_show()
3152 if (!lockres->l_lock_wait && dlm_debug->d_filter_secs) { in ocfs2_dlm_seq_show()
3154 last = max(lockres->l_lock_prmode.ls_last, in ocfs2_dlm_seq_show()
3155 lockres->l_lock_exmode.ls_last); in ocfs2_dlm_seq_show()
3157 * Use d_filter_secs field to filter lock resources dump, in ocfs2_dlm_seq_show()
3159 * otherwise, only dump the last N seconds active lock in ocfs2_dlm_seq_show()
3162 if (div_u64(now - last, 1000000) > dlm_debug->d_filter_secs) in ocfs2_dlm_seq_show()
3169 if (lockres->l_type == OCFS2_LOCK_TYPE_DENTRY) in ocfs2_dlm_seq_show()
3170 seq_printf(m, "%.*s%08x\t", OCFS2_DENTRY_LOCK_INO_START - 1, in ocfs2_dlm_seq_show()
3171 lockres->l_name, in ocfs2_dlm_seq_show()
3174 seq_printf(m, "%.*s\t", OCFS2_LOCK_ID_MAX_LEN, lockres->l_name); in ocfs2_dlm_seq_show()
3184 lockres->l_level, in ocfs2_dlm_seq_show()
3185 lockres->l_flags, in ocfs2_dlm_seq_show()
3186 lockres->l_action, in ocfs2_dlm_seq_show()
3187 lockres->l_unlock_action, in ocfs2_dlm_seq_show()
3188 lockres->l_ro_holders, in ocfs2_dlm_seq_show()
3189 lockres->l_ex_holders, in ocfs2_dlm_seq_show()
3190 lockres->l_requested, in ocfs2_dlm_seq_show()
3191 lockres->l_blocking); in ocfs2_dlm_seq_show()
3194 lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in ocfs2_dlm_seq_show()
3199 # define lock_num_prmode(_l) ((_l)->l_lock_prmode.ls_gets) in ocfs2_dlm_seq_show()
3200 # define lock_num_exmode(_l) ((_l)->l_lock_exmode.ls_gets) in ocfs2_dlm_seq_show()
3201 # define lock_num_prmode_failed(_l) ((_l)->l_lock_prmode.ls_fail) in ocfs2_dlm_seq_show()
3202 # define lock_num_exmode_failed(_l) ((_l)->l_lock_exmode.ls_fail) in ocfs2_dlm_seq_show()
3203 # define lock_total_prmode(_l) ((_l)->l_lock_prmode.ls_total) in ocfs2_dlm_seq_show()
3204 # define lock_total_exmode(_l) ((_l)->l_lock_exmode.ls_total) in ocfs2_dlm_seq_show()
3205 # define lock_max_prmode(_l) ((_l)->l_lock_prmode.ls_max) in ocfs2_dlm_seq_show()
3206 # define lock_max_exmode(_l) ((_l)->l_lock_exmode.ls_max) in ocfs2_dlm_seq_show()
3207 # define lock_refresh(_l) ((_l)->l_lock_refresh) in ocfs2_dlm_seq_show()
3208 # define lock_last_prmode(_l) ((_l)->l_lock_prmode.ls_last) in ocfs2_dlm_seq_show()
3209 # define lock_last_exmode(_l) ((_l)->l_lock_exmode.ls_last) in ocfs2_dlm_seq_show()
3210 # define lock_wait(_l) ((_l)->l_lock_wait) in ocfs2_dlm_seq_show()
3265 struct seq_file *seq = file->private_data; in ocfs2_dlm_debug_release()
3266 struct ocfs2_dlm_seq_priv *priv = seq->private; in ocfs2_dlm_debug_release()
3267 struct ocfs2_lock_res *res = &priv->p_iter_res; in ocfs2_dlm_debug_release()
3270 ocfs2_put_dlm_debug(priv->p_dlm_debug); in ocfs2_dlm_debug_release()
3281 mlog_errno(-ENOMEM); in ocfs2_dlm_debug_open()
3282 return -ENOMEM; in ocfs2_dlm_debug_open()
3285 osb = inode->i_private; in ocfs2_dlm_debug_open()
3286 ocfs2_get_dlm_debug(osb->osb_dlm_debug); in ocfs2_dlm_debug_open()
3287 priv->p_dlm_debug = osb->osb_dlm_debug; in ocfs2_dlm_debug_open()
3288 INIT_LIST_HEAD(&priv->p_iter_res.l_debug_list); in ocfs2_dlm_debug_open()
3290 ocfs2_add_lockres_tracking(&priv->p_iter_res, in ocfs2_dlm_debug_open()
3291 priv->p_dlm_debug); in ocfs2_dlm_debug_open()
3305 struct ocfs2_dlm_debug *dlm_debug = osb->osb_dlm_debug; in ocfs2_dlm_init_debug()
3308 osb->osb_debug_root, osb, &ocfs2_dlm_debug_fops); in ocfs2_dlm_init_debug()
3310 debugfs_create_u32("locking_filter", 0600, osb->osb_debug_root, in ocfs2_dlm_init_debug()
3311 &dlm_debug->d_filter_secs); in ocfs2_dlm_init_debug()
3317 struct ocfs2_dlm_debug *dlm_debug = osb->osb_dlm_debug; in ocfs2_dlm_shutdown_debug()
3325 int status = 0; in ocfs2_dlm_init() local
3329 osb->node_num = 0; in ocfs2_dlm_init()
3336 osb->dc_task = kthread_run(ocfs2_downconvert_thread, osb, "ocfs2dc-%s", in ocfs2_dlm_init()
3337 osb->uuid_str); in ocfs2_dlm_init()
3338 if (IS_ERR(osb->dc_task)) { in ocfs2_dlm_init()
3339 status = PTR_ERR(osb->dc_task); in ocfs2_dlm_init()
3340 osb->dc_task = NULL; in ocfs2_dlm_init()
3341 mlog_errno(status); in ocfs2_dlm_init()
3346 status = ocfs2_cluster_connect(osb->osb_cluster_stack, in ocfs2_dlm_init()
3347 osb->osb_cluster_name, in ocfs2_dlm_init()
3348 strlen(osb->osb_cluster_name), in ocfs2_dlm_init()
3349 osb->uuid_str, in ocfs2_dlm_init()
3350 strlen(osb->uuid_str), in ocfs2_dlm_init()
3353 if (status) { in ocfs2_dlm_init()
3354 mlog_errno(status); in ocfs2_dlm_init()
3358 status = ocfs2_cluster_this_node(conn, &osb->node_num); in ocfs2_dlm_init()
3359 if (status < 0) { in ocfs2_dlm_init()
3360 mlog_errno(status); in ocfs2_dlm_init()
3368 ocfs2_super_lock_res_init(&osb->osb_super_lockres, osb); in ocfs2_dlm_init()
3369 ocfs2_rename_lock_res_init(&osb->osb_rename_lockres, osb); in ocfs2_dlm_init()
3371 ocfs2_orphan_scan_lock_res_init(&osb->osb_orphan_scan.os_lockres, osb); in ocfs2_dlm_init()
3373 osb->cconn = conn; in ocfs2_dlm_init()
3375 if (status < 0) { in ocfs2_dlm_init()
3377 if (osb->dc_task) in ocfs2_dlm_init()
3378 kthread_stop(osb->dc_task); in ocfs2_dlm_init()
3381 return status; in ocfs2_dlm_init()
3395 if (osb->dc_task) { in ocfs2_dlm_shutdown()
3396 kthread_stop(osb->dc_task); in ocfs2_dlm_shutdown()
3397 osb->dc_task = NULL; in ocfs2_dlm_shutdown()
3400 ocfs2_lock_res_free(&osb->osb_super_lockres); in ocfs2_dlm_shutdown()
3401 ocfs2_lock_res_free(&osb->osb_rename_lockres); in ocfs2_dlm_shutdown()
3402 ocfs2_lock_res_free(&osb->osb_nfs_sync_lockres); in ocfs2_dlm_shutdown()
3403 ocfs2_lock_res_free(&osb->osb_orphan_scan.os_lockres); in ocfs2_dlm_shutdown()
3405 if (osb->cconn) { in ocfs2_dlm_shutdown()
3406 ocfs2_cluster_disconnect(osb->cconn, hangup_pending); in ocfs2_dlm_shutdown()
3407 osb->cconn = NULL; in ocfs2_dlm_shutdown()
3421 if (!(lockres->l_flags & OCFS2_LOCK_INITIALIZED)) in ocfs2_drop_lock()
3424 if (lockres->l_ops->flags & LOCK_TYPE_USES_LVB) in ocfs2_drop_lock()
3427 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_drop_lock()
3429 mlog_bug_on_msg(!(lockres->l_flags & OCFS2_LOCK_FREEING), in ocfs2_drop_lock()
3431 lockres->l_name, lockres->l_flags); in ocfs2_drop_lock()
3433 while (lockres->l_flags & OCFS2_LOCK_BUSY) { in ocfs2_drop_lock()
3434 mlog(0, "waiting on busy lock \"%s\": flags = %lx, action = " in ocfs2_drop_lock()
3436 lockres->l_name, lockres->l_flags, lockres->l_action, in ocfs2_drop_lock()
3437 lockres->l_unlock_action); in ocfs2_drop_lock()
3439 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_drop_lock()
3446 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_drop_lock()
3449 if (lockres->l_ops->flags & LOCK_TYPE_USES_LVB) { in ocfs2_drop_lock()
3450 if (lockres->l_flags & OCFS2_LOCK_ATTACHED && in ocfs2_drop_lock()
3451 lockres->l_level == DLM_LOCK_EX && in ocfs2_drop_lock()
3452 !(lockres->l_flags & OCFS2_LOCK_NEEDS_REFRESH)) in ocfs2_drop_lock()
3453 lockres->l_ops->set_lvb(lockres); in ocfs2_drop_lock()
3456 if (lockres->l_flags & OCFS2_LOCK_BUSY) in ocfs2_drop_lock()
3457 mlog(ML_ERROR, "destroying busy lock: \"%s\"\n", in ocfs2_drop_lock()
3458 lockres->l_name); in ocfs2_drop_lock()
3459 if (lockres->l_flags & OCFS2_LOCK_BLOCKED) in ocfs2_drop_lock()
3460 mlog(0, "destroying blocked lock: \"%s\"\n", lockres->l_name); in ocfs2_drop_lock()
3462 if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED)) { in ocfs2_drop_lock()
3463 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_drop_lock()
3471 BUG_ON(lockres->l_action != OCFS2_AST_INVALID); in ocfs2_drop_lock()
3475 lockres->l_unlock_action = OCFS2_UNLOCK_DROP_LOCK; in ocfs2_drop_lock()
3476 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_drop_lock()
3478 mlog(0, "lock %s\n", lockres->l_name); in ocfs2_drop_lock()
3480 ret = ocfs2_dlm_unlock(osb->cconn, &lockres->l_lksb, lkm_flags); in ocfs2_drop_lock()
3483 mlog(ML_ERROR, "lockres flags: %lu\n", lockres->l_flags); in ocfs2_drop_lock()
3484 ocfs2_dlm_dump_lksb(&lockres->l_lksb); in ocfs2_drop_lock()
3487 mlog(0, "lock %s, successful return from ocfs2_dlm_unlock\n", in ocfs2_drop_lock()
3488 lockres->l_name); in ocfs2_drop_lock()
3507 int status; in ocfs2_mark_lockres_freeing() local
3513 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_mark_lockres_freeing()
3514 lockres->l_flags |= OCFS2_LOCK_FREEING; in ocfs2_mark_lockres_freeing()
3515 if (lockres->l_flags & OCFS2_LOCK_QUEUED && current == osb->dc_task) { in ocfs2_mark_lockres_freeing()
3519 * different lock. So we can just remove the lock from the in ocfs2_mark_lockres_freeing()
3533 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_mark_lockres_freeing()
3534 spin_lock_irqsave(&osb->dc_task_lock, flags2); in ocfs2_mark_lockres_freeing()
3535 list_del_init(&lockres->l_blocked_list); in ocfs2_mark_lockres_freeing()
3536 osb->blocked_lock_count--; in ocfs2_mark_lockres_freeing()
3537 spin_unlock_irqrestore(&osb->dc_task_lock, flags2); in ocfs2_mark_lockres_freeing()
3544 WARN_ON_ONCE(lockres->l_ops->post_unlock); in ocfs2_mark_lockres_freeing()
3545 /* Since the lock is freeing we don't do much in the fn below */ in ocfs2_mark_lockres_freeing()
3549 while (lockres->l_flags & OCFS2_LOCK_QUEUED) { in ocfs2_mark_lockres_freeing()
3551 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_mark_lockres_freeing()
3553 mlog(0, "Waiting on lockres %s\n", lockres->l_name); in ocfs2_mark_lockres_freeing()
3555 status = ocfs2_wait_for_mask(&mw); in ocfs2_mark_lockres_freeing()
3556 if (status) in ocfs2_mark_lockres_freeing()
3557 mlog_errno(status); in ocfs2_mark_lockres_freeing()
3559 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_mark_lockres_freeing()
3561 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_mark_lockres_freeing()
3577 ocfs2_simple_drop_lockres(osb, &osb->osb_super_lockres); in ocfs2_drop_osb_locks()
3578 ocfs2_simple_drop_lockres(osb, &osb->osb_rename_lockres); in ocfs2_drop_osb_locks()
3579 ocfs2_simple_drop_lockres(osb, &osb->osb_nfs_sync_lockres); in ocfs2_drop_osb_locks()
3580 ocfs2_simple_drop_lockres(osb, &osb->osb_orphan_scan.os_lockres); in ocfs2_drop_osb_locks()
3585 int status, err; in ocfs2_drop_inode_locks() local
3587 /* No need to call ocfs2_mark_lockres_freeing here - in ocfs2_drop_inode_locks()
3590 err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb), in ocfs2_drop_inode_locks()
3591 &OCFS2_I(inode)->ip_open_lockres); in ocfs2_drop_inode_locks()
3595 status = err; in ocfs2_drop_inode_locks()
3597 err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb), in ocfs2_drop_inode_locks()
3598 &OCFS2_I(inode)->ip_inode_lockres); in ocfs2_drop_inode_locks()
3601 if (err < 0 && !status) in ocfs2_drop_inode_locks()
3602 status = err; in ocfs2_drop_inode_locks()
3604 err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb), in ocfs2_drop_inode_locks()
3605 &OCFS2_I(inode)->ip_rw_lockres); in ocfs2_drop_inode_locks()
3608 if (err < 0 && !status) in ocfs2_drop_inode_locks()
3609 status = err; in ocfs2_drop_inode_locks()
3611 return status; in ocfs2_drop_inode_locks()
3617 assert_spin_locked(&lockres->l_lock); in ocfs2_prepare_downconvert()
3619 BUG_ON(lockres->l_blocking <= DLM_LOCK_NL); in ocfs2_prepare_downconvert()
3621 if (lockres->l_level <= new_level) { in ocfs2_prepare_downconvert()
3624 "block %d, pgen %d\n", lockres->l_name, lockres->l_level, in ocfs2_prepare_downconvert()
3625 new_level, list_empty(&lockres->l_blocked_list), in ocfs2_prepare_downconvert()
3626 list_empty(&lockres->l_mask_waiters), lockres->l_type, in ocfs2_prepare_downconvert()
3627 lockres->l_flags, lockres->l_ro_holders, in ocfs2_prepare_downconvert()
3628 lockres->l_ex_holders, lockres->l_action, in ocfs2_prepare_downconvert()
3629 lockres->l_unlock_action, lockres->l_requested, in ocfs2_prepare_downconvert()
3630 lockres->l_blocking, lockres->l_pending_gen); in ocfs2_prepare_downconvert()
3635 lockres->l_name, lockres->l_level, new_level, lockres->l_blocking); in ocfs2_prepare_downconvert()
3637 lockres->l_action = OCFS2_AST_DOWNCONVERT; in ocfs2_prepare_downconvert()
3638 lockres->l_requested = new_level; in ocfs2_prepare_downconvert()
3652 mlog(ML_BASTS, "lockres %s, level %d => %d\n", lockres->l_name, in ocfs2_downconvert_lock()
3653 lockres->l_level, new_level); in ocfs2_downconvert_lock()
3662 lockres->l_ops->flags & LOCK_TYPE_USES_LVB) in ocfs2_downconvert_lock()
3668 ret = ocfs2_dlm_lock(osb->cconn, in ocfs2_downconvert_lock()
3670 &lockres->l_lksb, in ocfs2_downconvert_lock()
3672 lockres->l_name, in ocfs2_downconvert_lock()
3673 OCFS2_LOCK_ID_MAX_LEN - 1); in ocfs2_downconvert_lock()
3690 assert_spin_locked(&lockres->l_lock); in ocfs2_prepare_cancel_convert()
3692 if (lockres->l_unlock_action == OCFS2_UNLOCK_CANCEL_CONVERT) { in ocfs2_prepare_cancel_convert()
3693 /* If we're already trying to cancel a lock conversion in ocfs2_prepare_cancel_convert()
3695 * requeue this lock. */ in ocfs2_prepare_cancel_convert()
3696 mlog(ML_BASTS, "lockres %s, skip convert\n", lockres->l_name); in ocfs2_prepare_cancel_convert()
3701 BUG_ON(lockres->l_action != OCFS2_AST_CONVERT && in ocfs2_prepare_cancel_convert()
3702 lockres->l_action != OCFS2_AST_DOWNCONVERT); in ocfs2_prepare_cancel_convert()
3705 lockres->l_unlock_action = OCFS2_UNLOCK_CANCEL_CONVERT; in ocfs2_prepare_cancel_convert()
3707 mlog_bug_on_msg(!(lockres->l_flags & OCFS2_LOCK_BUSY), in ocfs2_prepare_cancel_convert()
3708 "lock %s, invalid flags: 0x%lx\n", in ocfs2_prepare_cancel_convert()
3709 lockres->l_name, lockres->l_flags); in ocfs2_prepare_cancel_convert()
3711 mlog(ML_BASTS, "lockres %s\n", lockres->l_name); in ocfs2_prepare_cancel_convert()
3721 ret = ocfs2_dlm_unlock(osb->cconn, &lockres->l_lksb, in ocfs2_cancel_convert()
3728 mlog(ML_BASTS, "lockres %s\n", lockres->l_name); in ocfs2_cancel_convert()
3745 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_unblock_lock()
3751 if (!(lockres->l_flags & OCFS2_LOCK_BLOCKED)) { in ocfs2_unblock_lock()
3752 BUG_ON(lockres->l_blocking != DLM_LOCK_NL); in ocfs2_unblock_lock()
3753 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_unblock_lock()
3758 if (lockres->l_flags & OCFS2_LOCK_BUSY) { in ocfs2_unblock_lock()
3761 * exists entirely for one reason - another thread has set in ocfs2_unblock_lock()
3771 * lock first; that's why we're here in unblock_lock(). in ocfs2_unblock_lock()
3782 if (lockres->l_flags & OCFS2_LOCK_PENDING) { in ocfs2_unblock_lock()
3784 lockres->l_name); in ocfs2_unblock_lock()
3788 ctl->requeue = 1; in ocfs2_unblock_lock()
3790 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_unblock_lock()
3805 * lock is in the blocked queue, the lock will be downconverted in ocfs2_unblock_lock()
3806 * as soon as the requester is done with the lock. in ocfs2_unblock_lock()
3808 if (lockres->l_flags & OCFS2_LOCK_UPCONVERT_FINISHING) in ocfs2_unblock_lock()
3816 if (lockres->l_level == DLM_LOCK_NL) { in ocfs2_unblock_lock()
3817 BUG_ON(lockres->l_ex_holders || lockres->l_ro_holders); in ocfs2_unblock_lock()
3818 mlog(ML_BASTS, "lockres %s, Aborting dc\n", lockres->l_name); in ocfs2_unblock_lock()
3819 lockres->l_blocking = DLM_LOCK_NL; in ocfs2_unblock_lock()
3821 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_unblock_lock()
3827 if ((lockres->l_blocking == DLM_LOCK_EX) in ocfs2_unblock_lock()
3828 && (lockres->l_ex_holders || lockres->l_ro_holders)) { in ocfs2_unblock_lock()
3830 lockres->l_name, lockres->l_ex_holders, in ocfs2_unblock_lock()
3831 lockres->l_ro_holders); in ocfs2_unblock_lock()
3837 if (lockres->l_blocking == DLM_LOCK_PR && in ocfs2_unblock_lock()
3838 lockres->l_ex_holders) { in ocfs2_unblock_lock()
3840 lockres->l_name, lockres->l_ex_holders); in ocfs2_unblock_lock()
3845 * Can we get a lock in this state if the holder counts are in ocfs2_unblock_lock()
3848 if ((lockres->l_ops->flags & LOCK_TYPE_REQUIRES_REFRESH) in ocfs2_unblock_lock()
3849 && (lockres->l_flags & OCFS2_LOCK_REFRESHING)) { in ocfs2_unblock_lock()
3850 mlog(ML_BASTS, "lockres %s, ReQ: Lock Refreshing\n", in ocfs2_unblock_lock()
3851 lockres->l_name); in ocfs2_unblock_lock()
3855 new_level = ocfs2_highest_compat_lock_level(lockres->l_blocking); in ocfs2_unblock_lock()
3857 if (lockres->l_ops->check_downconvert in ocfs2_unblock_lock()
3858 && !lockres->l_ops->check_downconvert(lockres, new_level)) { in ocfs2_unblock_lock()
3860 lockres->l_name); in ocfs2_unblock_lock()
3866 * lock is blocked). We can now downconvert the lock */ in ocfs2_unblock_lock()
3867 if (!lockres->l_ops->downconvert_worker) in ocfs2_unblock_lock()
3871 * downconverting a lock. Allow that here. The worker function in ocfs2_unblock_lock()
3873 * it may change while we're not holding the spin lock. */ in ocfs2_unblock_lock()
3874 blocking = lockres->l_blocking; in ocfs2_unblock_lock()
3875 level = lockres->l_level; in ocfs2_unblock_lock()
3876 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_unblock_lock()
3878 ctl->unblock_action = lockres->l_ops->downconvert_worker(lockres, blocking); in ocfs2_unblock_lock()
3880 if (ctl->unblock_action == UNBLOCK_STOP_POST) { in ocfs2_unblock_lock()
3882 lockres->l_name); in ocfs2_unblock_lock()
3886 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_unblock_lock()
3887 if ((blocking != lockres->l_blocking) || (level != lockres->l_level)) { in ocfs2_unblock_lock()
3891 "Recheck\n", lockres->l_name, blocking, in ocfs2_unblock_lock()
3892 lockres->l_blocking, level, lockres->l_level); in ocfs2_unblock_lock()
3897 ctl->requeue = 0; in ocfs2_unblock_lock()
3899 if (lockres->l_ops->flags & LOCK_TYPE_USES_LVB) { in ocfs2_unblock_lock()
3900 if (lockres->l_level == DLM_LOCK_EX) in ocfs2_unblock_lock()
3904 * We only set the lvb if the lock has been fully in ocfs2_unblock_lock()
3905 * refreshed - otherwise we risk setting stale in ocfs2_unblock_lock()
3909 if (set_lvb && !(lockres->l_flags & OCFS2_LOCK_NEEDS_REFRESH)) in ocfs2_unblock_lock()
3910 lockres->l_ops->set_lvb(lockres); in ocfs2_unblock_lock()
3914 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_unblock_lock()
3917 /* The dlm lock convert is being cancelled in background, in ocfs2_unblock_lock()
3921 if (ret == -EBUSY) { in ocfs2_unblock_lock()
3922 ctl->requeue = 1; in ocfs2_unblock_lock()
3924 lockres->l_name); in ocfs2_unblock_lock()
3935 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_unblock_lock()
3936 ctl->requeue = 1; in ocfs2_unblock_lock()
3949 mapping = inode->i_mapping; in ocfs2_data_convert_worker()
3951 if (S_ISDIR(inode->i_mode)) { in ocfs2_data_convert_worker()
3953 oi->ip_dir_lock_gen++; in ocfs2_data_convert_worker()
3954 mlog(0, "generation: %u\n", oi->ip_dir_lock_gen); in ocfs2_data_convert_worker()
3958 if (!S_ISREG(inode->i_mode)) in ocfs2_data_convert_worker()
3964 * page. Unfortunately this means that even for EX->PR in ocfs2_data_convert_worker()
3972 (unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_data_convert_worker()
4000 BUG_ON(lockres->l_level != DLM_LOCK_EX && !checkpointed); in ocfs2_ci_checkpointed()
4025 * Does the final reference drop on our dentry lock. Right now this
4037 * d_delete() matching dentries before the lock downconvert.
4053 * detect it and exit out - there's no more dentries anyway.
4059 struct ocfs2_inode_info *oi = OCFS2_I(dl->dl_inode); in ocfs2_dentry_convert_worker()
4066 * lock. This happens when we've renamed within a in ocfs2_dentry_convert_worker()
4068 * we never actually dropped our lock because it's still in ocfs2_dentry_convert_worker()
4080 spin_lock(&oi->ip_lock); in ocfs2_dentry_convert_worker()
4081 oi->ip_flags |= OCFS2_INODE_MAYBE_ORPHANED; in ocfs2_dentry_convert_worker()
4082 spin_unlock(&oi->ip_lock); in ocfs2_dentry_convert_worker()
4090 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_dentry_convert_worker()
4092 if (!(lockres->l_flags & OCFS2_LOCK_FREEING) in ocfs2_dentry_convert_worker()
4093 && dl->dl_count) { in ocfs2_dentry_convert_worker()
4094 dl->dl_count++; in ocfs2_dentry_convert_worker()
4098 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_dentry_convert_worker()
4112 dentry = ocfs2_find_local_alias(dl->dl_inode, in ocfs2_dentry_convert_worker()
4113 dl->dl_parent_blkno, 1); in ocfs2_dentry_convert_worker()
4118 if (S_ISDIR(dl->dl_inode->i_mode)) in ocfs2_dentry_convert_worker()
4128 * exclusive lock on the inode, so it can't be queued in ocfs2_dentry_convert_worker()
4139 * If we are the last holder of this dentry lock, there is no in ocfs2_dentry_convert_worker()
4142 if (dl->dl_count == 1) in ocfs2_dentry_convert_worker()
4154 return ocfs2_ci_checkpointed(&tree->rf_ci, lockres, new_level); in ocfs2_check_refcount_downconvert()
4163 ocfs2_metadata_cache_purge(&tree->rf_ci); in ocfs2_refcount_convert_worker()
4172 struct mem_dqinfo *info = sb_dqinfo(oinfo->dqi_gi.dqi_sb, in ocfs2_set_qinfo_lvb()
4173 oinfo->dqi_gi.dqi_type); in ocfs2_set_qinfo_lvb()
4175 lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in ocfs2_set_qinfo_lvb()
4176 lvb->lvb_version = OCFS2_QINFO_LVB_VERSION; in ocfs2_set_qinfo_lvb()
4177 lvb->lvb_bgrace = cpu_to_be32(info->dqi_bgrace); in ocfs2_set_qinfo_lvb()
4178 lvb->lvb_igrace = cpu_to_be32(info->dqi_igrace); in ocfs2_set_qinfo_lvb()
4179 lvb->lvb_syncms = cpu_to_be32(oinfo->dqi_syncms); in ocfs2_set_qinfo_lvb()
4180 lvb->lvb_blocks = cpu_to_be32(oinfo->dqi_gi.dqi_blocks); in ocfs2_set_qinfo_lvb()
4181 lvb->lvb_free_blk = cpu_to_be32(oinfo->dqi_gi.dqi_free_blk); in ocfs2_set_qinfo_lvb()
4182 lvb->lvb_free_entry = cpu_to_be32(oinfo->dqi_gi.dqi_free_entry); in ocfs2_set_qinfo_lvb()
4187 struct ocfs2_lock_res *lockres = &oinfo->dqi_gqlock; in ocfs2_qinfo_unlock()
4188 struct ocfs2_super *osb = OCFS2_SB(oinfo->dqi_gi.dqi_sb); in ocfs2_qinfo_unlock()
4197 struct mem_dqinfo *info = sb_dqinfo(oinfo->dqi_gi.dqi_sb, in ocfs2_refresh_qinfo()
4198 oinfo->dqi_gi.dqi_type); in ocfs2_refresh_qinfo()
4199 struct ocfs2_lock_res *lockres = &oinfo->dqi_gqlock; in ocfs2_refresh_qinfo()
4200 struct ocfs2_qinfo_lvb *lvb = ocfs2_dlm_lvb(&lockres->l_lksb); in ocfs2_refresh_qinfo()
4203 int status = 0; in ocfs2_refresh_qinfo() local
4205 if (ocfs2_dlm_lvb_valid(&lockres->l_lksb) && in ocfs2_refresh_qinfo()
4206 lvb->lvb_version == OCFS2_QINFO_LVB_VERSION) { in ocfs2_refresh_qinfo()
4207 info->dqi_bgrace = be32_to_cpu(lvb->lvb_bgrace); in ocfs2_refresh_qinfo()
4208 info->dqi_igrace = be32_to_cpu(lvb->lvb_igrace); in ocfs2_refresh_qinfo()
4209 oinfo->dqi_syncms = be32_to_cpu(lvb->lvb_syncms); in ocfs2_refresh_qinfo()
4210 oinfo->dqi_gi.dqi_blocks = be32_to_cpu(lvb->lvb_blocks); in ocfs2_refresh_qinfo()
4211 oinfo->dqi_gi.dqi_free_blk = be32_to_cpu(lvb->lvb_free_blk); in ocfs2_refresh_qinfo()
4212 oinfo->dqi_gi.dqi_free_entry = in ocfs2_refresh_qinfo()
4213 be32_to_cpu(lvb->lvb_free_entry); in ocfs2_refresh_qinfo()
4215 status = ocfs2_read_quota_phys_block(oinfo->dqi_gqinode, in ocfs2_refresh_qinfo()
4216 oinfo->dqi_giblk, &bh); in ocfs2_refresh_qinfo()
4217 if (status) { in ocfs2_refresh_qinfo()
4218 mlog_errno(status); in ocfs2_refresh_qinfo()
4222 (bh->b_data + OCFS2_GLOBAL_INFO_OFF); in ocfs2_refresh_qinfo()
4223 info->dqi_bgrace = le32_to_cpu(gdinfo->dqi_bgrace); in ocfs2_refresh_qinfo()
4224 info->dqi_igrace = le32_to_cpu(gdinfo->dqi_igrace); in ocfs2_refresh_qinfo()
4225 oinfo->dqi_syncms = le32_to_cpu(gdinfo->dqi_syncms); in ocfs2_refresh_qinfo()
4226 oinfo->dqi_gi.dqi_blocks = le32_to_cpu(gdinfo->dqi_blocks); in ocfs2_refresh_qinfo()
4227 oinfo->dqi_gi.dqi_free_blk = le32_to_cpu(gdinfo->dqi_free_blk); in ocfs2_refresh_qinfo()
4228 oinfo->dqi_gi.dqi_free_entry = in ocfs2_refresh_qinfo()
4229 le32_to_cpu(gdinfo->dqi_free_entry); in ocfs2_refresh_qinfo()
4235 return status; in ocfs2_refresh_qinfo()
4238 /* Lock quota info, this function expects at least shared lock on the quota file
4242 struct ocfs2_lock_res *lockres = &oinfo->dqi_gqlock; in ocfs2_qinfo_lock()
4243 struct ocfs2_super *osb = OCFS2_SB(oinfo->dqi_gi.dqi_sb); in ocfs2_qinfo_lock()
4245 int status = 0; in ocfs2_qinfo_lock() local
4250 status = -EROFS; in ocfs2_qinfo_lock()
4256 status = ocfs2_cluster_lock(osb, lockres, level, 0, 0); in ocfs2_qinfo_lock()
4257 if (status < 0) { in ocfs2_qinfo_lock()
4258 mlog_errno(status); in ocfs2_qinfo_lock()
4263 /* OK, we have the lock but we need to refresh the quota info */ in ocfs2_qinfo_lock()
4264 status = ocfs2_refresh_qinfo(oinfo); in ocfs2_qinfo_lock()
4265 if (status) in ocfs2_qinfo_lock()
4267 ocfs2_complete_lock_res_refresh(lockres, status); in ocfs2_qinfo_lock()
4269 return status; in ocfs2_qinfo_lock()
4274 int status; in ocfs2_refcount_lock() local
4276 struct ocfs2_lock_res *lockres = &ref_tree->rf_lockres; in ocfs2_refcount_lock()
4277 struct ocfs2_super *osb = lockres->l_priv; in ocfs2_refcount_lock()
4281 return -EROFS; in ocfs2_refcount_lock()
4286 status = ocfs2_cluster_lock(osb, lockres, level, 0, 0); in ocfs2_refcount_lock()
4287 if (status < 0) in ocfs2_refcount_lock()
4288 mlog_errno(status); in ocfs2_refcount_lock()
4290 return status; in ocfs2_refcount_lock()
4296 struct ocfs2_lock_res *lockres = &ref_tree->rf_lockres; in ocfs2_refcount_unlock()
4297 struct ocfs2_super *osb = lockres->l_priv; in ocfs2_refcount_unlock()
4306 int status; in ocfs2_process_blocked_lock() local
4315 BUG_ON(!lockres->l_ops); in ocfs2_process_blocked_lock()
4317 mlog(ML_BASTS, "lockres %s blocked\n", lockres->l_name); in ocfs2_process_blocked_lock()
4319 /* Detect whether a lock has been marked as going away while in ocfs2_process_blocked_lock()
4320 * the downconvert thread was processing other things. A lock can in ocfs2_process_blocked_lock()
4324 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_process_blocked_lock()
4325 if (lockres->l_flags & OCFS2_LOCK_FREEING) in ocfs2_process_blocked_lock()
4327 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_process_blocked_lock()
4329 status = ocfs2_unblock_lock(osb, lockres, &ctl); in ocfs2_process_blocked_lock()
4330 if (status < 0) in ocfs2_process_blocked_lock()
4331 mlog_errno(status); in ocfs2_process_blocked_lock()
4333 spin_lock_irqsave(&lockres->l_lock, flags); in ocfs2_process_blocked_lock()
4335 if (lockres->l_flags & OCFS2_LOCK_FREEING || !ctl.requeue) { in ocfs2_process_blocked_lock()
4340 mlog(ML_BASTS, "lockres %s, requeue = %s.\n", lockres->l_name, in ocfs2_process_blocked_lock()
4342 spin_unlock_irqrestore(&lockres->l_lock, flags); in ocfs2_process_blocked_lock()
4345 && lockres->l_ops->post_unlock) in ocfs2_process_blocked_lock()
4346 lockres->l_ops->post_unlock(osb, lockres); in ocfs2_process_blocked_lock()
4354 assert_spin_locked(&lockres->l_lock); in ocfs2_schedule_blocked_lock()
4356 if (lockres->l_flags & OCFS2_LOCK_FREEING) { in ocfs2_schedule_blocked_lock()
4357 /* Do not schedule a lock for downconvert when it's on in ocfs2_schedule_blocked_lock()
4358 * the way to destruction - any nodes wanting access in ocfs2_schedule_blocked_lock()
4361 lockres->l_name, lockres->l_flags); in ocfs2_schedule_blocked_lock()
4367 spin_lock_irqsave(&osb->dc_task_lock, flags); in ocfs2_schedule_blocked_lock()
4368 if (list_empty(&lockres->l_blocked_list)) { in ocfs2_schedule_blocked_lock()
4369 list_add_tail(&lockres->l_blocked_list, in ocfs2_schedule_blocked_lock()
4370 &osb->blocked_lock_list); in ocfs2_schedule_blocked_lock()
4371 osb->blocked_lock_count++; in ocfs2_schedule_blocked_lock()
4373 spin_unlock_irqrestore(&osb->dc_task_lock, flags); in ocfs2_schedule_blocked_lock()
4382 spin_lock_irqsave(&osb->dc_task_lock, flags); in ocfs2_downconvert_thread_do_work()
4384 * wake happens part-way through our work */ in ocfs2_downconvert_thread_do_work()
4385 osb->dc_work_sequence = osb->dc_wake_sequence; in ocfs2_downconvert_thread_do_work()
4387 processed = osb->blocked_lock_count; in ocfs2_downconvert_thread_do_work()
4389 * blocked lock processing in this loop might call iput which can in ocfs2_downconvert_thread_do_work()
4390 * remove items off osb->blocked_lock_list. Downconvert up to in ocfs2_downconvert_thread_do_work()
4394 while (processed && !list_empty(&osb->blocked_lock_list)) { in ocfs2_downconvert_thread_do_work()
4395 lockres = list_entry(osb->blocked_lock_list.next, in ocfs2_downconvert_thread_do_work()
4397 list_del_init(&lockres->l_blocked_list); in ocfs2_downconvert_thread_do_work()
4398 osb->blocked_lock_count--; in ocfs2_downconvert_thread_do_work()
4399 spin_unlock_irqrestore(&osb->dc_task_lock, flags); in ocfs2_downconvert_thread_do_work()
4402 processed--; in ocfs2_downconvert_thread_do_work()
4406 spin_lock_irqsave(&osb->dc_task_lock, flags); in ocfs2_downconvert_thread_do_work()
4408 spin_unlock_irqrestore(&osb->dc_task_lock, flags); in ocfs2_downconvert_thread_do_work()
4416 spin_lock_irqsave(&osb->dc_task_lock, flags); in ocfs2_downconvert_thread_lists_empty()
4417 if (list_empty(&osb->blocked_lock_list)) in ocfs2_downconvert_thread_lists_empty()
4420 spin_unlock_irqrestore(&osb->dc_task_lock, flags); in ocfs2_downconvert_thread_lists_empty()
4429 spin_lock_irqsave(&osb->dc_task_lock, flags); in ocfs2_downconvert_thread_should_wake()
4430 if (osb->dc_work_sequence != osb->dc_wake_sequence) in ocfs2_downconvert_thread_should_wake()
4432 spin_unlock_irqrestore(&osb->dc_task_lock, flags); in ocfs2_downconvert_thread_should_wake()
4446 wait_event_interruptible(osb->dc_event, in ocfs2_downconvert_thread()
4455 osb->dc_task = NULL; in ocfs2_downconvert_thread()
4463 spin_lock_irqsave(&osb->dc_task_lock, flags); in ocfs2_wake_downconvert_thread()
4466 osb->dc_wake_sequence++; in ocfs2_wake_downconvert_thread()
4467 spin_unlock_irqrestore(&osb->dc_task_lock, flags); in ocfs2_wake_downconvert_thread()
4468 wake_up(&osb->dc_event); in ocfs2_wake_downconvert_thread()