linux/fs/ocfs2/blockcheck.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * blockcheck.h
   4 *
   5 * Checksum and ECC codes for the OCFS2 userspace library.
   6 *
   7 * Copyright (C) 2004, 2008 Oracle.  All rights reserved.
   8 */
   9
  10#ifndef OCFS2_BLOCKCHECK_H
  11#define OCFS2_BLOCKCHECK_H
  12
  13
  14/* Count errors and error correction from blockcheck.c */
  15struct ocfs2_blockcheck_stats {
  16        spinlock_t b_lock;
  17        u64 b_check_count;      /* Number of blocks we've checked */
  18        u64 b_failure_count;    /* Number of failed checksums */
  19        u64 b_recover_count;    /* Number of blocks fixed by ecc */
  20
  21        /*
  22         * debugfs entries, used if this is passed to
  23         * ocfs2_blockcheck_stats_debugfs_install()
  24         */
  25        struct dentry *b_debug_dir;     /* Parent of the debugfs  files */
  26};
  27
  28
  29/* High level block API */
  30void ocfs2_compute_meta_ecc(struct super_block *sb, void *data,
  31                            struct ocfs2_block_check *bc);
  32int ocfs2_validate_meta_ecc(struct super_block *sb, void *data,
  33                            struct ocfs2_block_check *bc);
  34void ocfs2_compute_meta_ecc_bhs(struct super_block *sb,
  35                                struct buffer_head **bhs, int nr,
  36                                struct ocfs2_block_check *bc);
  37int ocfs2_validate_meta_ecc_bhs(struct super_block *sb,
  38                                struct buffer_head **bhs, int nr,
  39                                struct ocfs2_block_check *bc);
  40
  41/* Lower level API */
  42void ocfs2_block_check_compute(void *data, size_t blocksize,
  43                               struct ocfs2_block_check *bc);
  44int ocfs2_block_check_validate(void *data, size_t blocksize,
  45                               struct ocfs2_block_check *bc,
  46                               struct ocfs2_blockcheck_stats *stats);
  47void ocfs2_block_check_compute_bhs(struct buffer_head **bhs, int nr,
  48                                   struct ocfs2_block_check *bc);
  49int ocfs2_block_check_validate_bhs(struct buffer_head **bhs, int nr,
  50                                   struct ocfs2_block_check *bc,
  51                                   struct ocfs2_blockcheck_stats *stats);
  52
  53/* Debug Initialization */
  54void ocfs2_blockcheck_stats_debugfs_install(struct ocfs2_blockcheck_stats *stats,
  55                                            struct dentry *parent);
  56void ocfs2_blockcheck_stats_debugfs_remove(struct ocfs2_blockcheck_stats *stats);
  57
  58/*
  59 * Hamming code functions
  60 */
  61
  62/*
  63 * Encoding hamming code parity bits for a buffer.
  64 *
  65 * This is the low level encoder function.  It can be called across
  66 * multiple hunks just like the crc32 code.  'd' is the number of bits
  67 * _in_this_hunk_.  nr is the bit offset of this hunk.  So, if you had
  68 * two 512B buffers, you would do it like so:
  69 *
  70 * parity = ocfs2_hamming_encode(0, buf1, 512 * 8, 0);
  71 * parity = ocfs2_hamming_encode(parity, buf2, 512 * 8, 512 * 8);
  72 *
  73 * If you just have one buffer, use ocfs2_hamming_encode_block().
  74 */
  75u32 ocfs2_hamming_encode(u32 parity, void *data, unsigned int d,
  76                         unsigned int nr);
  77/*
  78 * Fix a buffer with a bit error.  The 'fix' is the original parity
  79 * xor'd with the parity calculated now.
  80 *
  81 * Like ocfs2_hamming_encode(), this can handle hunks.  nr is the bit
  82 * offset of the current hunk.  If bit to be fixed is not part of the
  83 * current hunk, this does nothing.
  84 *
  85 * If you only have one buffer, use ocfs2_hamming_fix_block().
  86 */
  87void ocfs2_hamming_fix(void *data, unsigned int d, unsigned int nr,
  88                       unsigned int fix);
  89
  90/* Convenience wrappers for a single buffer of data */
  91extern u32 ocfs2_hamming_encode_block(void *data, unsigned int blocksize);
  92extern void ocfs2_hamming_fix_block(void *data, unsigned int blocksize,
  93                                    unsigned int fix);
  94#endif
  95