diff options
author | Mike Snitzer <snitzer@redhat.com> | 2017-06-19 10:55:47 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2017-06-21 11:45:02 -0400 |
commit | 7def52b78a5fda14864aab9b6fd14f09a4d4ff72 (patch) | |
tree | fa4686fb458fd43860bca7b069bc5ff967d0e975 | |
parent | cd15fb64ee56192760ad5c1e2ad97a65e735b18b (diff) |
dm integrity: fix to not disable/enable interrupts from interrupt context
Use spin_lock_irqsave and spin_unlock_irqrestore rather than
spin_{lock,unlock}_irq in submit_flush_bio().
Otherwise lockdep issues the following warning:
DEBUG_LOCKS_WARN_ON(current->hardirq_context)
WARNING: CPU: 1 PID: 0 at kernel/locking/lockdep.c:2748 trace_hardirqs_on_caller+0x107/0x180
Reported-by: Ondrej Kozina <okozina@redhat.com>
Tested-by: Ondrej Kozina <okozina@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Acked-by: Mikulas Patocka <mpatocka@redhat.com>
-rw-r--r-- | drivers/md/dm-integrity.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c index 4ab10cf718c9..93b181088168 100644 --- a/drivers/md/dm-integrity.c +++ b/drivers/md/dm-integrity.c | |||
@@ -1105,10 +1105,13 @@ static void schedule_autocommit(struct dm_integrity_c *ic) | |||
1105 | static void submit_flush_bio(struct dm_integrity_c *ic, struct dm_integrity_io *dio) | 1105 | static void submit_flush_bio(struct dm_integrity_c *ic, struct dm_integrity_io *dio) |
1106 | { | 1106 | { |
1107 | struct bio *bio; | 1107 | struct bio *bio; |
1108 | spin_lock_irq(&ic->endio_wait.lock); | 1108 | unsigned long flags; |
1109 | |||
1110 | spin_lock_irqsave(&ic->endio_wait.lock, flags); | ||
1109 | bio = dm_bio_from_per_bio_data(dio, sizeof(struct dm_integrity_io)); | 1111 | bio = dm_bio_from_per_bio_data(dio, sizeof(struct dm_integrity_io)); |
1110 | bio_list_add(&ic->flush_bio_list, bio); | 1112 | bio_list_add(&ic->flush_bio_list, bio); |
1111 | spin_unlock_irq(&ic->endio_wait.lock); | 1113 | spin_unlock_irqrestore(&ic->endio_wait.lock, flags); |
1114 | |||
1112 | queue_work(ic->commit_wq, &ic->commit_work); | 1115 | queue_work(ic->commit_wq, &ic->commit_work); |
1113 | } | 1116 | } |
1114 | 1117 | ||