Skip to content

Commit 35df017

Browse files
committed
Merge tag 'dm-4.3-fixes-4' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm
Pull device mapper fixes from Mike Snitzer: "Three stable fixes (two in btree code used by DM thinp and one to properly store flags in DM cache metadata's superblock)" * tag 'dm-4.3-fixes-4' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm: dm cache: the CLEAN_SHUTDOWN flag was not being set dm btree: fix leak of bufio-backed block in btree_split_beneath error path dm btree remove: fix a bug when rebalancing nodes after removal
2 parents ea1ee5f + 3201ac4 commit 35df017

File tree

3 files changed

+13
-8
lines changed

3 files changed

+13
-8
lines changed

drivers/md/dm-cache-metadata.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -634,10 +634,10 @@ static int __commit_transaction(struct dm_cache_metadata *cmd,
634634

635635
disk_super = dm_block_data(sblock);
636636

637+
disk_super->flags = cpu_to_le32(cmd->flags);
637638
if (mutator)
638639
update_flags(disk_super, mutator);
639640

640-
disk_super->flags = cpu_to_le32(cmd->flags);
641641
disk_super->mapping_root = cpu_to_le64(cmd->root);
642642
disk_super->hint_root = cpu_to_le64(cmd->hint_root);
643643
disk_super->discard_root = cpu_to_le64(cmd->discard_root);

drivers/md/persistent-data/dm-btree-remove.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -301,11 +301,16 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent,
301301
{
302302
int s;
303303
uint32_t max_entries = le32_to_cpu(left->header.max_entries);
304-
unsigned target = (nr_left + nr_center + nr_right) / 3;
305-
BUG_ON(target > max_entries);
304+
unsigned total = nr_left + nr_center + nr_right;
305+
unsigned target_right = total / 3;
306+
unsigned remainder = (target_right * 3) != total;
307+
unsigned target_left = target_right + remainder;
308+
309+
BUG_ON(target_left > max_entries);
310+
BUG_ON(target_right > max_entries);
306311

307312
if (nr_left < nr_right) {
308-
s = nr_left - target;
313+
s = nr_left - target_left;
309314

310315
if (s < 0 && nr_center < -s) {
311316
/* not enough in central node */
@@ -316,10 +321,10 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent,
316321
} else
317322
shift(left, center, s);
318323

319-
shift(center, right, target - nr_right);
324+
shift(center, right, target_right - nr_right);
320325

321326
} else {
322-
s = target - nr_right;
327+
s = target_right - nr_right;
323328
if (s > 0 && nr_center < s) {
324329
/* not enough in central node */
325330
shift(center, right, nr_center);
@@ -329,7 +334,7 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent,
329334
} else
330335
shift(center, right, s);
331336

332-
shift(left, center, nr_left - target);
337+
shift(left, center, nr_left - target_left);
333338
}
334339

335340
*key_ptr(parent, c->index) = center->keys[0];

drivers/md/persistent-data/dm-btree.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ static int btree_split_beneath(struct shadow_spine *s, uint64_t key)
523523

524524
r = new_block(s->info, &right);
525525
if (r < 0) {
526-
/* FIXME: put left */
526+
unlock_block(s->info, left);
527527
return r;
528528
}
529529

0 commit comments

Comments
 (0)