diff options
author | Bart Van Assche <bart.vanassche@sandisk.com> | 2017-04-27 13:11:21 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2017-04-27 17:08:42 -0400 |
commit | 1ea0654e46eb62acc379000be2f16350101ebf85 (patch) | |
tree | 52dceb575d77441dbbd2a5a2ec9f56f54304a2bc | |
parent | 73cbca6a637eb88738ea5a5cd6a611bbbca8ac19 (diff) |
dm: verify suspend_locking assumptions at runtime
Ensure that the assumptions about the caller holding suspend_lock
are checked at runtime if lockdep is enabled.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
-rw-r--r-- | drivers/md/dm-table.c | 4 | ||||
-rw-r--r-- | drivers/md/dm.c | 6 |
2 files changed, 8 insertions, 2 deletions
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index c68757f94e16..515136f29115 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
@@ -1680,6 +1680,8 @@ static void suspend_targets(struct dm_table *t, enum suspend_mode mode) | |||
1680 | int i = t->num_targets; | 1680 | int i = t->num_targets; |
1681 | struct dm_target *ti = t->targets; | 1681 | struct dm_target *ti = t->targets; |
1682 | 1682 | ||
1683 | lockdep_assert_held(&t->md->suspend_lock); | ||
1684 | |||
1683 | while (i--) { | 1685 | while (i--) { |
1684 | switch (mode) { | 1686 | switch (mode) { |
1685 | case PRESUSPEND: | 1687 | case PRESUSPEND: |
@@ -1727,6 +1729,8 @@ int dm_table_resume_targets(struct dm_table *t) | |||
1727 | { | 1729 | { |
1728 | int i, r = 0; | 1730 | int i, r = 0; |
1729 | 1731 | ||
1732 | lockdep_assert_held(&t->md->suspend_lock); | ||
1733 | |||
1730 | for (i = 0; i < t->num_targets; i++) { | 1734 | for (i = 0; i < t->num_targets; i++) { |
1731 | struct dm_target *ti = t->targets + i; | 1735 | struct dm_target *ti = t->targets + i; |
1732 | 1736 | ||
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index e602ae0d5d75..9940c9a42665 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -1698,6 +1698,8 @@ static void event_callback(void *context) | |||
1698 | */ | 1698 | */ |
1699 | static void __set_size(struct mapped_device *md, sector_t size) | 1699 | static void __set_size(struct mapped_device *md, sector_t size) |
1700 | { | 1700 | { |
1701 | lockdep_assert_held(&md->suspend_lock); | ||
1702 | |||
1701 | set_capacity(md->disk, size); | 1703 | set_capacity(md->disk, size); |
1702 | 1704 | ||
1703 | i_size_write(md->bdev->bd_inode, (loff_t)size << SECTOR_SHIFT); | 1705 | i_size_write(md->bdev->bd_inode, (loff_t)size << SECTOR_SHIFT); |
@@ -2147,8 +2149,6 @@ static void unlock_fs(struct mapped_device *md) | |||
2147 | * If __dm_suspend returns 0, the device is completely quiescent | 2149 | * If __dm_suspend returns 0, the device is completely quiescent |
2148 | * now. There is no request-processing activity. All new requests | 2150 | * now. There is no request-processing activity. All new requests |
2149 | * are being added to md->deferred list. | 2151 | * are being added to md->deferred list. |
2150 | * | ||
2151 | * Caller must hold md->suspend_lock | ||
2152 | */ | 2152 | */ |
2153 | static int __dm_suspend(struct mapped_device *md, struct dm_table *map, | 2153 | static int __dm_suspend(struct mapped_device *md, struct dm_table *map, |
2154 | unsigned suspend_flags, long task_state, | 2154 | unsigned suspend_flags, long task_state, |
@@ -2364,6 +2364,8 @@ static void __dm_internal_suspend(struct mapped_device *md, unsigned suspend_fla | |||
2364 | { | 2364 | { |
2365 | struct dm_table *map = NULL; | 2365 | struct dm_table *map = NULL; |
2366 | 2366 | ||
2367 | lockdep_assert_held(&md->suspend_lock); | ||
2368 | |||
2367 | if (md->internal_suspend_count++) | 2369 | if (md->internal_suspend_count++) |
2368 | return; /* nested internal suspend */ | 2370 | return; /* nested internal suspend */ |
2369 | 2371 | ||