Patchwork [1/8] mtd_tests: Refactor duplicate code

login
register
mail settings
Submitter Vikram Narayanan
Date Oct. 2, 2012, 2:28 p.m.
Message ID <506AF9F0.7010903@gmail.com>
Download mbox | patch
Permalink /patch/188530/
State New
Headers show

Comments

Vikram Narayanan - Oct. 2, 2012, 2:28 p.m.
Move the duplicate code from all the tests to a common header.

Signed-off-by: Vikram Narayanan <vikram186@gmail.com>
---
 drivers/mtd/tests/mtd_nandbiterrs.c |   29 ++---------------
 drivers/mtd/tests/mtd_oobtest.c     |   31 ++----------------
 drivers/mtd/tests/mtd_pagetest.c    |   39 ++++------------------
 drivers/mtd/tests/mtd_speedtest.c   |   60 ++--------------------------------
 drivers/mtd/tests/mtd_stresstest.c  |   31 ++----------------
 drivers/mtd/tests/mtd_subpagetest.c |   29 +---------------
 drivers/mtd/tests/mtd_tests.h       |   60 +++++++++++++++++++++++++++++++++++
 drivers/mtd/tests/mtd_torturetest.c |   33 +------------------
 8 files changed, 84 insertions(+), 228 deletions(-)
 create mode 100644 drivers/mtd/tests/mtd_tests.h
Artem Bityutskiy - Oct. 5, 2012, 10:17 a.m.
On Tue, 2012-10-02 at 19:58 +0530, Vikram Narayanan wrote:
> Move the duplicate code from all the tests to a common header.
> 
> Signed-off-by: Vikram Narayanan <vikram186@gmail.com>

Could you please re-structure your patches so that you first do the
'pr_' changes, and then this one. Because 'pr_' are trivial and I can
apply them right away.

This one - I think if you look at UBI and JFFS2 - you may find them also
use the same pattern, and you can actually make this function go to
mtdcore.c and be exported instead.

Patch

diff --git a/drivers/mtd/tests/mtd_nandbiterrs.c b/drivers/mtd/tests/mtd_nandbiterrs.c
index cc8d62c..072fc43 100644
--- a/drivers/mtd/tests/mtd_nandbiterrs.c
+++ b/drivers/mtd/tests/mtd_nandbiterrs.c
@@ -46,6 +46,7 @@ 
 #include <linux/err.h>
 #include <linux/mtd/nand.h>
 #include <linux/slab.h>
+#include "mtd_tests.h"
 
 #define msg(FMT, VA...) pr_info("mtd_nandbiterrs: "FMT, ##VA)
 
@@ -97,30 +98,6 @@  static uint8_t hash(unsigned offset)
 	return c;
 }
 
-static int erase_block(void)
-{
-	int err;
-	struct erase_info ei;
-	loff_t addr = eraseblock * mtd->erasesize;
-
-	msg("erase_block\n");
-
-	memset(&ei, 0, sizeof(struct erase_info));
-	ei.mtd  = mtd;
-	ei.addr = addr;
-	ei.len  = mtd->erasesize;
-
-	err = mtd_erase(mtd, &ei);
-	if (err || ei.state == MTD_ERASE_FAILED) {
-		msg("error %d while erasing\n", err);
-		if (!err)
-			err = -EIO;
-		return err;
-	}
-
-	return 0;
-}
-
 /* Writes wbuffer to page */
 static int write_page(int log)
 {
@@ -414,7 +391,7 @@  static int __init mtd_nandbiterrs_init(void)
 		goto exit_rbuffer;
 	}
 
-	err = erase_block();
+	err = erase_eraseblock(mtd, eraseblock);
 	if (err)
 		goto exit_error;
 
@@ -427,7 +404,7 @@  static int __init mtd_nandbiterrs_init(void)
 		goto exit_error;
 
 	/* We leave the block un-erased in case of test failure. */
-	err = erase_block();
+	err = erase_eraseblock(mtd, eraseblock);
 	if (err)
 		goto exit_error;
 
