These locks are used in both interrupt and user context so we must
preserve interrupts state.

https://virtuozzo.atlassian.net/browse/VSTOR-98471
Signed-off-by: Alexander Atanasov <alexander.atana...@virtuozzo.com>
---
 drivers/md/dm-ploop-map.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index a47341f40627..c6c46b49bccf 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -1408,6 +1408,7 @@ static void ploop_check_standby_mode(struct ploop *ploop, 
long res)
 {
        struct request_queue *q = ploop_blk_queue(ploop);
        int prev;
+       unsigned long flags;
 
        if (!blk_queue_standby_en(q))
                return;
@@ -1416,9 +1417,9 @@ static void ploop_check_standby_mode(struct ploop *ploop, 
long res)
        if (res != -EBUSY && res != -ENOTCONN && res != -EIO)
                return;
 
-       spin_lock_irq(&q->queue_lock);
+       spin_lock_irqsave(&q->queue_lock, flags);
        prev = blk_queue_flag_test_and_set(QUEUE_FLAG_STANDBY, q);
-       spin_unlock_irq(&q->queue_lock);
+       spin_unlock_irqrestore(&q->queue_lock, flags);
 
        if (!prev)
                PL_INFO("was switched into the standby mode");
@@ -1540,12 +1541,13 @@ static bool ploop_postpone_if_cluster_locked(struct 
ploop *ploop,
                                             struct pio *pio, u32 clu)
 {
        struct pio *e_h; /* Exclusively locked */
+       unsigned long flags;
 
-       spin_lock_irq(&ploop->deferred_lock);
+       spin_lock_irqsave(&ploop->deferred_lock, flags);
        e_h = ploop_find_lk_of_cluster(ploop, clu);
        if (e_h && pio)
                ploop_add_endio_pio(e_h, pio);
-       spin_unlock_irq(&ploop->deferred_lock);
+       spin_unlock_irqrestore(&ploop->deferred_lock, flags);
 
        return e_h != NULL;
 }
-- 
2.43.0

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to