|
@@ -507,13 +507,27 @@ static bool __must_push_back(struct multipath *m)
|
|
|
|
|
|
static bool must_push_back_rq(struct multipath *m)
|
|
static bool must_push_back_rq(struct multipath *m)
|
|
{
|
|
{
|
|
- return (test_bit(MPATHF_QUEUE_IF_NO_PATH, &m->flags) ||
|
|
|
|
- __must_push_back(m));
|
|
|
|
|
|
+ bool r;
|
|
|
|
+ unsigned long flags;
|
|
|
|
+
|
|
|
|
+ spin_lock_irqsave(&m->lock, flags);
|
|
|
|
+ r = (test_bit(MPATHF_QUEUE_IF_NO_PATH, &m->flags) ||
|
|
|
|
+ __must_push_back(m));
|
|
|
|
+ spin_unlock_irqrestore(&m->lock, flags);
|
|
|
|
+
|
|
|
|
+ return r;
|
|
}
|
|
}
|
|
|
|
|
|
static bool must_push_back_bio(struct multipath *m)
|
|
static bool must_push_back_bio(struct multipath *m)
|
|
{
|
|
{
|
|
- return __must_push_back(m);
|
|
|
|
|
|
+ bool r;
|
|
|
|
+ unsigned long flags;
|
|
|
|
+
|
|
|
|
+ spin_lock_irqsave(&m->lock, flags);
|
|
|
|
+ r = __must_push_back(m);
|
|
|
|
+ spin_unlock_irqrestore(&m->lock, flags);
|
|
|
|
+
|
|
|
|
+ return r;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -1680,12 +1694,14 @@ static void multipath_postsuspend(struct dm_target *ti)
|
|
static void multipath_resume(struct dm_target *ti)
|
|
static void multipath_resume(struct dm_target *ti)
|
|
{
|
|
{
|
|
struct multipath *m = ti->private;
|
|
struct multipath *m = ti->private;
|
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
|
|
+ spin_lock_irqsave(&m->lock, flags);
|
|
if (test_bit(MPATHF_SAVED_QUEUE_IF_NO_PATH, &m->flags))
|
|
if (test_bit(MPATHF_SAVED_QUEUE_IF_NO_PATH, &m->flags))
|
|
set_bit(MPATHF_QUEUE_IF_NO_PATH, &m->flags);
|
|
set_bit(MPATHF_QUEUE_IF_NO_PATH, &m->flags);
|
|
else
|
|
else
|
|
clear_bit(MPATHF_QUEUE_IF_NO_PATH, &m->flags);
|
|
clear_bit(MPATHF_QUEUE_IF_NO_PATH, &m->flags);
|
|
- smp_mb__after_atomic();
|
|
|
|
|
|
+ spin_unlock_irqrestore(&m->lock, flags);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|