diff --git a/drivers/mtd/tests/mtd_oobtest.c b/drivers/mtd/tests/mtd_oobtest.c
index ed9b628..6714985 100644
--- a/drivers/mtd/tests/mtd_oobtest.c
+++ b/drivers/mtd/tests/mtd_oobtest.c
@@ -27,6 +27,7 @@ 
 #include <linux/mtd/mtd.h>
 #include <linux/slab.h>
 #include <linux/sched.h>
+#include "mtd_tests.h"
 
 #define PRINT_PREF KERN_INFO "mtd_oobtest: "
 
@@ -67,32 +68,6 @@  static void set_random_data(unsigned char *buf, size_t len)
 		buf[i] = simple_rand();
 }
 
-static int erase_eraseblock(int ebnum)
-{
-	int err;
-	struct erase_info ei;
-	loff_t addr = ebnum * mtd->erasesize;
-
-	memset(&ei, 0, sizeof(struct erase_info));
-	ei.mtd  = mtd;
-	ei.addr = addr;
-	ei.len  = mtd->erasesize;
-
-	err = mtd_erase(mtd, &ei);
-	if (err) {
-		printk(PRINT_PREF "error %d while erasing EB %d\n", err, ebnum);
-		return err;
-	}
-
-	if (ei.state == MTD_ERASE_FAILED) {
-		printk(PRINT_PREF "some erase error occurred at EB %d\n",
-		       ebnum);
-		return -EIO;
-	}
-
-	return 0;
-}
-
 static int erase_whole_device(void)
 {
 	int err;
@@ -102,7 +77,7 @@  static int erase_whole_device(void)
 	for (i = 0; i < ebcnt; ++i) {
 		if (bbt[i])
 			continue;
-		err = erase_eraseblock(i);
+		err = erase_eraseblock(mtd, i);
 		if (err)
 			return err;
 		cond_resched();
@@ -597,7 +572,7 @@  static int __init mtd_oobtest_init(void)
 			errcnt += 1;
 		}
 
-		err = erase_eraseblock(ebcnt - 1);
+		err = erase_eraseblock(mtd, ebcnt - 1);
 		if (err)
 			goto out;
 
diff --git a/drivers/mtd/tests/mtd_pagetest.c b/drivers/mtd/tests/mtd_pagetest.c
index 252ddb0..2a09405 100644
--- a/drivers/mtd/tests/mtd_pagetest.c
+++ b/drivers/mtd/tests/mtd_pagetest.c
@@ -27,6 +27,7 @@ 
 #include <linux/mtd/mtd.h>
 #include <linux/slab.h>
 #include <linux/sched.h>
+#include "mtd_tests.h"
 
 #define PRINT_PREF KERN_INFO "mtd_pagetest: "
 
@@ -66,32 +67,6 @@  static void set_random_data(unsigned char *buf, size_t len)
 		buf[i] = simple_rand();
 }
 
-static int erase_eraseblock(int ebnum)
-{
-	int err;
-	struct erase_info ei;
-	loff_t addr = ebnum * mtd->erasesize;
-
-	memset(&ei, 0, sizeof(struct erase_info));
-	ei.mtd  = mtd;
-	ei.addr = addr;
-	ei.len  = mtd->erasesize;
-
-	err = mtd_erase(mtd, &ei);
-	if (err) {
-		printk(PRINT_PREF "error %d while erasing EB %d\n", err, ebnum);
-		return err;
-	}
-
-	if (ei.state == MTD_ERASE_FAILED) {
-		printk(PRINT_PREF "some erase error occurred at EB %d\n",
-		       ebnum);
-		return -EIO;
-	}
-
-	return 0;
-}
-
 static int write_eraseblock(int ebnum)
 {
 	int err = 0;
@@ -321,7 +296,7 @@  static int erasecrosstest(void)
 		ebnum2 -= 1;
 
 	printk(PRINT_PREF "erasing block %d\n", ebnum);
-	err = erase_eraseblock(ebnum);
+	err = erase_eraseblock(mtd, ebnum);
 	if (err)
 		return err;
 
@@ -354,7 +329,7 @@  static int erasecrosstest(void)
 	}
 
 	printk(PRINT_PREF "erasing block %d\n", ebnum);
