aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ocfs2')
-rw-r--r--fs/ocfs2/dlm/dlmrecovery.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c
index 3057b65a4b8..f93315c9887 100644
--- a/fs/ocfs2/dlm/dlmrecovery.c
+++ b/fs/ocfs2/dlm/dlmrecovery.c
@@ -1708,10 +1708,11 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm,
1708{ 1708{
1709 struct dlm_migratable_lock *ml; 1709 struct dlm_migratable_lock *ml;
1710 struct list_head *queue; 1710 struct list_head *queue;
1711 struct list_head *tmpq = NULL;
1711 struct dlm_lock *newlock = NULL; 1712 struct dlm_lock *newlock = NULL;
1712 struct dlm_lockstatus *lksb = NULL; 1713 struct dlm_lockstatus *lksb = NULL;
1713 int ret = 0; 1714 int ret = 0;
1714 int i, bad; 1715 int i, j, bad;
1715 struct list_head *iter; 1716 struct list_head *iter;
1716 struct dlm_lock *lock = NULL; 1717 struct dlm_lock *lock = NULL;
1717 u8 from = O2NM_MAX_NODES; 1718 u8 from = O2NM_MAX_NODES;
@@ -1738,6 +1739,7 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm,
1738 lksb = NULL; 1739 lksb = NULL;
1739 1740
1740 queue = dlm_list_num_to_pointer(res, ml->list); 1741 queue = dlm_list_num_to_pointer(res, ml->list);
1742 tmpq = NULL;
1741 1743
1742 /* if the lock is for the local node it needs to 1744 /* if the lock is for the local node it needs to
1743 * be moved to the proper location within the queue. 1745 * be moved to the proper location within the queue.
@@ -1747,11 +1749,16 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm,
1747 BUG_ON(!(mres->flags & DLM_MRES_MIGRATION)); 1749 BUG_ON(!(mres->flags & DLM_MRES_MIGRATION));
1748 1750
1749 spin_lock(&res->spinlock); 1751 spin_lock(&res->spinlock);
1750 list_for_each(iter, queue) { 1752 for (j = DLM_GRANTED_LIST; j <= DLM_BLOCKED_LIST; j++) {
1751 lock = list_entry (iter, struct dlm_lock, list); 1753 tmpq = dlm_list_idx_to_ptr(res, j);
1752 if (lock->ml.cookie != ml->cookie) 1754 list_for_each(iter, tmpq) {
1753 lock = NULL; 1755 lock = list_entry (iter, struct dlm_lock, list);
1754 else 1756 if (lock->ml.cookie != ml->cookie)
1757 lock = NULL;
1758 else
1759 break;
1760 }
1761 if (lock)
1755 break; 1762 break;
1756 } 1763 }
1757 1764
@@ -1768,6 +1775,13 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm,
1768 } 1775 }
1769 BUG_ON(lock->ml.node != ml->node); 1776 BUG_ON(lock->ml.node != ml->node);
1770 1777
1778 if (tmpq != queue) {
1779 mlog(0, "lock was on %u instead of %u for %.*s\n",
1780 j, ml->list, res->lockname.len, res->lockname.name);
1781 spin_unlock(&res->spinlock);
1782 continue;
1783 }
1784
1771 /* see NOTE above about why we do not update 1785 /* see NOTE above about why we do not update
1772 * to match the master here */ 1786 * to match the master here */
1773 1787