diff options
author | Mark Brown <broonie@linaro.org> | 2014-02-10 17:37:43 +0000 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-02-10 17:37:43 +0000 |
commit | 4b9c8ddadce3ec70fa5d93875adeda861b21c84e (patch) | |
tree | 6ed53e819e5c763f751ff968a650b236d2d02545 /drivers/md | |
parent | 51ad557e21b8713f3abc286c14bca4ed01b8e56d (diff) | |
parent | 1569265782ef26ed77ce45ebeb0676f11d4c114a (diff) |
Merge tag 'v3.10.29' into linux-linaro-lsk
This is the 3.10.29 stable release
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/bcache/bset.c | 26 | ||||
-rw-r--r-- | drivers/md/raid5.c | 1 |
2 files changed, 23 insertions, 4 deletions
diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c index 14032e8c773..1b27cbd822e 100644 --- a/drivers/md/bcache/bset.c +++ b/drivers/md/bcache/bset.c @@ -927,7 +927,7 @@ static void sort_key_next(struct btree_iter *iter, *i = iter->data[--iter->used]; } -static void btree_sort_fixup(struct btree_iter *iter) +static struct bkey *btree_sort_fixup(struct btree_iter *iter, struct bkey *tmp) { while (iter->used > 1) { struct btree_iter_set *top = iter->data, *i = top + 1; @@ -955,9 +955,22 @@ static void btree_sort_fixup(struct btree_iter *iter) } else { /* can't happen because of comparison func */ BUG_ON(!bkey_cmp(&START_KEY(top->k), &START_KEY(i->k))); - bch_cut_back(&START_KEY(i->k), top->k); + + if (bkey_cmp(i->k, top->k) < 0) { + bkey_copy(tmp, top->k); + + bch_cut_back(&START_KEY(i->k), tmp); + bch_cut_front(i->k, top->k); + heap_sift(iter, 0, btree_iter_cmp); + + return tmp; + } else { + bch_cut_back(&START_KEY(i->k), top->k); + } } } + + return NULL; } static void btree_mergesort(struct btree *b, struct bset *out, @@ -965,15 +978,20 @@ static void btree_mergesort(struct btree *b, struct bset *out, bool fixup, bool remove_stale) { struct bkey *k, *last = NULL; + BKEY_PADDED(k) tmp; bool (*bad)(struct btree *, const struct bkey *) = remove_stale ? bch_ptr_bad : bch_ptr_invalid; while (!btree_iter_end(iter)) { if (fixup && !b->level) - btree_sort_fixup(iter); + k = btree_sort_fixup(iter, &tmp.k); + else + k = NULL; + + if (!k) + k = bch_btree_iter_next(iter); - k = bch_btree_iter_next(iter); if (bad(b, k)) continue; diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 51422999fd0..740e3f42bef 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -1893,6 +1893,7 @@ static void raid5_end_write_request(struct bio *bi, int error) set_bit(R5_MadeGoodRepl, &sh->dev[i].flags); } else { if (!uptodate) { + set_bit(STRIPE_DEGRADED, &sh->state); set_bit(WriteErrorSeen, &rdev->flags); set_bit(R5_WriteError, &sh->dev[i].flags); if (!test_and_set_bit(WantReplacement, &rdev->flags)) |