mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-24 01:41:39 +00:00
mtd: mtd_nandecctest: ensure alignment requirement for bitops
Currently the data blocks which is used to test single bit error correction is allocated statically and injecting single bit error is implemented by using __change_bit() which must operate on the memory aligned to the size of an "unsigned long". But there is no such guarantee for statically allocated array. This fix the issue by allocating the data block dynamically by kmalloc(). It also allocate the ecc code dynamically instead of allocating statically on stack. The reason to allocate the ecc code dynamically is that later change will add tests which inject bit errors into the ecc code by bitops. Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
c5b8384abc
commit
1749c00ffc
1 changed files with 28 additions and 13 deletions
|
@ -4,6 +4,7 @@
|
|||
#include <linux/random.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mtd/nand_ecc.h>
|
||||
|
||||
#if defined(CONFIG_MTD_NAND) || defined(CONFIG_MTD_NAND_MODULE)
|
||||
|
@ -31,16 +32,24 @@ static void dump_data_ecc(void *error_data, void *error_ecc, void *correct_data,
|
|||
DUMP_PREFIX_NONE, 16, 1, correct_ecc, 3, false);
|
||||
}
|
||||
|
||||
static unsigned char correct_data[512];
|
||||
static unsigned char error_data[512];
|
||||
|
||||
static int nand_ecc_test(const size_t size)
|
||||
{
|
||||
unsigned char correct_ecc[3];
|
||||
unsigned char error_ecc[3];
|
||||
int err = 0;
|
||||
void *error_data;
|
||||
void *error_ecc;
|
||||
void *correct_data;
|
||||
void *correct_ecc;
|
||||
char testname[30];
|
||||
|
||||
BUG_ON(sizeof(correct_data) < size);
|
||||
error_data = kmalloc(size, GFP_KERNEL);
|
||||
error_ecc = kmalloc(3, GFP_KERNEL);
|
||||
correct_data = kmalloc(size, GFP_KERNEL);
|
||||
correct_ecc = kmalloc(3, GFP_KERNEL);
|
||||
|
||||
if (!error_data || !error_ecc || !correct_data || !correct_ecc) {
|
||||
err = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
||||
sprintf(testname, "nand-ecc-%zu", size);
|
||||
|
||||
|
@ -53,15 +62,21 @@ static int nand_ecc_test(const size_t size)
|
|||
__nand_calculate_ecc(error_data, size, error_ecc);
|
||||
__nand_correct_data(error_data, correct_ecc, error_ecc, size);
|
||||
|
||||
if (!memcmp(correct_data, error_data, size)) {
|
||||
pr_info("mtd_nandecctest: ok - %s\n", testname);
|
||||
return 0;
|
||||
if (memcmp(correct_data, error_data, size)) {
|
||||
pr_err("mtd_nandecctest: not ok - %s\n", testname);
|
||||
dump_data_ecc(error_data, error_ecc, correct_data, correct_ecc,
|
||||
size);
|
||||
err = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
pr_info("mtd_nandecctest: ok - %s\n", testname);
|
||||
error:
|
||||
kfree(error_data);
|
||||
kfree(error_ecc);
|
||||
kfree(correct_data);
|
||||
kfree(correct_ecc);
|
||||
|
||||
pr_err("mtd_nandecctest: not ok - %s\n", testname);
|
||||
dump_data_ecc(error_data, error_ecc, correct_data, correct_ecc, size);
|
||||
|
||||
return -EINVAL;
|
||||
return err;
|
||||
}
|
||||
|
||||
#else
|
||||
|
|
Loading…
Reference in a new issue