-	err = erase_eraseblock(ebnum);
+	err = erase_eraseblock(mtd, ebnum);
 	if (err)
 		return err;
 
@@ -369,7 +344,7 @@  static int erasecrosstest(void)
 	}
 
 	printk(PRINT_PREF "erasing block %d\n", ebnum2);
-	err = erase_eraseblock(ebnum2);
+	err = erase_eraseblock(mtd, ebnum2);
 	if (err)
 		return err;
 
@@ -412,7 +387,7 @@  static int erasetest(void)
 	}
 
 	printk(PRINT_PREF "erasing block %d\n", ebnum);
-	err = erase_eraseblock(ebnum);
+	err = erase_eraseblock(mtd, ebnum);
 	if (err)
 		return err;
 
@@ -426,7 +401,7 @@  static int erasetest(void)
 	}
 
 	printk(PRINT_PREF "erasing block %d\n", ebnum);
-	err = erase_eraseblock(ebnum);
+	err = erase_eraseblock(mtd, ebnum);
 	if (err)
 		return err;
 
@@ -557,7 +532,7 @@  static int __init mtd_pagetest_init(void)
 	for (i = 0; i < ebcnt; ++i) {
 		if (bbt[i])
 			continue;
-		err = erase_eraseblock(i);
+		err = erase_eraseblock(mtd, i);
 		if (err)
 			goto out;
 		cond_resched();
diff --git a/drivers/mtd/tests/mtd_speedtest.c b/drivers/mtd/tests/mtd_speedtest.c
index 42b0f74..e3518b4 100644
--- a/drivers/mtd/tests/mtd_speedtest.c
+++ b/drivers/mtd/tests/mtd_speedtest.c
@@ -27,6 +27,7 @@ 
 #include <linux/slab.h>
 #include <linux/sched.h>
 #include <linux/random.h>
+#include "mtd_tests.h"
 
 #define PRINT_PREF KERN_INFO "mtd_speedtest: "
 
@@ -57,59 +58,6 @@  static void set_random_data(unsigned char *buf, size_t len)
 		buf[i] = random32();
 }
 
