| From 9b2dc8b665932a8e681a7ab3237f60475e75e161 Mon Sep 17 00:00:00 2001 |
| From: Namhyung Kim <namhyung@gmail.com> |
| Date: Mon, 13 Jun 2011 14:48:22 +0900 |
| Subject: md/raid5: fix raid5_set_bi_hw_segments |
| |
| From: Namhyung Kim <namhyung@gmail.com> |
| |
| commit 9b2dc8b665932a8e681a7ab3237f60475e75e161 upstream. |
| |
| The @bio->bi_phys_segments consists of active stripes count in the |
| lower 16 bits and processed stripes count in the upper 16 bits. So |
| logical-OR operator should be bitwise one. |
| |
| This bug has been present since 2.6.27 and the fix is suitable for any |
| -stable kernel since then. Fortunately the bad code is only used on |
| error paths and is relatively unlikely to be hit. |
| |
| Signed-off-by: Namhyung Kim <namhyung@gmail.com> |
| Signed-off-by: NeilBrown <neilb@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/md/raid5.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/md/raid5.c |
| +++ b/drivers/md/raid5.c |
| @@ -127,7 +127,7 @@ static inline int raid5_dec_bi_hw_segmen |
| |
| static inline void raid5_set_bi_hw_segments(struct bio *bio, unsigned int cnt) |
| { |
| - bio->bi_phys_segments = raid5_bi_phys_segments(bio) || (cnt << 16); |
| + bio->bi_phys_segments = raid5_bi_phys_segments(bio) | (cnt << 16); |
| } |
| |
| /* Find first data disk in a raid6 stripe */ |