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