-static int erase_eraseblock(int ebnum)
-{
-	int err;
-	struct erase_info ei;
-	loff_t addr = ebnum * mtd->erasesize;
-
-	memset(&ei, 0, sizeof(struct erase_info));
-	ei.mtd  = mtd;
-	ei.addr = addr;
-	ei.len  = mtd->erasesize;
-
-	err = mtd_erase(mtd, &ei);
-	if (err) {
-		printk(PRINT_PREF "error %d while erasing EB %d\n", err, ebnum);
-		return err;
-	}
-
-	if (ei.state == MTD_ERASE_FAILED) {
-		printk(PRINT_PREF "some erase error occurred at EB %d\n",
-		       ebnum);
-		return -EIO;
-	}
-
-	return 0;
-}
-
-static int multiblock_erase(int ebnum, int blocks)
-{
-	int err;
-	struct erase_info ei;
-	loff_t addr = ebnum * mtd->erasesize;
-
-	memset(&ei, 0, sizeof(struct erase_info));
-	ei.mtd  = mtd;
-	ei.addr = addr;
-	ei.len  = mtd->erasesize * blocks;
-
-	err = mtd_erase(mtd, &ei);
-	if (err) {
-		printk(PRINT_PREF "error %d while erasing EB %d, blocks %d\n",
-		       err, ebnum, blocks);
-		return err;
-	}
-
-	if (ei.state == MTD_ERASE_FAILED) {
-		printk(PRINT_PREF "some erase error occurred at EB %d,"
-		       "blocks %d\n", ebnum, blocks);
-		return -EIO;
-	}
-
-	return 0;
-}
-
 static int erase_whole_device(void)
 {
 	int err;
@@ -118,7 +66,7 @@  static int erase_whole_device(void)
 	for (i = 0; i < ebcnt; ++i) {
 		if (bbt[i])
 			continue;
-		err = erase_eraseblock(i);
+		err = erase_eraseblock(mtd, i);
 		if (err)
 			return err;
 		cond_resched();
@@ -510,7 +458,7 @@  static int __init mtd_speedtest_init(void)
 	for (i = 0; i < ebcnt; ++i) {
 		if (bbt[i])
 			continue;
-		err = erase_eraseblock(i);
+		err = erase_eraseblock(mtd, i);
 		if (err)
 			goto out;
 		cond_resched();
@@ -533,7 +481,7 @@  static int __init mtd_speedtest_init(void)
 				i++;
 				continue;
 			}
-			err = multiblock_erase(i, j);
+			err = multiblock_erase(mtd, i, j);
 			if (err)
 				goto out;
 			cond_resched();
diff --git a/drivers/mtd/tests/mtd_stresstest.c b/drivers/mtd/tests/mtd_stresstest.c
index cb268ce..87e2e05 100644
--- a/drivers/mtd/tests/mtd_stresstest.c
+++ b/drivers/mtd/tests/mtd_stresstest.c
@@ -28,6 +28,7 @@ 
 #include <linux/sched.h>
 #include <linux/vmalloc.h>
 #include <linux/random.h>
+#include "mtd_tests.h"
 
 #define PRINT_PREF KERN_INFO "mtd_stresstest: "
 
@@ -81,32 +82,6 @@  static int rand_len(int offs)
 	return len;
 }
 
-static int erase_eraseblock(int ebnum)
-{
-	int err;
-	struct erase_info ei;
-	loff_t addr = ebnum * mtd->erasesize;
-
-	memset(&ei, 0, sizeof(struct erase_info));
-	ei.mtd  = mtd;
-	ei.addr = addr;
-	ei.len  = mtd->erasesize;
-
-	err = mtd_erase(mtd, &ei);
-	if (unlikely(err)) {
-		printk(PRINT_PREF "error %d while erasing EB %d\n", err, ebnum);
-		return err;
-	}
-
-	if (unlikely(ei.state == MTD_ERASE_FAILED)) {
-		printk(PRINT_PREF "some erase error occurred at EB %d\n",
-		       ebnum);
-		return -EIO;
-	}
-
-	return 0;
-}
-
 static int is_block_bad(int ebnum)
 {
 	loff_t addr = ebnum * mtd->erasesize;
@@ -154,7 +129,7 @@  static int do_write(void)
 
 	offs = offsets[eb];
 	if (offs >= mtd->erasesize) {
-		err = erase_eraseblock(eb);
+		err = erase_eraseblock(mtd, eb);
 		if (err)
 			return err;
 		offs = offsets[eb] = 0;
@@ -165,7 +140,7 @@  static int do_write(void)
 		if (bbt[eb + 1])
 			len = mtd->erasesize - offs;
 		else {
-			err = erase_eraseblock(eb + 1);
+			err = erase_eraseblock(mtd, eb + 1);
 			if (err)
 				return err;
 			offsets[eb + 1] = 0;
diff --git a/drivers/mtd/tests/mtd_subpagetest.c b/drivers/mtd/tests/mtd_subpagetest.c
index 9667bf5..642f958 100644
--- a/drivers/mtd/tests/mtd_subpagetest.c
+++ b/drivers/mtd/tests/mtd_subpagetest.c
@@ -26,6 +26,7 @@ 
 #include <linux/mtd/mtd.h>
 #include <linux/slab.h>
 #include <linux/sched.h>
+#include "mtd_tests.h"
 
 #define PRINT_PREF KERN_INFO "mtd_subpagetest: "
 
@@ -69,32 +70,6 @@  static inline void clear_data(unsigned char *buf, size_t len)
 	memset(buf, 0, len);
 }
 
-static int erase_eraseblock(int ebnum)
-{
-	int err;
-	struct erase_info ei;
-	loff_t addr = ebnum * mtd->erasesize;
-
-	memset(&ei, 0, sizeof(struct erase_info));
-	ei.mtd  = mtd;
-	ei.addr = addr;
-	ei.len  = mtd->erasesize;
-
-	err = mtd_erase(mtd, &ei);
-	if (err) {
-		printk(PRINT_PREF "error %d while erasing EB %d\n", err, ebnum);
-		return err;
-	}
-
-	if (ei.state == MTD_ERASE_FAILED) {
-		printk(PRINT_PREF "some erase error occurred at EB %d\n",
-		       ebnum);
-		return -EIO;
-	}
-
-	return 0;
-}
-
 static int erase_whole_device(void)
 {
 	int err;
@@ -104,7 +79,7 @@  static int erase_whole_device(void)
 	for (i = 0; i < ebcnt; ++i) {
 		if (bbt[i])
 			continue;
-		err = erase_eraseblock(i);
+		err = erase_eraseblock(mtd, i);
 		if (err)
 			return err;
 		cond_resched();
diff --git a/drivers/mtd/tests/mtd_tests.h b/drivers/mtd/tests/mtd_tests.h
new file mode 100644
index 0000000..b590c69
--- /dev/null
+++ b/drivers/mtd/tests/mtd_tests.h
@@ -0,0 +1,60 @@ 
+/*
+ * Derived from the code which has
+ * Copyright (C) 2006-2008 Nokia Corporation
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifndef __MTD_TESTS_H__
+#define __MTD_TESTS_H__
+
+#include <linux/mtd/mtd.h>
+
+int multiblock_erase(struct mtd_info *mtd, int ebnum, int blocks)
+{
+	int err;
+	struct erase_info ei;
+	loff_t addr = ebnum * mtd->erasesize;
+
+	memset(&ei, 0, sizeof(struct erase_info));
+	ei.mtd  = mtd;
+	ei.addr = addr;
+	ei.len  = mtd->erasesize * blocks;
+
+	err = mtd_erase(mtd, &ei);
+	if (err) {
+		pr_info("error %d while erasing EB %d, blocks %d\n",
+			       err, ebnum, blocks);
+		return err;
+	}
+
+	if (ei.state == MTD_ERASE_FAILED) {
+		pr_info("some erase error occurred at EB %d,"
+		       "blocks %d\n", ebnum, blocks);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+
+int erase_eraseblock(struct mtd_info *mtd, int ebnum)
+{
+	return multiblock_erase(mtd, ebnum, 1);
+}
+
+#endif /* __MTD_TESTS_H__ */
+
diff --git a/drivers/mtd/tests/mtd_torturetest.c b/drivers/mtd/tests/mtd_torturetest.c
index b65861b..31c2eaf 100644
--- a/drivers/mtd/tests/mtd_torturetest.c
+++ b/drivers/mtd/tests/mtd_torturetest.c
@@ -30,7 +30,7 @@ 
 #include <linux/mtd/mtd.h>
 #include <linux/slab.h>
 #include <linux/sched.h>
-
+#include "mtd_tests.h"
 #define PRINT_PREF KERN_INFO "mtd_torturetest: "
 #define RETRIES 3
 
@@ -92,35 +92,6 @@  static inline void stop_timing(void)
 }
 
 /*
- * Erase eraseblock number @ebnum.
- */
-static inline int erase_eraseblock(int ebnum)
-{
-	int err;
-	struct erase_info ei;
-	loff_t addr = ebnum * mtd->erasesize;
-
-	memset(&ei, 0, sizeof(struct erase_info));
-	ei.mtd  = mtd;
-	ei.addr = addr;
-	ei.len  = mtd->erasesize;
-
-	err = mtd_erase(mtd, &ei);
-	if (err) {
-		printk(PRINT_PREF "error %d while erasing EB %d\n", err, ebnum);
-		return err;
-	}
-
-	if (ei.state == MTD_ERASE_FAILED) {
-		printk(PRINT_PREF "some erase error occurred at EB %d\n",
-		       ebnum);
-		return -EIO;
-	}
-
-	return 0;
-}
-
-/*
  * Check that the contents of eraseblock number @enbum is equivalent to the
  * @buf buffer.
  */
@@ -316,7 +287,7 @@  static int __init tort_init(void)
 		for (i = eb; i < eb + ebcnt; i++) {
 			if (bad_ebs[i - eb])
 				continue;
-			err = erase_eraseblock(i);
+			err = erase_eraseblock(mtd, i);
 			if (err)
 				goto out;
 			cond_resched();