bitmap.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * linux/fs/ext4/bitmap.c
  4. *
  5. * Copyright (C) 1992, 1993, 1994, 1995
  6. * Remy Card (card@masi.ibp.fr)
  7. * Laboratoire MASI - Institut Blaise Pascal
  8. * Universite Pierre et Marie Curie (Paris VI)
  9. */
  10. #include <linux/buffer_head.h>
  11. #include "ext4.h"
  12. unsigned int ext4_count_free(char *bitmap, unsigned int numchars)
  13. {
  14. return numchars * BITS_PER_BYTE - memweight(bitmap, numchars);
  15. }
  16. int ext4_inode_bitmap_csum_verify(struct super_block *sb,
  17. struct ext4_group_desc *gdp,
  18. struct buffer_head *bh)
  19. {
  20. __u32 hi;
  21. __u32 provided, calculated;
  22. struct ext4_sb_info *sbi = EXT4_SB(sb);
  23. int sz;
  24. if (!ext4_has_feature_metadata_csum(sb))
  25. return 1;
  26. sz = EXT4_INODES_PER_GROUP(sb) >> 3;
  27. provided = le16_to_cpu(gdp->bg_inode_bitmap_csum_lo);
  28. calculated = ext4_chksum(sbi->s_csum_seed, (__u8 *)bh->b_data, sz);
  29. if (sbi->s_desc_size >= EXT4_BG_INODE_BITMAP_CSUM_HI_END) {
  30. hi = le16_to_cpu(gdp->bg_inode_bitmap_csum_hi);
  31. provided |= (hi << 16);
  32. } else
  33. calculated &= 0xFFFF;
  34. return provided == calculated;
  35. }
  36. void ext4_inode_bitmap_csum_set(struct super_block *sb,
  37. struct ext4_group_desc *gdp,
  38. struct buffer_head *bh)
  39. {
  40. __u32 csum;
  41. struct ext4_sb_info *sbi = EXT4_SB(sb);
  42. int sz;
  43. if (!ext4_has_feature_metadata_csum(sb))
  44. return;
  45. sz = EXT4_INODES_PER_GROUP(sb) >> 3;
  46. csum = ext4_chksum(sbi->s_csum_seed, (__u8 *)bh->b_data, sz);
  47. gdp->bg_inode_bitmap_csum_lo = cpu_to_le16(csum & 0xFFFF);
  48. if (sbi->s_desc_size >= EXT4_BG_INODE_BITMAP_CSUM_HI_END)
  49. gdp->bg_inode_bitmap_csum_hi = cpu_to_le16(csum >> 16);
  50. }
  51. int ext4_block_bitmap_csum_verify(struct super_block *sb,
  52. struct ext4_group_desc *gdp,
  53. struct buffer_head *bh)
  54. {
  55. __u32 hi;
  56. __u32 provided, calculated;
  57. struct ext4_sb_info *sbi = EXT4_SB(sb);
  58. int sz = EXT4_CLUSTERS_PER_GROUP(sb) / 8;
  59. if (!ext4_has_feature_metadata_csum(sb))
  60. return 1;
  61. provided = le16_to_cpu(gdp->bg_block_bitmap_csum_lo);
  62. calculated = ext4_chksum(sbi->s_csum_seed, (__u8 *)bh->b_data, sz);
  63. if (sbi->s_desc_size >= EXT4_BG_BLOCK_BITMAP_CSUM_HI_END) {
  64. hi = le16_to_cpu(gdp->bg_block_bitmap_csum_hi);
  65. provided |= (hi << 16);
  66. } else
  67. calculated &= 0xFFFF;
  68. return provided == calculated;
  69. }
  70. void ext4_block_bitmap_csum_set(struct super_block *sb,
  71. struct ext4_group_desc *gdp,
  72. struct buffer_head *bh)
  73. {
  74. int sz = EXT4_CLUSTERS_PER_GROUP(sb) / 8;
  75. __u32 csum;
  76. struct ext4_sb_info *sbi = EXT4_SB(sb);
  77. if (!ext4_has_feature_metadata_csum(sb))
  78. return;
  79. csum = ext4_chksum(sbi->s_csum_seed, (__u8 *)bh->b_data, sz);
  80. gdp->bg_block_bitmap_csum_lo = cpu_to_le16(csum & 0xFFFF);
  81. if (sbi->s_desc_size >= EXT4_BG_BLOCK_BITMAP_CSUM_HI_END)
  82. gdp->bg_block_bitmap_csum_hi = cpu_to_le16(csum >> 16);
  83. }