- 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" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJVzPl/AAoJEMUj8QotnQNa2MUH/24BKs8WYNy79B9pr6H41ouQ LAXFVfx3Vy7n3U1KrZcPylXb7R0feXphUrSXJ6ZlKz/Df+AhG5ycUOCfSZxSDpA9 pX5rtWFSWLXGF3wRf0GXqB3CXkrMKlNWVAUlzge39TpIzpdkbh9reM9He4yQphl9 u0QVvIOTQsUrtN9htnQb7Dgmm7qD6NinrebOrWTiOqBdCh3Iw4J48RsYggYOG0ZP fbMnpZlH537vgLyKaz72Xh+kMrYmP5DBd1f+iAUBVKk12HQVQNMzEwOgkEB0M+4l EG3c4O3zMVrBxXdxsI2srFZfLX2XeUYAuMx8cfVSSCDEzQwjC0kmXVdkCYuAjAk= =r/53 -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
5b3e2e14ea
@ -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);
|
|||||||
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)
|
|||||||
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);
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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++) {
|
||||||
|
Loading…
Reference in New Issue
Block a user