diff options
| -rw-r--r-- | drivers/md/dm-cache-metadata.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c index 7e31a4b1c476..e4c2c1a1e993 100644 --- a/drivers/md/dm-cache-metadata.c +++ b/drivers/md/dm-cache-metadata.c | |||
| @@ -931,27 +931,46 @@ static int blocks_are_clean_separate_dirty(struct dm_cache_metadata *cmd, | |||
| 931 | bool dirty_flag; | 931 | bool dirty_flag; |
| 932 | *result = true; | 932 | *result = true; |
| 933 | 933 | ||
| 934 | // FIXME: use a cursor so we can benefit from preloading metadata. | 934 | r = dm_bitset_cursor_begin(&cmd->dirty_info, cmd->dirty_root, |
| 935 | from_cblock(begin), &cmd->dirty_cursor); | ||
| 936 | if (r) { | ||
| 937 | DMERR("%s: dm_bitset_cursor_begin for dirty failed", __func__); | ||
| 938 | return r; | ||
| 939 | } | ||
| 940 | |||
| 941 | r = dm_bitset_cursor_skip(&cmd->dirty_cursor, from_cblock(begin)); | ||
| 942 | if (r) { | ||
| 943 | DMERR("%s: dm_bitset_cursor_skip for dirty failed", __func__); | ||
| 944 | dm_bitset_cursor_end(&cmd->dirty_cursor); | ||
| 945 | return r; | ||
| 946 | } | ||
| 947 | |||
| 935 | while (begin != end) { | 948 | while (begin != end) { |
| 936 | /* | 949 | /* |
| 937 | * We assume that unmapped blocks have their dirty bit | 950 | * We assume that unmapped blocks have their dirty bit |
| 938 | * cleared. | 951 | * cleared. |
| 939 | */ | 952 | */ |
| 940 | r = dm_bitset_test_bit(&cmd->dirty_info, cmd->dirty_root, | 953 | dirty_flag = dm_bitset_cursor_get_value(&cmd->dirty_cursor); |
| 941 | from_cblock(begin), &cmd->dirty_root, &dirty_flag); | ||
| 942 | if (r) | ||
| 943 | return r; | ||
| 944 | |||
| 945 | if (dirty_flag) { | 954 | if (dirty_flag) { |
| 946 | DMERR("cache block %llu is dirty", | 955 | DMERR("%s: cache block %llu is dirty", __func__, |
| 947 | (unsigned long long) from_cblock(begin)); | 956 | (unsigned long long) from_cblock(begin)); |
| 957 | dm_bitset_cursor_end(&cmd->dirty_cursor); | ||
| 948 | *result = false; | 958 | *result = false; |
| 949 | return 0; | 959 | return 0; |
| 950 | } | 960 | } |
| 951 | 961 | ||
| 962 | r = dm_bitset_cursor_next(&cmd->dirty_cursor); | ||
| 963 | if (r) { | ||
| 964 | DMERR("%s: dm_bitset_cursor_next for dirty failed", __func__); | ||
| 965 | dm_bitset_cursor_end(&cmd->dirty_cursor); | ||
| 966 | return r; | ||
| 967 | } | ||
| 968 | |||
| 952 | begin = to_cblock(from_cblock(begin) + 1); | 969 | begin = to_cblock(from_cblock(begin) + 1); |
| 953 | } | 970 | } |
| 954 | 971 | ||
| 972 | dm_bitset_cursor_end(&cmd->dirty_cursor); | ||
| 973 | |||
| 955 | return 0; | 974 | return 0; |
| 956 | } | 975 | } |
| 957 | 976 | ||
