Loading fs/ocfs2/dlmglue.c +18 −1 Original line number Diff line number Diff line Loading @@ -118,6 +118,18 @@ struct ocfs2_lock_res_ops { int (*unblock)(struct ocfs2_lock_res *, struct ocfs2_unblock_ctl *); void (*post_unlock)(struct ocfs2_super *, struct ocfs2_lock_res *); /* * Allow a lock type to add checks to determine whether it is * safe to downconvert a lock. Return 0 to re-queue the * downconvert at a later time, nonzero to continue. * * For most locks, the default checks that there are no * incompatible holders are sufficient. * * Called with the lockres spinlock held. */ int (*check_downconvert)(struct ocfs2_lock_res *, int); /* * LOCK_TYPE_* flags which describe the specific requirements * of a lock type. Descriptions of each individual flag follow. Loading Loading @@ -2657,6 +2669,12 @@ static int ocfs2_generic_unblock_lock(struct ocfs2_super *osb, && (lockres->l_flags & OCFS2_LOCK_REFRESHING)) goto leave_requeue; new_level = ocfs2_highest_compat_lock_level(lockres->l_blocking); if (lockres->l_ops->check_downconvert && !lockres->l_ops->check_downconvert(lockres, new_level)) goto leave_requeue; /* If we get here, then we know that there are no more * incompatible holders (and anyone asking for an incompatible * lock is blocked). We can now downconvert the lock */ Loading Loading @@ -2684,7 +2702,6 @@ static int ocfs2_generic_unblock_lock(struct ocfs2_super *osb, downconvert: ctl->requeue = 0; new_level = ocfs2_highest_compat_lock_level(lockres->l_blocking); ocfs2_prepare_downconvert(lockres, new_level); spin_unlock_irqrestore(&lockres->l_lock, flags); Loading Loading
fs/ocfs2/dlmglue.c +18 −1 Original line number Diff line number Diff line Loading @@ -118,6 +118,18 @@ struct ocfs2_lock_res_ops { int (*unblock)(struct ocfs2_lock_res *, struct ocfs2_unblock_ctl *); void (*post_unlock)(struct ocfs2_super *, struct ocfs2_lock_res *); /* * Allow a lock type to add checks to determine whether it is * safe to downconvert a lock. Return 0 to re-queue the * downconvert at a later time, nonzero to continue. * * For most locks, the default checks that there are no * incompatible holders are sufficient. * * Called with the lockres spinlock held. */ int (*check_downconvert)(struct ocfs2_lock_res *, int); /* * LOCK_TYPE_* flags which describe the specific requirements * of a lock type. Descriptions of each individual flag follow. Loading Loading @@ -2657,6 +2669,12 @@ static int ocfs2_generic_unblock_lock(struct ocfs2_super *osb, && (lockres->l_flags & OCFS2_LOCK_REFRESHING)) goto leave_requeue; new_level = ocfs2_highest_compat_lock_level(lockres->l_blocking); if (lockres->l_ops->check_downconvert && !lockres->l_ops->check_downconvert(lockres, new_level)) goto leave_requeue; /* If we get here, then we know that there are no more * incompatible holders (and anyone asking for an incompatible * lock is blocked). We can now downconvert the lock */ Loading Loading @@ -2684,7 +2702,6 @@ static int ocfs2_generic_unblock_lock(struct ocfs2_super *osb, downconvert: ctl->requeue = 0; new_level = ocfs2_highest_compat_lock_level(lockres->l_blocking); ocfs2_prepare_downconvert(lockres, new_level); spin_unlock_irqrestore(&lockres->l_lock, flags); Loading