diff options
| author | Wengang Wang <wen.gang.wang@oracle.com> | 2010-07-14 10:38:21 -0400 |
|---|---|---|
| committer | Joel Becker <joel.becker@oracle.com> | 2010-07-15 13:56:30 -0400 |
| commit | a39953dd95ff10e311083d94f4f95c348cb22464 (patch) | |
| tree | c905adf070262a6782d7a1b664495c36fbe95fab | |
| parent | f5e27b6ddfbafdd9c9c2f06bbf28af12581409bc (diff) | |
ocfs2/dlm: Remove BUG_ON from migration in the rare case of a down node
For migration, we are waiting for DLM_LOCK_RES_MIGRATING flag to be set
before sending DLM_MIG_LOCKRES_MSG message to the target. We are using
dlm_migration_can_proceed() for that purpose. However, if the node is
down, dlm_migration_can_proceed() will also return "go ahead". In this
rare case, the DLM_LOCK_RES_MIGRATING flag might not be set yet. Remove
the BUG_ON() that trips over this condition.
Signed-off-by: Wengang Wang <wen.gang.wang@oracle.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
| -rw-r--r-- | fs/ocfs2/dlm/dlmmaster.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index 4a7506a4e314..94b97fc6a88e 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
| @@ -2808,14 +2808,8 @@ again: | |||
| 2808 | mlog(0, "trying again...\n"); | 2808 | mlog(0, "trying again...\n"); |
| 2809 | goto again; | 2809 | goto again; |
| 2810 | } | 2810 | } |
| 2811 | /* now that we are sure the MIGRATING state is there, drop | ||
| 2812 | * the unneded state which blocked threads trying to DIRTY */ | ||
| 2813 | spin_lock(&res->spinlock); | ||
| 2814 | BUG_ON(!(res->state & DLM_LOCK_RES_BLOCK_DIRTY)); | ||
| 2815 | BUG_ON(!(res->state & DLM_LOCK_RES_MIGRATING)); | ||
| 2816 | res->state &= ~DLM_LOCK_RES_BLOCK_DIRTY; | ||
| 2817 | spin_unlock(&res->spinlock); | ||
| 2818 | 2811 | ||
| 2812 | ret = 0; | ||
| 2819 | /* did the target go down or die? */ | 2813 | /* did the target go down or die? */ |
| 2820 | spin_lock(&dlm->spinlock); | 2814 | spin_lock(&dlm->spinlock); |
| 2821 | if (!test_bit(target, dlm->domain_map)) { | 2815 | if (!test_bit(target, dlm->domain_map)) { |
| @@ -2826,9 +2820,21 @@ again: | |||
| 2826 | spin_unlock(&dlm->spinlock); | 2820 | spin_unlock(&dlm->spinlock); |
| 2827 | 2821 | ||
| 2828 | /* | 2822 | /* |
| 2823 | * if target is down, we need to clear DLM_LOCK_RES_BLOCK_DIRTY for | ||
| 2824 | * another try; otherwise, we are sure the MIGRATING state is there, | ||
| 2825 | * drop the unneded state which blocked threads trying to DIRTY | ||
| 2826 | */ | ||
| 2827 | spin_lock(&res->spinlock); | ||
| 2828 | BUG_ON(!(res->state & DLM_LOCK_RES_BLOCK_DIRTY)); | ||
| 2829 | res->state &= ~DLM_LOCK_RES_BLOCK_DIRTY; | ||
| 2830 | if (!ret) | ||
| 2831 | BUG_ON(!(res->state & DLM_LOCK_RES_MIGRATING)); | ||
| 2832 | spin_unlock(&res->spinlock); | ||
| 2833 | |||
| 2834 | /* | ||
| 2829 | * at this point: | 2835 | * at this point: |
| 2830 | * | 2836 | * |
| 2831 | * o the DLM_LOCK_RES_MIGRATING flag is set | 2837 | * o the DLM_LOCK_RES_MIGRATING flag is set if target not down |
| 2832 | * o there are no pending asts on this lockres | 2838 | * o there are no pending asts on this lockres |
| 2833 | * o all processes trying to reserve an ast on this | 2839 | * o all processes trying to reserve an ast on this |
| 2834 | * lockres must wait for the MIGRATING flag to clear | 2840 | * lockres must wait for the MIGRATING flag to clear |
