|
|
@@ -103,8 +103,7 @@ static inline void unlock_device_hash_lock(struct r5conf *conf, int hash)
|
|
|
static inline void lock_all_device_hash_locks_irq(struct r5conf *conf)
|
|
|
{
|
|
|
int i;
|
|
|
- local_irq_disable();
|
|
|
- spin_lock(conf->hash_locks);
|
|
|
+ spin_lock_irq(conf->hash_locks);
|
|
|
for (i = 1; i < NR_STRIPE_HASH_LOCKS; i++)
|
|
|
spin_lock_nest_lock(conf->hash_locks + i, conf->hash_locks);
|
|
|
spin_lock(&conf->device_lock);
|
|
|
@@ -114,9 +113,9 @@ static inline void unlock_all_device_hash_locks_irq(struct r5conf *conf)
|
|
|
{
|
|
|
int i;
|
|
|
spin_unlock(&conf->device_lock);
|
|
|
- for (i = NR_STRIPE_HASH_LOCKS; i; i--)
|
|
|
- spin_unlock(conf->hash_locks + i - 1);
|
|
|
- local_irq_enable();
|
|
|
+ for (i = NR_STRIPE_HASH_LOCKS - 1; i; i--)
|
|
|
+ spin_unlock(conf->hash_locks + i);
|
|
|
+ spin_unlock_irq(conf->hash_locks);
|
|
|
}
|
|
|
|
|
|
/* Find first data disk in a raid6 stripe */
|
|
|
@@ -714,12 +713,11 @@ static bool is_full_stripe_write(struct stripe_head *sh)
|
|
|
|
|
|
static void lock_two_stripes(struct stripe_head *sh1, struct stripe_head *sh2)
|
|
|
{
|
|
|
- local_irq_disable();
|
|
|
if (sh1 > sh2) {
|
|
|
- spin_lock(&sh2->stripe_lock);
|
|
|
+ spin_lock_irq(&sh2->stripe_lock);
|
|
|
spin_lock_nested(&sh1->stripe_lock, 1);
|
|
|
} else {
|
|
|
- spin_lock(&sh1->stripe_lock);
|
|
|
+ spin_lock_irq(&sh1->stripe_lock);
|
|
|
spin_lock_nested(&sh2->stripe_lock, 1);
|
|
|
}
|
|
|
}
|
|
|
@@ -727,8 +725,7 @@ static void lock_two_stripes(struct stripe_head *sh1, struct stripe_head *sh2)
|
|
|
static void unlock_two_stripes(struct stripe_head *sh1, struct stripe_head *sh2)
|
|
|
{
|
|
|
spin_unlock(&sh1->stripe_lock);
|
|
|
- spin_unlock(&sh2->stripe_lock);
|
|
|
- local_irq_enable();
|
|
|
+ spin_unlock_irq(&sh2->stripe_lock);
|
|
|
}
|
|
|
|
|
|
/* Only freshly new full stripe normal write stripe can be added to a batch list */
|