e581595ea2
When calling debugfs functions, there is no need to ever check the return value. The function can work or not, but the code logic should never do something different based on this. Also, because there is no need to save the file dentry, remove all of the variables that were being saved, and just recursively delete the whole directory when shutting down, saving a lot of logic and local variables. [gregkh@linuxfoundation.org: v2] Link: http://lkml.kernel.org/r/20190613055455.GE19717@kroah.com Link: http://lkml.kernel.org/r/20190612152912.GA19151@kroah.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com> Cc: Mark Fasheh <mark@fasheh.com> Cc: Joel Becker <jlbec@evilplan.org> Cc: Joseph Qi <joseph.qi@linux.alibaba.com> Cc: Jia Guo <guojia12@huawei.com> Cc: Junxiao Bi <junxiao.bi@oracle.com> Cc: Changwei Ge <gechangwei@live.cn> Cc: Gang He <ghe@suse.com> Cc: Jun Piao <piaojun@huawei.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
97 lines
3.3 KiB
C
97 lines
3.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/* -*- mode: c; c-basic-offset: 8; -*-
|
|
* vim: noexpandtab sw=8 ts=8 sts=0:
|
|
*
|
|
* blockcheck.h
|
|
*
|
|
* Checksum and ECC codes for the OCFS2 userspace library.
|
|
*
|
|
* Copyright (C) 2004, 2008 Oracle. All rights reserved.
|
|
*/
|
|
|
|
#ifndef OCFS2_BLOCKCHECK_H
|
|
#define OCFS2_BLOCKCHECK_H
|
|
|
|
|
|
/* Count errors and error correction from blockcheck.c */
|
|
struct ocfs2_blockcheck_stats {
|
|
spinlock_t b_lock;
|
|
u64 b_check_count; /* Number of blocks we've checked */
|
|
u64 b_failure_count; /* Number of failed checksums */
|
|
u64 b_recover_count; /* Number of blocks fixed by ecc */
|
|
|
|
/*
|
|
* debugfs entries, used if this is passed to
|
|
* ocfs2_blockcheck_stats_debugfs_install()
|
|
*/
|
|
struct dentry *b_debug_dir; /* Parent of the debugfs files */
|
|
};
|
|
|
|
|
|
/* High level block API */
|
|
void ocfs2_compute_meta_ecc(struct super_block *sb, void *data,
|
|
struct ocfs2_block_check *bc);
|
|
int ocfs2_validate_meta_ecc(struct super_block *sb, void *data,
|
|
struct ocfs2_block_check *bc);
|
|
void ocfs2_compute_meta_ecc_bhs(struct super_block *sb,
|
|
struct buffer_head **bhs, int nr,
|
|
struct ocfs2_block_check *bc);
|
|
int ocfs2_validate_meta_ecc_bhs(struct super_block *sb,
|
|
struct buffer_head **bhs, int nr,
|
|
struct ocfs2_block_check *bc);
|
|
|
|
/* Lower level API */
|
|
void ocfs2_block_check_compute(void *data, size_t blocksize,
|
|
struct ocfs2_block_check *bc);
|
|
int ocfs2_block_check_validate(void *data, size_t blocksize,
|
|
struct ocfs2_block_check *bc,
|
|
struct ocfs2_blockcheck_stats *stats);
|
|
void ocfs2_block_check_compute_bhs(struct buffer_head **bhs, int nr,
|
|
struct ocfs2_block_check *bc);
|
|
int ocfs2_block_check_validate_bhs(struct buffer_head **bhs, int nr,
|
|
struct ocfs2_block_check *bc,
|
|
struct ocfs2_blockcheck_stats *stats);
|
|
|
|
/* Debug Initialization */
|
|
void ocfs2_blockcheck_stats_debugfs_install(struct ocfs2_blockcheck_stats *stats,
|
|
struct dentry *parent);
|
|
void ocfs2_blockcheck_stats_debugfs_remove(struct ocfs2_blockcheck_stats *stats);
|
|
|
|
/*
|
|
* Hamming code functions
|
|
*/
|
|
|
|
/*
|
|
* Encoding hamming code parity bits for a buffer.
|
|
*
|
|
* This is the low level encoder function. It can be called across
|
|
* multiple hunks just like the crc32 code. 'd' is the number of bits
|
|
* _in_this_hunk_. nr is the bit offset of this hunk. So, if you had
|
|
* two 512B buffers, you would do it like so:
|
|
*
|
|
* parity = ocfs2_hamming_encode(0, buf1, 512 * 8, 0);
|
|
* parity = ocfs2_hamming_encode(parity, buf2, 512 * 8, 512 * 8);
|
|
*
|
|
* If you just have one buffer, use ocfs2_hamming_encode_block().
|
|
*/
|
|
u32 ocfs2_hamming_encode(u32 parity, void *data, unsigned int d,
|
|
unsigned int nr);
|
|
/*
|
|
* Fix a buffer with a bit error. The 'fix' is the original parity
|
|
* xor'd with the parity calculated now.
|
|
*
|
|
* Like ocfs2_hamming_encode(), this can handle hunks. nr is the bit
|
|
* offset of the current hunk. If bit to be fixed is not part of the
|
|
* current hunk, this does nothing.
|
|
*
|
|
* If you only have one buffer, use ocfs2_hamming_fix_block().
|
|
*/
|
|
void ocfs2_hamming_fix(void *data, unsigned int d, unsigned int nr,
|
|
unsigned int fix);
|
|
|
|
/* Convenience wrappers for a single buffer of data */
|
|
extern u32 ocfs2_hamming_encode_block(void *data, unsigned int blocksize);
|
|
extern void ocfs2_hamming_fix_block(void *data, unsigned int blocksize,
|
|
unsigned int fix);
|
|
#endif
|