Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5b99c2ff authored by Jens Axboe's avatar Jens Axboe
Browse files

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: default avatarJens Axboe <jens.axboe@oracle.com>
parent 960e739d
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -102,17 +102,17 @@ const char raid6_empty_zero_page[PAGE_SIZE] __attribute__((aligned(256)));
#endif

/*
 * We maintain a biased count of active stripes in the bottom 8 bits of
 * bi_phys_segments, and a count of processed stripes in the upper 8 bits
 * We maintain a biased count of active stripes in the bottom 16 bits of
 * bi_phys_segments, and a count of processed stripes in the upper 16 bits
 */
static inline int raid5_bi_phys_segments(struct bio *bio)
{
	return bio->bi_phys_segments & 0xff;
	return bio->bi_phys_segments & 0xffff;
}

static inline int raid5_bi_hw_segments(struct bio *bio)
{
	return (bio->bi_phys_segments >> 8) & 0xff;
	return (bio->bi_phys_segments >> 16) & 0xffff;
}

static inline int raid5_dec_bi_phys_segments(struct bio *bio)
@@ -126,13 +126,13 @@ static inline int raid5_dec_bi_hw_segments(struct bio *bio)
	unsigned short val = raid5_bi_hw_segments(bio);

	--val;
	bio->bi_phys_segments = (val << 8) | raid5_bi_phys_segments(bio);
	bio->bi_phys_segments = (val << 16) | raid5_bi_phys_segments(bio);
	return val;
}

static inline void raid5_set_bi_hw_segments(struct bio *bio, unsigned int cnt)
{
	bio->bi_phys_segments = raid5_bi_phys_segments(bio) || (cnt << 8);
	bio->bi_phys_segments = raid5_bi_phys_segments(bio) || (cnt << 16);
}

static inline int raid6_next_disk(int disk, int raid_disks)
+1 −1
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ struct bio {
	/* Number of segments in this BIO after
	 * physical address coalescing is performed.
	 */
	unsigned short		bi_phys_segments;
	unsigned int		bi_phys_segments;

	unsigned int		bi_size;	/* residual I/O count */