Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
bitmap.c
Go to the documentation of this file.
1 /*
2  * linux/fs/ext4/bitmap.c
3  *
4  * Copyright (C) 1992, 1993, 1994, 1995
5  * Remy Card ([email protected])
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 
14 unsigned int ext4_count_free(char *bitmap, unsigned int numchars)
15 {
16  return numchars * BITS_PER_BYTE - memweight(bitmap, numchars);
17 }
18 
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 
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) {
35  provided |= (hi << 16);
36  } else
37  calculated &= 0xFFFF;
38 
39  return provided == calculated;
40 }
41 
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 
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 
60  struct ext4_group_desc *gdp,
61  struct buffer_head *bh)
62 {
63  __u32 hi;
64  __u32 provided, calculated;
65  struct ext4_sb_info *sbi = EXT4_SB(sb);
66  int sz = EXT4_CLUSTERS_PER_GROUP(sb) / 8;
67 
70  return 1;
71 
72  provided = le16_to_cpu(gdp->bg_block_bitmap_csum_lo);
73  calculated = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)bh->b_data, sz);
74  if (sbi->s_desc_size >= EXT4_BG_BLOCK_BITMAP_CSUM_HI_END) {
76  provided |= (hi << 16);
77  } else
78  calculated &= 0xFFFF;
79 
80  if (provided == calculated)
81  return 1;
82 
83  return 0;
84 }
85 
87  struct ext4_group_desc *gdp,
88  struct buffer_head *bh)
89 {
90  int sz = EXT4_CLUSTERS_PER_GROUP(sb) / 8;
91  __u32 csum;
92  struct ext4_sb_info *sbi = EXT4_SB(sb);
93 
96  return;
97 
98  csum = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)bh->b_data, sz);
99  gdp->bg_block_bitmap_csum_lo = cpu_to_le16(csum & 0xFFFF);
100  if (sbi->s_desc_size >= EXT4_BG_BLOCK_BITMAP_CSUM_HI_END)
101  gdp->bg_block_bitmap_csum_hi = cpu_to_le16(csum >> 16);
102 }