Commit 5b99c2ffa980528a197f26c7d876cceeccce8dd5

Authored by Jens Axboe
1 parent 960e739d9e

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

... ... @@ -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)
... ... @@ -75,7 +75,7 @@
75 75 /* Number of segments in this BIO after
76 76 * physical address coalescing is performed.
77 77 */
78   - unsigned short bi_phys_segments;
  78 + unsigned int bi_phys_segments;
79 79  
80 80 unsigned int bi_size; /* residual I/O count */
81 81