123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /*
- * Copyright (C) 2015 Google, Inc.
- *
- * Author: Sami Tolvanen <samitolvanen@google.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- */
- #ifndef DM_VERITY_FEC_H
- #define DM_VERITY_FEC_H
- #include "dm-verity.h"
- #include <linux/rslib.h>
- /* Reed-Solomon(M, N) parameters */
- #define DM_VERITY_FEC_RSM 255
- #define DM_VERITY_FEC_MAX_RSN 253
- #define DM_VERITY_FEC_MIN_RSN 231 /* ~10% space overhead */
- /* buffers for deinterleaving and decoding */
- #define DM_VERITY_FEC_BUF_PREALLOC 1 /* buffers to preallocate */
- #define DM_VERITY_FEC_BUF_RS_BITS 4 /* 1 << RS blocks per buffer */
- /* we need buffers for at most 1 << block size RS blocks */
- #define DM_VERITY_FEC_BUF_MAX \
- (1 << (PAGE_SHIFT - DM_VERITY_FEC_BUF_RS_BITS))
- /* maximum recursion level for verity_fec_decode */
- #define DM_VERITY_FEC_MAX_RECURSION 4
- #define DM_VERITY_OPT_FEC_DEV "use_fec_from_device"
- #define DM_VERITY_OPT_FEC_BLOCKS "fec_blocks"
- #define DM_VERITY_OPT_FEC_START "fec_start"
- #define DM_VERITY_OPT_FEC_ROOTS "fec_roots"
- /* configuration */
- struct dm_verity_fec {
- struct dm_dev *dev; /* parity data device */
- struct dm_bufio_client *data_bufio; /* for data dev access */
- struct dm_bufio_client *bufio; /* for parity data access */
- sector_t start; /* parity data start in blocks */
- sector_t blocks; /* number of blocks covered */
- sector_t rounds; /* number of interleaving rounds */
- sector_t hash_blocks; /* blocks covered after v->hash_start */
- unsigned char roots; /* number of parity bytes, M-N of RS(M, N) */
- unsigned char rsn; /* N of RS(M, N) */
- mempool_t *rs_pool; /* mempool for fio->rs */
- mempool_t *prealloc_pool; /* mempool for preallocated buffers */
- mempool_t *extra_pool; /* mempool for extra buffers */
- mempool_t *output_pool; /* mempool for output */
- struct kmem_cache *cache; /* cache for buffers */
- };
- /* per-bio data */
- struct dm_verity_fec_io {
- struct rs_control *rs; /* Reed-Solomon state */
- int erasures[DM_VERITY_FEC_MAX_RSN]; /* erasures for decode_rs8 */
- u8 *bufs[DM_VERITY_FEC_BUF_MAX]; /* bufs for deinterleaving */
- unsigned nbufs; /* number of buffers allocated */
- u8 *output; /* buffer for corrected output */
- size_t output_pos;
- unsigned level; /* recursion level */
- };
- #ifdef CONFIG_DM_VERITY_FEC
- /* each feature parameter requires a value */
- #define DM_VERITY_OPTS_FEC 8
- extern bool verity_fec_is_enabled(struct dm_verity *v);
- extern int verity_fec_decode(struct dm_verity *v, struct dm_verity_io *io,
- enum verity_block_type type, sector_t block,
- u8 *dest, struct bvec_iter *iter);
- extern unsigned verity_fec_status_table(struct dm_verity *v, unsigned sz,
- char *result, unsigned maxlen);
- extern void verity_fec_finish_io(struct dm_verity_io *io);
- extern void verity_fec_init_io(struct dm_verity_io *io);
- extern bool verity_is_fec_opt_arg(const char *arg_name);
- extern int verity_fec_parse_opt_args(struct dm_arg_set *as,
- struct dm_verity *v, unsigned *argc,
- const char *arg_name);
- extern void verity_fec_dtr(struct dm_verity *v);
- extern int verity_fec_ctr_alloc(struct dm_verity *v);
- extern int verity_fec_ctr(struct dm_verity *v);
- #else /* !CONFIG_DM_VERITY_FEC */
- #define DM_VERITY_OPTS_FEC 0
- static inline bool verity_fec_is_enabled(struct dm_verity *v)
- {
- return false;
- }
- static inline int verity_fec_decode(struct dm_verity *v,
- struct dm_verity_io *io,
- enum verity_block_type type,
- sector_t block, u8 *dest,
- struct bvec_iter *iter)
- {
- return -EOPNOTSUPP;
- }
- static inline unsigned verity_fec_status_table(struct dm_verity *v,
- unsigned sz, char *result,
- unsigned maxlen)
- {
- return sz;
- }
- static inline void verity_fec_finish_io(struct dm_verity_io *io)
- {
- }
- static inline void verity_fec_init_io(struct dm_verity_io *io)
- {
- }
- static inline bool verity_is_fec_opt_arg(const char *arg_name)
- {
- return false;
- }
- static inline int verity_fec_parse_opt_args(struct dm_arg_set *as,
- struct dm_verity *v,
- unsigned *argc,
- const char *arg_name)
- {
- return -EINVAL;
- }
- static inline void verity_fec_dtr(struct dm_verity *v)
- {
- }
- static inline int verity_fec_ctr_alloc(struct dm_verity *v)
- {
- return 0;
- }
- static inline int verity_fec_ctr(struct dm_verity *v)
- {
- return 0;
- }
- #endif /* CONFIG_DM_VERITY_FEC */
- #endif /* DM_VERITY_FEC_H */
|