1/* -*- mode: c; c-basic-offset: 8; -*- 2 * vim: noexpandtab sw=8 ts=8 sts=0: 3 * 4 * blockcheck.h 5 * 6 * Checksum and ECC codes for the OCFS2 userspace library. 7 * 8 * Copyright (C) 2004, 2008 Oracle. All rights reserved. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public 12 * License, version 2, as published by the Free Software Foundation. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * General Public License for more details. 18 */ 19 20#ifndef OCFS2_BLOCKCHECK_H 21#define OCFS2_BLOCKCHECK_H 22 23 24/* Count errors and error correction from blockcheck.c */ 25struct ocfs2_blockcheck_stats { 26 spinlock_t b_lock; 27 u64 b_check_count; /* Number of blocks we've checked */ 28 u64 b_failure_count; /* Number of failed checksums */ 29 u64 b_recover_count; /* Number of blocks fixed by ecc */ 30 31 /* 32 * debugfs entries, used if this is passed to 33 * ocfs2_blockcheck_stats_debugfs_install() 34 */ 35 struct dentry *b_debug_dir; /* Parent of the debugfs files */ 36 struct dentry *b_debug_check; /* Exposes b_check_count */ 37 struct dentry *b_debug_failure; /* Exposes b_failure_count */ 38 struct dentry *b_debug_recover; /* Exposes b_recover_count */ 39}; 40 41 42/* High level block API */ 43void ocfs2_compute_meta_ecc(struct super_block *sb, void *data, 44 struct ocfs2_block_check *bc); 45int ocfs2_validate_meta_ecc(struct super_block *sb, void *data, 46 struct ocfs2_block_check *bc); 47void ocfs2_compute_meta_ecc_bhs(struct super_block *sb, 48 struct buffer_head **bhs, int nr, 49 struct ocfs2_block_check *bc); 50int ocfs2_validate_meta_ecc_bhs(struct super_block *sb, 51 struct buffer_head **bhs, int nr, 52 struct ocfs2_block_check *bc); 53 54/* Lower level API */ 55void ocfs2_block_check_compute(void *data, size_t blocksize, 56 struct ocfs2_block_check *bc); 57int ocfs2_block_check_validate(void *data, size_t blocksize, 58 struct ocfs2_block_check *bc, 59 struct ocfs2_blockcheck_stats *stats); 60void ocfs2_block_check_compute_bhs(struct buffer_head **bhs, int nr, 61 struct ocfs2_block_check *bc); 62int ocfs2_block_check_validate_bhs(struct buffer_head **bhs, int nr, 63 struct ocfs2_block_check *bc, 64 struct ocfs2_blockcheck_stats *stats); 65 66/* Debug Initialization */ 67int ocfs2_blockcheck_stats_debugfs_install(struct ocfs2_blockcheck_stats *stats, 68 struct dentry *parent); 69void ocfs2_blockcheck_stats_debugfs_remove(struct ocfs2_blockcheck_stats *stats); 70 71/* 72 * Hamming code functions 73 */ 74 75/* 76 * Encoding hamming code parity bits for a buffer. 77 * 78 * This is the low level encoder function. It can be called across 79 * multiple hunks just like the crc32 code. 'd' is the number of bits 80 * _in_this_hunk_. nr is the bit offset of this hunk. So, if you had 81 * two 512B buffers, you would do it like so: 82 * 83 * parity = ocfs2_hamming_encode(0, buf1, 512 * 8, 0); 84 * parity = ocfs2_hamming_encode(parity, buf2, 512 * 8, 512 * 8); 85 * 86 * If you just have one buffer, use ocfs2_hamming_encode_block(). 87 */ 88u32 ocfs2_hamming_encode(u32 parity, void *data, unsigned int d, 89 unsigned int nr); 90/* 91 * Fix a buffer with a bit error. The 'fix' is the original parity 92 * xor'd with the parity calculated now. 93 * 94 * Like ocfs2_hamming_encode(), this can handle hunks. nr is the bit 95 * offset of the current hunk. If bit to be fixed is not part of the 96 * current hunk, this does nothing. 97 * 98 * If you only have one buffer, use ocfs2_hamming_fix_block(). 99 */ 100void ocfs2_hamming_fix(void *data, unsigned int d, unsigned int nr, 101 unsigned int fix); 102 103/* Convenience wrappers for a single buffer of data */ 104extern u32 ocfs2_hamming_encode_block(void *data, unsigned int blocksize); 105extern void ocfs2_hamming_fix_block(void *data, unsigned int blocksize, 106 unsigned int fix); 107#endif 108