Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

fs/ntfs3: Add ntfs_bitmap_weight_le function and refactoring

Added ntfs_bitmap_weight_le function.
Changed argument types of bits/bitmap functions.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>

+63 -52
+2 -2
fs/ntfs3/bitfunc.c
··· 30 30 * 31 31 * Return: True if all bits [bit, bit+nbits) are zeros "0". 32 32 */ 33 - bool are_bits_clear(const ulong *lmap, size_t bit, size_t nbits) 33 + bool are_bits_clear(const void *lmap, size_t bit, size_t nbits) 34 34 { 35 35 size_t pos = bit & 7; 36 36 const u8 *map = (u8 *)lmap + (bit >> 3); ··· 78 78 * 79 79 * Return: True if all bits [bit, bit+nbits) are ones "1". 80 80 */ 81 - bool are_bits_set(const ulong *lmap, size_t bit, size_t nbits) 81 + bool are_bits_set(const void *lmap, size_t bit, size_t nbits) 82 82 { 83 83 u8 mask; 84 84 size_t pos = bit & 7;
+55 -45
fs/ntfs3/bitmap.c
··· 59 59 * 60 60 * Return: -1 if not found. 61 61 */ 62 - static size_t wnd_scan(const ulong *buf, size_t wbit, u32 wpos, u32 wend, 62 + static size_t wnd_scan(const void *buf, size_t wbit, u32 wpos, u32 wend, 63 63 size_t to_alloc, size_t *prev_tail, size_t *b_pos, 64 64 size_t *b_len) 65 65 { ··· 504 504 u8 cluster_bits = sbi->cluster_bits; 505 505 u32 wbits = 8 * sb->s_blocksize; 506 506 u32 used, frb; 507 - const ulong *buf; 508 507 size_t wpos, wbit, iw, vbo; 509 508 struct buffer_head *bh = NULL; 510 509 CLST lcn, clen; ··· 557 558 goto out; 558 559 } 559 560 560 - buf = (ulong *)bh->b_data; 561 - 562 - used = __bitmap_weight(buf, wbits); 561 + used = ntfs_bitmap_weight_le(bh->b_data, wbits); 563 562 if (used < wbits) { 564 563 frb = wbits - used; 565 564 wnd->free_bits[iw] = frb; ··· 571 574 wbits = wnd->nbits - wbit; 572 575 573 576 do { 574 - used = find_next_zero_bit_le(buf, wbits, wpos); 577 + used = find_next_zero_bit_le(bh->b_data, wbits, wpos); 575 578 576 579 if (used > wpos && prev_tail) { 577 580 wnd_add_free_ext(wnd, wbit + wpos - prev_tail, ··· 587 590 break; 588 591 } 589 592 590 - frb = find_next_bit_le(buf, wbits, wpos); 593 + frb = find_next_bit_le(bh->b_data, wbits, wpos); 591 594 if (frb >= wbits) { 592 595 /* Keep last free block. */ 593 596 prev_tail += frb - wpos; ··· 715 718 716 719 while (iw < wnd->nwnd && bits) { 717 720 u32 tail, op; 718 - ulong *buf; 719 721 720 722 if (iw + 1 == wnd->nwnd) 721 723 wbits = wnd->bits_last; ··· 728 732 break; 729 733 } 730 734 731 - buf = (ulong *)bh->b_data; 732 - 733 735 lock_buffer(bh); 734 736 735 - ntfs_bitmap_clear_le(buf, wbit, op); 737 + ntfs_bitmap_clear_le(bh->b_data, wbit, op); 736 738 737 739 wnd->free_bits[iw] += op; 738 740 ··· 765 771 766 772 while (iw < wnd->nwnd && bits) { 767 773 u32 tail, op; 768 - ulong *buf; 769 774 770 775 if (unlikely(iw + 1 == wnd->nwnd)) 771 776 wbits = wnd->bits_last; ··· 777 784 err = PTR_ERR(bh); 778 785 break; 779 786 } 780 - buf = (ulong *)bh->b_data; 781 787 782 788 lock_buffer(bh); 783 789 784 - ntfs_bitmap_set_le(buf, wbit, op); 790 + ntfs_bitmap_set_le(bh->b_data, wbit, op); 785 791 wnd->free_bits[iw] -= op; 786 792 787 793 set_buffer_uptodate(bh); ··· 828 836 if (IS_ERR(bh)) 829 837 return false; 830 838 831 - ret = are_bits_clear((ulong *)bh->b_data, wbit, op); 839 + ret = are_bits_clear(bh->b_data, wbit, op); 832 840 833 841 put_bh(bh); 834 842 if (!ret) ··· 920 928 if (IS_ERR(bh)) 921 929 goto out; 922 930 923 - ret = are_bits_set((ulong *)bh->b_data, wbit, op); 931 + ret = are_bits_set(bh->b_data, wbit, op); 924 932 put_bh(bh); 925 933 if (!ret) 926 934 goto out; ··· 951 959 size_t fnd, max_alloc, b_len, b_pos; 952 960 size_t iw, prev_tail, nwnd, wbit, ebit, zbit, zend; 953 961 size_t to_alloc0 = to_alloc; 954 - const ulong *buf; 955 962 const struct e_node *e; 956 963 const struct rb_node *pr, *cr; 957 964 u8 log2_bits; ··· 1176 1185 continue; 1177 1186 } 1178 1187 1179 - buf = (ulong *)bh->b_data; 1180 - 1181 1188 /* Scan range [wbit, zbit). */ 1182 1189 if (wpos < wzbit) { 1183 1190 /* Scan range [wpos, zbit). */ 1184 - fnd = wnd_scan(buf, wbit, wpos, wzbit, 1185 - to_alloc, &prev_tail, 1186 - &b_pos, &b_len); 1191 + fnd = wnd_scan(bh->b_data, wbit, wpos, 1192 + wzbit, to_alloc, 1193 + &prev_tail, &b_pos, 1194 + &b_len); 1187 1195 if (fnd != MINUS_ONE_T) { 1188 1196 put_bh(bh); 1189 1197 goto found; ··· 1193 1203 1194 1204 /* Scan range [zend, ebit). */ 1195 1205 if (wzend < wbits) { 1196 - fnd = wnd_scan(buf, wbit, 1206 + fnd = wnd_scan(bh->b_data, wbit, 1197 1207 max(wzend, wpos), wbits, 1198 1208 to_alloc, &prev_tail, 1199 1209 &b_pos, &b_len); ··· 1232 1242 continue; 1233 1243 } 1234 1244 1235 - buf = (ulong *)bh->b_data; 1236 - 1237 1245 /* Scan range [wpos, eBits). */ 1238 - fnd = wnd_scan(buf, wbit, wpos, wbits, to_alloc, &prev_tail, 1239 - &b_pos, &b_len); 1246 + fnd = wnd_scan(bh->b_data, wbit, wpos, wbits, to_alloc, 1247 + &prev_tail, &b_pos, &b_len); 1240 1248 put_bh(bh); 1241 1249 if (fnd != MINUS_ONE_T) 1242 1250 goto found; ··· 1332 1344 size_t frb; 1333 1345 u64 vbo, lbo, bytes; 1334 1346 struct buffer_head *bh; 1335 - ulong *buf; 1336 1347 1337 1348 if (iw + 1 == new_wnd) 1338 1349 wbits = new_last; ··· 1348 1361 return -EIO; 1349 1362 1350 1363 lock_buffer(bh); 1351 - buf = (ulong *)bh->b_data; 1352 1364 1353 - ntfs_bitmap_clear_le(buf, b0, blocksize * 8 - b0); 1354 - frb = wbits - __bitmap_weight(buf, wbits); 1365 + ntfs_bitmap_clear_le(bh->b_data, b0, blocksize * 8 - b0); 1366 + frb = wbits - ntfs_bitmap_weight_le(bh->b_data, wbits); 1355 1367 wnd->total_zeroes += frb - wnd->free_bits[iw]; 1356 1368 wnd->free_bits[iw] = frb; 1357 1369 ··· 1397 1411 CLST lcn_from = bytes_to_cluster(sbi, range->start); 1398 1412 size_t iw = lcn_from >> (sb->s_blocksize_bits + 3); 1399 1413 u32 wbit = lcn_from & (wbits - 1); 1400 - const ulong *buf; 1401 1414 CLST lcn_to; 1402 1415 1403 1416 if (!minlen) ··· 1431 1446 break; 1432 1447 } 1433 1448 1434 - buf = (ulong *)bh->b_data; 1435 - 1436 1449 for (; wbit < wbits; wbit++) { 1437 - if (!test_bit_le(wbit, buf)) { 1450 + if (!test_bit_le(wbit, bh->b_data)) { 1438 1451 if (!len) 1439 1452 lcn = lcn_wnd + wbit; 1440 1453 len += 1; ··· 1465 1482 return err; 1466 1483 } 1467 1484 1468 - void ntfs_bitmap_set_le(unsigned long *map, unsigned int start, int len) 1485 + #if BITS_PER_LONG == 64 1486 + typedef __le64 bitmap_ulong; 1487 + #define cpu_to_ul(x) cpu_to_le64(x) 1488 + #define ul_to_cpu(x) le64_to_cpu(x) 1489 + #else 1490 + typedef __le32 bitmap_ulong; 1491 + #define cpu_to_ul(x) cpu_to_le32(x) 1492 + #define ul_to_cpu(x) le32_to_cpu(x) 1493 + #endif 1494 + 1495 + void ntfs_bitmap_set_le(void *map, unsigned int start, int len) 1469 1496 { 1470 - unsigned long *p = map + BIT_WORD(start); 1497 + bitmap_ulong *p = (bitmap_ulong *)map + BIT_WORD(start); 1471 1498 const unsigned int size = start + len; 1472 1499 int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG); 1473 - unsigned long mask_to_set = cpu_to_le32(BITMAP_FIRST_WORD_MASK(start)); 1500 + bitmap_ulong mask_to_set = cpu_to_ul(BITMAP_FIRST_WORD_MASK(start)); 1474 1501 1475 1502 while (len - bits_to_set >= 0) { 1476 1503 *p |= mask_to_set; 1477 1504 len -= bits_to_set; 1478 1505 bits_to_set = BITS_PER_LONG; 1479 - mask_to_set = ~0UL; 1506 + mask_to_set = cpu_to_ul(~0UL); 1480 1507 p++; 1481 1508 } 1482 1509 if (len) { 1483 - mask_to_set &= cpu_to_le32(BITMAP_LAST_WORD_MASK(size)); 1510 + mask_to_set &= cpu_to_ul(BITMAP_LAST_WORD_MASK(size)); 1484 1511 *p |= mask_to_set; 1485 1512 } 1486 1513 } 1487 1514 1488 - void ntfs_bitmap_clear_le(unsigned long *map, unsigned int start, int len) 1515 + void ntfs_bitmap_clear_le(void *map, unsigned int start, int len) 1489 1516 { 1490 - unsigned long *p = map + BIT_WORD(start); 1517 + bitmap_ulong *p = (bitmap_ulong *)map + BIT_WORD(start); 1491 1518 const unsigned int size = start + len; 1492 1519 int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG); 1493 - unsigned long mask_to_clear = cpu_to_le32(BITMAP_FIRST_WORD_MASK(start)); 1520 + bitmap_ulong mask_to_clear = cpu_to_ul(BITMAP_FIRST_WORD_MASK(start)); 1494 1521 1495 1522 while (len - bits_to_clear >= 0) { 1496 1523 *p &= ~mask_to_clear; 1497 1524 len -= bits_to_clear; 1498 1525 bits_to_clear = BITS_PER_LONG; 1499 - mask_to_clear = ~0UL; 1526 + mask_to_clear = cpu_to_ul(~0UL); 1500 1527 p++; 1501 1528 } 1502 1529 if (len) { 1503 - mask_to_clear &= cpu_to_le32(BITMAP_LAST_WORD_MASK(size)); 1530 + mask_to_clear &= cpu_to_ul(BITMAP_LAST_WORD_MASK(size)); 1504 1531 *p &= ~mask_to_clear; 1505 1532 } 1533 + } 1534 + 1535 + unsigned int ntfs_bitmap_weight_le(const void *bitmap, int bits) 1536 + { 1537 + const ulong *bmp = bitmap; 1538 + unsigned int k, lim = bits / BITS_PER_LONG; 1539 + unsigned int w = 0; 1540 + 1541 + for (k = 0; k < lim; k++) 1542 + w += hweight_long(bmp[k]); 1543 + 1544 + if (bits % BITS_PER_LONG) { 1545 + w += hweight_long(ul_to_cpu(((bitmap_ulong *)bitmap)[k]) & 1546 + BITMAP_LAST_WORD_MASK(bits)); 1547 + } 1548 + 1549 + return w; 1506 1550 }
+6 -5
fs/ntfs3/ntfs_fs.h
··· 472 472 } 473 473 474 474 /* Globals from bitfunc.c */ 475 - bool are_bits_clear(const ulong *map, size_t bit, size_t nbits); 476 - bool are_bits_set(const ulong *map, size_t bit, size_t nbits); 477 - size_t get_set_bits_ex(const ulong *map, size_t bit, size_t nbits); 475 + bool are_bits_clear(const void *map, size_t bit, size_t nbits); 476 + bool are_bits_set(const void *map, size_t bit, size_t nbits); 477 + size_t get_set_bits_ex(const void *map, size_t bit, size_t nbits); 478 478 479 479 /* Globals from dir.c */ 480 480 int ntfs_utf16_to_nls(struct ntfs_sb_info *sbi, const __le16 *name, u32 len, ··· 839 839 void wnd_zone_set(struct wnd_bitmap *wnd, size_t Lcn, size_t Len); 840 840 int ntfs_trim_fs(struct ntfs_sb_info *sbi, struct fstrim_range *range); 841 841 842 - void ntfs_bitmap_set_le(unsigned long *map, unsigned int start, int len); 843 - void ntfs_bitmap_clear_le(unsigned long *map, unsigned int start, int len); 842 + void ntfs_bitmap_set_le(void *map, unsigned int start, int len); 843 + void ntfs_bitmap_clear_le(void *map, unsigned int start, int len); 844 + unsigned int ntfs_bitmap_weight_le(const void *bitmap, int bits); 844 845 845 846 /* Globals from upcase.c */ 846 847 int ntfs_cmp_names(const __le16 *s1, size_t l1, const __le16 *s2, size_t l2,