Commit 5b3e2e14 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'dm-4.2-fixes-5' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm

Pull device mapper fixes from Mike Snitzer:

 - two stable fixes for corruption seen in a snapshot of thinp metadata;
   metadata snapshots aren't widely used but help provide a consistent
   view of the metadata associated with an active thin-pool.

 - a dm-cache fix for the 4.2 "default" policy switch from "mq" to "smq"

* tag 'dm-4.2-fixes-5' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm:
  dm cache policy smq: move 'dm-cache-default' module alias to SMQ
  dm btree: add ref counting ops for the leaves of top level btrees
  dm thin metadata: delete btrees when releasing metadata snapshot
parents ebcbf166 34dd0517
...@@ -1471,5 +1471,3 @@ module_exit(mq_exit); ...@@ -1471,5 +1471,3 @@ module_exit(mq_exit);
MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>"); MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("mq cache policy"); MODULE_DESCRIPTION("mq cache policy");
MODULE_ALIAS("dm-cache-default");
...@@ -1789,3 +1789,5 @@ module_exit(smq_exit); ...@@ -1789,3 +1789,5 @@ module_exit(smq_exit);
MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>"); MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("smq cache policy"); MODULE_DESCRIPTION("smq cache policy");
MODULE_ALIAS("dm-cache-default");
...@@ -1293,8 +1293,8 @@ static int __release_metadata_snap(struct dm_pool_metadata *pmd) ...@@ -1293,8 +1293,8 @@ static int __release_metadata_snap(struct dm_pool_metadata *pmd)
return r; return r;
disk_super = dm_block_data(copy); disk_super = dm_block_data(copy);
dm_sm_dec_block(pmd->metadata_sm, le64_to_cpu(disk_super->data_mapping_root)); dm_btree_del(&pmd->info, le64_to_cpu(disk_super->data_mapping_root));
dm_sm_dec_block(pmd->metadata_sm, le64_to_cpu(disk_super->device_details_root)); dm_btree_del(&pmd->details_info, le64_to_cpu(disk_super->device_details_root));
dm_sm_dec_block(pmd->metadata_sm, held_root); dm_sm_dec_block(pmd->metadata_sm, held_root);
return dm_tm_unlock(pmd->tm, copy); return dm_tm_unlock(pmd->tm, copy);
......
...@@ -138,4 +138,10 @@ int lower_bound(struct btree_node *n, uint64_t key); ...@@ -138,4 +138,10 @@ int lower_bound(struct btree_node *n, uint64_t key);
extern struct dm_block_validator btree_node_validator; extern struct dm_block_validator btree_node_validator;
/*
* Value type for upper levels of multi-level btrees.
*/
extern void init_le64_type(struct dm_transaction_manager *tm,
struct dm_btree_value_type *vt);
#endif /* DM_BTREE_INTERNAL_H */ #endif /* DM_BTREE_INTERNAL_H */
...@@ -544,14 +544,6 @@ static int remove_raw(struct shadow_spine *s, struct dm_btree_info *info, ...@@ -544,14 +544,6 @@ static int remove_raw(struct shadow_spine *s, struct dm_btree_info *info,
return r; return r;
} }
static struct dm_btree_value_type le64_type = {
.context = NULL,
.size = sizeof(__le64),
.inc = NULL,
.dec = NULL,
.equal = NULL
};
int dm_btree_remove(struct dm_btree_info *info, dm_block_t root, int dm_btree_remove(struct dm_btree_info *info, dm_block_t root,
uint64_t *keys, dm_block_t *new_root) uint64_t *keys, dm_block_t *new_root)
{ {
...@@ -559,12 +551,14 @@ int dm_btree_remove(struct dm_btree_info *info, dm_block_t root, ...@@ -559,12 +551,14 @@ int dm_btree_remove(struct dm_btree_info *info, dm_block_t root,
int index = 0, r = 0; int index = 0, r = 0;
struct shadow_spine spine; struct shadow_spine spine;
struct btree_node *n; struct btree_node *n;
struct dm_btree_value_type le64_vt;
init_le64_type(info->tm, &le64_vt);
init_shadow_spine(&spine, info); init_shadow_spine(&spine, info);
for (level = 0; level < info->levels; level++) { for (level = 0; level < info->levels; level++) {
r = remove_raw(&spine, info, r = remove_raw(&spine, info,
(level == last_level ? (level == last_level ?
&info->value_type : &le64_type), &info->value_type : &le64_vt),
root, keys[level], (unsigned *)&index); root, keys[level], (unsigned *)&index);
if (r < 0) if (r < 0)
break; break;
...@@ -654,11 +648,13 @@ static int remove_one(struct dm_btree_info *info, dm_block_t root, ...@@ -654,11 +648,13 @@ static int remove_one(struct dm_btree_info *info, dm_block_t root,
int index = 0, r = 0; int index = 0, r = 0;
struct shadow_spine spine; struct shadow_spine spine;
struct btree_node *n; struct btree_node *n;
struct dm_btree_value_type le64_vt;
uint64_t k; uint64_t k;
init_le64_type(info->tm, &le64_vt);
init_shadow_spine(&spine, info); init_shadow_spine(&spine, info);
for (level = 0; level < last_level; level++) { for (level = 0; level < last_level; level++) {
r = remove_raw(&spine, info, &le64_type, r = remove_raw(&spine, info, &le64_vt,
root, keys[level], (unsigned *) &index); root, keys[level], (unsigned *) &index);
if (r < 0) if (r < 0)
goto out; goto out;
......
...@@ -249,3 +249,40 @@ int shadow_root(struct shadow_spine *s) ...@@ -249,3 +249,40 @@ int shadow_root(struct shadow_spine *s)
{ {
return s->root; return s->root;
} }
static void le64_inc(void *context, const void *value_le)
{
struct dm_transaction_manager *tm = context;
__le64 v_le;
memcpy(&v_le, value_le, sizeof(v_le));
dm_tm_inc(tm, le64_to_cpu(v_le));
}
static void le64_dec(void *context, const void *value_le)
{
struct dm_transaction_manager *tm = context;
__le64 v_le;
memcpy(&v_le, value_le, sizeof(v_le));
dm_tm_dec(tm, le64_to_cpu(v_le));
}
static int le64_equal(void *context, const void *value1_le, const void *value2_le)
{
__le64 v1_le, v2_le;
memcpy(&v1_le, value1_le, sizeof(v1_le));
memcpy(&v2_le, value2_le, sizeof(v2_le));
return v1_le == v2_le;
}
void init_le64_type(struct dm_transaction_manager *tm,
struct dm_btree_value_type *vt)
{
vt->context = tm;
vt->size = sizeof(__le64);
vt->inc = le64_inc;
vt->dec = le64_dec;
vt->equal = le64_equal;
}
...@@ -667,12 +667,7 @@ static int insert(struct dm_btree_info *info, dm_block_t root, ...@@ -667,12 +667,7 @@ static int insert(struct dm_btree_info *info, dm_block_t root,
struct btree_node *n; struct btree_node *n;
struct dm_btree_value_type le64_type; struct dm_btree_value_type le64_type;
le64_type.context = NULL; init_le64_type(info->tm, &le64_type);
le64_type.size = sizeof(__le64);
le64_type.inc = NULL;
le64_type.dec = NULL;
le64_type.equal = NULL;
init_shadow_spine(&spine, info); init_shadow_spine(&spine, info);
for (level = 0; level < (info->levels - 1); level++) { for (level = 0; level < (info->levels - 1); level++) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment