diff options
author | Joe Thornber <ejt@redhat.com> | 2017-03-20 11:54:11 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2017-03-20 16:00:49 -0400 |
commit | 0d963b6e650d9d5533223f3dbcde7dda466df65c (patch) | |
tree | 5ecc07ecd3618e8aa476af8ef5abb7099a40aa16 | |
parent | f1a880a93baaadb14c10a348fd199f1cdb6bcccd (diff) |
dm cache metadata: fix metadata2 format's blocks_are_clean_separate_dirty
The dm_bitset_cursor_begin() call was using the incorrect nr_entries.
Also, the last dm_bitset_cursor_next() must be avoided if we're at the
end of the cursor.
Fixes: 7f1b21591a6 ("dm cache metadata: use cursor api in blocks_are_clean_separate_dirty()")
Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
-rw-r--r-- | drivers/md/dm-cache-metadata.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c index e4c2c1a1e993..6735c8d6a445 100644 --- a/drivers/md/dm-cache-metadata.c +++ b/drivers/md/dm-cache-metadata.c | |||
@@ -932,7 +932,7 @@ static int blocks_are_clean_separate_dirty(struct dm_cache_metadata *cmd, | |||
932 | *result = true; | 932 | *result = true; |
933 | 933 | ||
934 | r = dm_bitset_cursor_begin(&cmd->dirty_info, cmd->dirty_root, | 934 | r = dm_bitset_cursor_begin(&cmd->dirty_info, cmd->dirty_root, |
935 | from_cblock(begin), &cmd->dirty_cursor); | 935 | from_cblock(cmd->cache_blocks), &cmd->dirty_cursor); |
936 | if (r) { | 936 | if (r) { |
937 | DMERR("%s: dm_bitset_cursor_begin for dirty failed", __func__); | 937 | DMERR("%s: dm_bitset_cursor_begin for dirty failed", __func__); |
938 | return r; | 938 | return r; |
@@ -959,14 +959,16 @@ static int blocks_are_clean_separate_dirty(struct dm_cache_metadata *cmd, | |||
959 | return 0; | 959 | return 0; |
960 | } | 960 | } |
961 | 961 | ||
962 | begin = to_cblock(from_cblock(begin) + 1); | ||
963 | if (begin == end) | ||
964 | break; | ||
965 | |||
962 | r = dm_bitset_cursor_next(&cmd->dirty_cursor); | 966 | r = dm_bitset_cursor_next(&cmd->dirty_cursor); |
963 | if (r) { | 967 | if (r) { |
964 | DMERR("%s: dm_bitset_cursor_next for dirty failed", __func__); | 968 | DMERR("%s: dm_bitset_cursor_next for dirty failed", __func__); |
965 | dm_bitset_cursor_end(&cmd->dirty_cursor); | 969 | dm_bitset_cursor_end(&cmd->dirty_cursor); |
966 | return r; | 970 | return r; |
967 | } | 971 | } |
968 | |||
969 | begin = to_cblock(from_cblock(begin) + 1); | ||
970 | } | 972 | } |
971 | 973 | ||
972 | dm_bitset_cursor_end(&cmd->dirty_cursor); | 974 | dm_bitset_cursor_end(&cmd->dirty_cursor); |