@@ -5558,17 +5558,45 @@ void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src,
55585558 }
55595559}
55605560
5561- /*
5562- * The extent buffer bitmap operations are done with byte granularity because
5563- * bitmap items are not guaranteed to be aligned to a word and therefore a
5564- * single word in a bitmap may straddle two pages in the extent buffer.
5565- */
5566- #define BIT_BYTE (nr ) ((nr) / BITS_PER_BYTE)
5567- #define BYTE_MASK ((1 << BITS_PER_BYTE) - 1)
5568- #define BITMAP_FIRST_BYTE_MASK (start ) \
5569- ((BYTE_MASK << ((start) & (BITS_PER_BYTE - 1))) & BYTE_MASK)
5570- #define BITMAP_LAST_BYTE_MASK (nbits ) \
5571- (BYTE_MASK >> (-(nbits) & (BITS_PER_BYTE - 1)))
5561+ void le_bitmap_set (u8 * map , unsigned int start , int len )
5562+ {
5563+ u8 * p = map + BIT_BYTE (start );
5564+ const unsigned int size = start + len ;
5565+ int bits_to_set = BITS_PER_BYTE - (start % BITS_PER_BYTE );
5566+ u8 mask_to_set = BITMAP_FIRST_BYTE_MASK (start );
5567+
5568+ while (len - bits_to_set >= 0 ) {
5569+ * p |= mask_to_set ;
5570+ len -= bits_to_set ;
5571+ bits_to_set = BITS_PER_BYTE ;
5572+ mask_to_set = ~(u8 )0 ;
5573+ p ++ ;
5574+ }
5575+ if (len ) {
5576+ mask_to_set &= BITMAP_LAST_BYTE_MASK (size );
5577+ * p |= mask_to_set ;
5578+ }
5579+ }
5580+
5581+ void le_bitmap_clear (u8 * map , unsigned int start , int len )
5582+ {
5583+ u8 * p = map + BIT_BYTE (start );
5584+ const unsigned int size = start + len ;
5585+ int bits_to_clear = BITS_PER_BYTE - (start % BITS_PER_BYTE );
5586+ u8 mask_to_clear = BITMAP_FIRST_BYTE_MASK (start );
5587+
5588+ while (len - bits_to_clear >= 0 ) {
5589+ * p &= ~mask_to_clear ;
5590+ len -= bits_to_clear ;
5591+ bits_to_clear = BITS_PER_BYTE ;
5592+ mask_to_clear = ~(u8 )0 ;
5593+ p ++ ;
5594+ }
5595+ if (len ) {
5596+ mask_to_clear &= BITMAP_LAST_BYTE_MASK (size );
5597+ * p &= ~mask_to_clear ;
5598+ }
5599+ }
55725600
55735601/*
55745602 * eb_bitmap_offset() - calculate the page and offset of the byte containing the
@@ -5612,7 +5640,7 @@ static inline void eb_bitmap_offset(struct extent_buffer *eb,
56125640int extent_buffer_test_bit (struct extent_buffer * eb , unsigned long start ,
56135641 unsigned long nr )
56145642{
5615- char * kaddr ;
5643+ u8 * kaddr ;
56165644 struct page * page ;
56175645 unsigned long i ;
56185646 size_t offset ;
@@ -5634,13 +5662,13 @@ int extent_buffer_test_bit(struct extent_buffer *eb, unsigned long start,
56345662void extent_buffer_bitmap_set (struct extent_buffer * eb , unsigned long start ,
56355663 unsigned long pos , unsigned long len )
56365664{
5637- char * kaddr ;
5665+ u8 * kaddr ;
56385666 struct page * page ;
56395667 unsigned long i ;
56405668 size_t offset ;
56415669 const unsigned int size = pos + len ;
56425670 int bits_to_set = BITS_PER_BYTE - (pos % BITS_PER_BYTE );
5643- unsigned int mask_to_set = BITMAP_FIRST_BYTE_MASK (pos );
5671+ u8 mask_to_set = BITMAP_FIRST_BYTE_MASK (pos );
56445672
56455673 eb_bitmap_offset (eb , start , pos , & i , & offset );
56465674 page = eb -> pages [i ];
@@ -5651,7 +5679,7 @@ void extent_buffer_bitmap_set(struct extent_buffer *eb, unsigned long start,
56515679 kaddr [offset ] |= mask_to_set ;
56525680 len -= bits_to_set ;
56535681 bits_to_set = BITS_PER_BYTE ;
5654- mask_to_set = ~0U ;
5682+ mask_to_set = ~( u8 ) 0 ;
56555683 if (++ offset >= PAGE_SIZE && len > 0 ) {
56565684 offset = 0 ;
56575685 page = eb -> pages [++ i ];
@@ -5676,13 +5704,13 @@ void extent_buffer_bitmap_set(struct extent_buffer *eb, unsigned long start,
56765704void extent_buffer_bitmap_clear (struct extent_buffer * eb , unsigned long start ,
56775705 unsigned long pos , unsigned long len )
56785706{
5679- char * kaddr ;
5707+ u8 * kaddr ;
56805708 struct page * page ;
56815709 unsigned long i ;
56825710 size_t offset ;
56835711 const unsigned int size = pos + len ;
56845712 int bits_to_clear = BITS_PER_BYTE - (pos % BITS_PER_BYTE );
5685- unsigned int mask_to_clear = BITMAP_FIRST_BYTE_MASK (pos );
5713+ u8 mask_to_clear = BITMAP_FIRST_BYTE_MASK (pos );
56865714
56875715 eb_bitmap_offset (eb , start , pos , & i , & offset );
56885716 page = eb -> pages [i ];
@@ -5693,7 +5721,7 @@ void extent_buffer_bitmap_clear(struct extent_buffer *eb, unsigned long start,
56935721 kaddr [offset ] &= ~mask_to_clear ;
56945722 len -= bits_to_clear ;
56955723 bits_to_clear = BITS_PER_BYTE ;
5696- mask_to_clear = ~0U ;
5724+ mask_to_clear = ~( u8 ) 0 ;
56975725 if (++ offset >= PAGE_SIZE && len > 0 ) {
56985726 offset = 0 ;
56995727 page = eb -> pages [++ i ];
0 commit comments