Commit 5b99c2ffa980528a197f26c7d876cceeccce8dd5
1 parent
960e739d9e
Exists in
master
and in
4 other branches
block: make bi_phys_segments an unsigned int instead of short
raid5 can overflow with more than 255 stripes, and we can increase it to an int for free on both 32 and 64-bit archs due to the padding. Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Showing 2 changed files with 7 additions and 7 deletions Side-by-side Diff
drivers/md/raid5.c
... | ... | @@ -102,17 +102,17 @@ |
102 | 102 | #endif |
103 | 103 | |
104 | 104 | /* |
105 | - * We maintain a biased count of active stripes in the bottom 8 bits of | |
106 | - * bi_phys_segments, and a count of processed stripes in the upper 8 bits | |
105 | + * We maintain a biased count of active stripes in the bottom 16 bits of | |
106 | + * bi_phys_segments, and a count of processed stripes in the upper 16 bits | |
107 | 107 | */ |
108 | 108 | static inline int raid5_bi_phys_segments(struct bio *bio) |
109 | 109 | { |
110 | - return bio->bi_phys_segments & 0xff; | |
110 | + return bio->bi_phys_segments & 0xffff; | |
111 | 111 | } |
112 | 112 | |
113 | 113 | static inline int raid5_bi_hw_segments(struct bio *bio) |
114 | 114 | { |
115 | - return (bio->bi_phys_segments >> 8) & 0xff; | |
115 | + return (bio->bi_phys_segments >> 16) & 0xffff; | |
116 | 116 | } |
117 | 117 | |
118 | 118 | static inline int raid5_dec_bi_phys_segments(struct bio *bio) |
119 | 119 | |
... | ... | @@ -126,13 +126,13 @@ |
126 | 126 | unsigned short val = raid5_bi_hw_segments(bio); |
127 | 127 | |
128 | 128 | --val; |
129 | - bio->bi_phys_segments = (val << 8) | raid5_bi_phys_segments(bio); | |
129 | + bio->bi_phys_segments = (val << 16) | raid5_bi_phys_segments(bio); | |
130 | 130 | return val; |
131 | 131 | } |
132 | 132 | |
133 | 133 | static inline void raid5_set_bi_hw_segments(struct bio *bio, unsigned int cnt) |
134 | 134 | { |
135 | - bio->bi_phys_segments = raid5_bi_phys_segments(bio) || (cnt << 8); | |
135 | + bio->bi_phys_segments = raid5_bi_phys_segments(bio) || (cnt << 16); | |
136 | 136 | } |
137 | 137 | |
138 | 138 | static inline int raid6_next_disk(int disk, int raid_disks) |
include/linux/bio.h