Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fd57ed02 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'linux-next' of git://git.infradead.org/ubi-2.6

* 'linux-next' of git://git.infradead.org/ubi-2.6:
  UBI: make tests modes dynamic
  UBI: make self-checks dynamic
  UBI: make debugging messages dynamic
  UBI: remove UBI_IO_DEBUG macro
  UBI: kill debugging buffer
  UBI: allocate erase checking buffer on demand
  UBI: allocate write checking buffer on demand
  UBI: always re-read in case of read failures
  UBI: cleanup comments about corrupted PEBs
  UBI: add slab cache for ubi_scan_leb objects
  UBI: use raw mtd read function in debugging code
  UBI: try to reveal buggy MTD drivers
  UBI: add a commentary about allocating VID header buffer on stack
  UBI: cleanup LEB start calculations
  UBI: fix NOR erase preparation quirk
parents ca749e2a 28237e45
Loading
Loading
Loading
Loading
+7 −1
Original line number Original line Diff line number Diff line
@@ -52,6 +52,12 @@ config MTD_UBI_GLUEBI
	   work on top of UBI. Do not enable this unless you use legacy
	   work on top of UBI. Do not enable this unless you use legacy
	   software.
	   software.


source "drivers/mtd/ubi/Kconfig.debug"
config MTD_UBI_DEBUG
	bool "UBI debugging"
	depends on SYSFS
	select DEBUG_FS
	select KALLSYMS_ALL if KALLSYMS && DEBUG_KERNEL
	help
	  This option enables UBI debugging.


endif # MTD_UBI
endif # MTD_UBI

drivers/mtd/ubi/Kconfig.debug

deleted100644 → 0
+0 −73
Original line number Original line Diff line number Diff line
comment "UBI debugging options"

config MTD_UBI_DEBUG
	bool "UBI debugging"
	depends on SYSFS
	select DEBUG_FS
	select KALLSYMS_ALL if KALLSYMS && DEBUG_KERNEL
	help
	  This option enables UBI debugging.

if MTD_UBI_DEBUG

config MTD_UBI_DEBUG_MSG
	bool "UBI debugging messages"
	help
	  This option enables UBI debugging messages.

config MTD_UBI_DEBUG_PARANOID
	bool "Extra self-checks"
	help
	  This option enables extra checks in UBI code. Note this slows UBI down
	  significantly.

config MTD_UBI_DEBUG_DISABLE_BGT
	bool "Do not enable the UBI background thread"
	help
	  This option switches the background thread off by default. The thread
	  may be also be enabled/disabled via UBI sysfs.

config MTD_UBI_DEBUG_EMULATE_BITFLIPS
	bool "Emulate flash bit-flips"
	help
	  This option emulates bit-flips with probability 1/50, which in turn
	  causes scrubbing. Useful for debugging and stressing UBI.

config MTD_UBI_DEBUG_EMULATE_WRITE_FAILURES
	bool "Emulate flash write failures"
	help
	  This option emulates write failures with probability 1/100. Useful for
	  debugging and testing how UBI handlines errors.

config MTD_UBI_DEBUG_EMULATE_ERASE_FAILURES
	bool "Emulate flash erase failures"
	help
	  This option emulates erase failures with probability 1/100. Useful for
	  debugging and testing how UBI handlines errors.

comment "Additional UBI debugging messages"

config MTD_UBI_DEBUG_MSG_BLD
	bool "Additional UBI initialization and build messages"
	help
	  This option enables detailed UBI initialization and device build
	  debugging messages.

config MTD_UBI_DEBUG_MSG_EBA
	bool "Eraseblock association unit messages"
	help
	  This option enables debugging messages from the UBI eraseblock
	  association unit.

config MTD_UBI_DEBUG_MSG_WL
	bool "Wear-leveling unit messages"
	help
	  This option enables debugging messages from the UBI wear-leveling
	  unit.

config MTD_UBI_DEBUG_MSG_IO
	bool "Input/output unit messages"
	help
	  This option enables debugging messages from the UBI input/output unit.

endif # MTD_UBI_DEBUG
+4 −16
Original line number Original line Diff line number Diff line
@@ -711,7 +711,7 @@ static int io_init(struct ubi_device *ubi)
	}
	}


	/* Similar for the data offset */
	/* Similar for the data offset */
	ubi->leb_start = ubi->vid_hdr_offset + UBI_EC_HDR_SIZE;
	ubi->leb_start = ubi->vid_hdr_offset + UBI_VID_HDR_SIZE;
	ubi->leb_start = ALIGN(ubi->leb_start, ubi->min_io_size);
	ubi->leb_start = ALIGN(ubi->leb_start, ubi->min_io_size);


	dbg_msg("vid_hdr_offset   %d", ubi->vid_hdr_offset);
	dbg_msg("vid_hdr_offset   %d", ubi->vid_hdr_offset);
@@ -923,6 +923,8 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
	spin_lock_init(&ubi->volumes_lock);
	spin_lock_init(&ubi->volumes_lock);


	ubi_msg("attaching mtd%d to ubi%d", mtd->index, ubi_num);
	ubi_msg("attaching mtd%d to ubi%d", mtd->index, ubi_num);
	dbg_msg("sizeof(struct ubi_scan_leb) %zu", sizeof(struct ubi_scan_leb));
	dbg_msg("sizeof(struct ubi_wl_entry) %zu", sizeof(struct ubi_wl_entry));


	err = io_init(ubi);
	err = io_init(ubi);
	if (err)
	if (err)
@@ -937,13 +939,6 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
	if (!ubi->peb_buf2)
	if (!ubi->peb_buf2)
		goto out_free;
		goto out_free;


#ifdef CONFIG_MTD_UBI_DEBUG_PARANOID
	mutex_init(&ubi->dbg_buf_mutex);
	ubi->dbg_peb_buf = vmalloc(ubi->peb_size);
	if (!ubi->dbg_peb_buf)
		goto out_free;
#endif

	err = attach_by_scanning(ubi);
	err = attach_by_scanning(ubi);
	if (err) {
	if (err) {
		dbg_err("failed to attach by scanning, error %d", err);
		dbg_err("failed to attach by scanning, error %d", err);
@@ -991,7 +986,6 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
	 * checks @ubi->thread_enabled. Otherwise we may fail to wake it up.
	 * checks @ubi->thread_enabled. Otherwise we may fail to wake it up.
	 */
	 */
	spin_lock(&ubi->wl_lock);
	spin_lock(&ubi->wl_lock);
	if (!DBG_DISABLE_BGT)
	ubi->thread_enabled = 1;
	ubi->thread_enabled = 1;
	wake_up_process(ubi->bgt_thread);
	wake_up_process(ubi->bgt_thread);
	spin_unlock(&ubi->wl_lock);
	spin_unlock(&ubi->wl_lock);
@@ -1009,9 +1003,6 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
out_free:
out_free:
	vfree(ubi->peb_buf1);
	vfree(ubi->peb_buf1);
	vfree(ubi->peb_buf2);
	vfree(ubi->peb_buf2);
#ifdef CONFIG_MTD_UBI_DEBUG_PARANOID
	vfree(ubi->dbg_peb_buf);
#endif
	if (ref)
	if (ref)
		put_device(&ubi->dev);
		put_device(&ubi->dev);
	else
	else
@@ -1082,9 +1073,6 @@ int ubi_detach_mtd_dev(int ubi_num, int anyway)
	put_mtd_device(ubi->mtd);
	put_mtd_device(ubi->mtd);
	vfree(ubi->peb_buf1);
	vfree(ubi->peb_buf1);
	vfree(ubi->peb_buf2);
	vfree(ubi->peb_buf2);
#ifdef CONFIG_MTD_UBI_DEBUG_PARANOID
	vfree(ubi->dbg_peb_buf);
#endif
	ubi_msg("mtd%d is detached from ubi%d", ubi->mtd->index, ubi->ubi_num);
	ubi_msg("mtd%d is detached from ubi%d", ubi->mtd->index, ubi->ubi_num);
	put_device(&ubi->dev);
	put_device(&ubi->dev);
	return 0;
	return 0;
+14 −0
Original line number Original line Diff line number Diff line
@@ -27,6 +27,20 @@
#ifdef CONFIG_MTD_UBI_DEBUG
#ifdef CONFIG_MTD_UBI_DEBUG


#include "ubi.h"
#include "ubi.h"
#include <linux/module.h>
#include <linux/moduleparam.h>

unsigned int ubi_msg_flags;
unsigned int ubi_chk_flags;
unsigned int ubi_tst_flags;

module_param_named(debug_msgs, ubi_msg_flags, uint, S_IRUGO | S_IWUSR);
module_param_named(debug_chks, ubi_chk_flags, uint, S_IRUGO | S_IWUSR);
module_param_named(debug_tsts, ubi_chk_flags, uint, S_IRUGO | S_IWUSR);

MODULE_PARM_DESC(debug_msgs, "Debug message type flags");
MODULE_PARM_DESC(debug_chks, "Debug check flags");
MODULE_PARM_DESC(debug_tsts, "Debug special test flags");


/**
/**
 * ubi_dbg_dump_ec_hdr - dump an erase counter header.
 * ubi_dbg_dump_ec_hdr - dump an erase counter header.
+78 −53
Original line number Original line Diff line number Diff line
@@ -38,6 +38,11 @@
	printk(KERN_DEBUG "UBI DBG (pid %d): %s: " fmt "\n", \
	printk(KERN_DEBUG "UBI DBG (pid %d): %s: " fmt "\n", \
	       current->pid, __func__, ##__VA_ARGS__)
	       current->pid, __func__, ##__VA_ARGS__)


#define dbg_do_msg(typ, fmt, ...) do {                       \
	if (ubi_msg_flags & typ)                             \
		dbg_msg(fmt, ##__VA_ARGS__);                 \
} while (0)

#define ubi_dbg_dump_stack() dump_stack()
#define ubi_dbg_dump_stack() dump_stack()


struct ubi_ec_hdr;
struct ubi_ec_hdr;
@@ -57,62 +62,88 @@ void ubi_dbg_dump_seb(const struct ubi_scan_leb *seb, int type);
void ubi_dbg_dump_mkvol_req(const struct ubi_mkvol_req *req);
void ubi_dbg_dump_mkvol_req(const struct ubi_mkvol_req *req);
void ubi_dbg_dump_flash(struct ubi_device *ubi, int pnum, int offset, int len);
void ubi_dbg_dump_flash(struct ubi_device *ubi, int pnum, int offset, int len);


extern unsigned int ubi_msg_flags;

/*
 * Debugging message type flags (must match msg_type_names in debug.c).
 *
 * UBI_MSG_GEN: general messages
 * UBI_MSG_EBA: journal messages
 * UBI_MSG_WL: mount messages
 * UBI_MSG_IO: commit messages
 * UBI_MSG_BLD: LEB find messages
 */
enum {
	UBI_MSG_GEN  = 0x1,
	UBI_MSG_EBA  = 0x2,
	UBI_MSG_WL   = 0x4,
	UBI_MSG_IO   = 0x8,
	UBI_MSG_BLD  = 0x10,
};

#define ubi_dbg_print_hex_dump(l, ps, pt, r, g, b, len, a)  \
#define ubi_dbg_print_hex_dump(l, ps, pt, r, g, b, len, a)  \
		print_hex_dump(l, ps, pt, r, g, b, len, a)
		print_hex_dump(l, ps, pt, r, g, b, len, a)


#ifdef CONFIG_MTD_UBI_DEBUG_MSG
/* General debugging messages */
/* General debugging messages */
#define dbg_gen(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__)
#define dbg_gen(fmt, ...) dbg_do_msg(UBI_MSG_GEN, fmt, ##__VA_ARGS__)
#else
#define dbg_gen(fmt, ...) ({})
#endif


#ifdef CONFIG_MTD_UBI_DEBUG_MSG_EBA
/* Messages from the eraseblock association sub-system */
/* Messages from the eraseblock association sub-system */
#define dbg_eba(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__)
#define dbg_eba(fmt, ...) dbg_do_msg(UBI_MSG_EBA, fmt, ##__VA_ARGS__)
#else
#define dbg_eba(fmt, ...) ({})
#endif


#ifdef CONFIG_MTD_UBI_DEBUG_MSG_WL
/* Messages from the wear-leveling sub-system */
/* Messages from the wear-leveling sub-system */
#define dbg_wl(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__)
#define dbg_wl(fmt, ...) dbg_do_msg(UBI_MSG_WL, fmt, ##__VA_ARGS__)
#else
#define dbg_wl(fmt, ...) ({})
#endif


#ifdef CONFIG_MTD_UBI_DEBUG_MSG_IO
/* Messages from the input/output sub-system */
/* Messages from the input/output sub-system */
#define dbg_io(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__)
#define dbg_io(fmt, ...) dbg_do_msg(UBI_MSG_IO, fmt, ##__VA_ARGS__)
#else
#define dbg_io(fmt, ...) ({})
#endif


#ifdef CONFIG_MTD_UBI_DEBUG_MSG_BLD
/* Initialization and build messages */
/* Initialization and build messages */
#define dbg_bld(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__)
#define dbg_bld(fmt, ...) dbg_do_msg(UBI_MSG_BLD, fmt, ##__VA_ARGS__)
#define UBI_IO_DEBUG 1

#else
extern unsigned int ubi_chk_flags;
#define dbg_bld(fmt, ...) ({})

#define UBI_IO_DEBUG 0
/*
#endif
 * Debugging check flags.
 *
 * UBI_CHK_GEN: general checks
 * UBI_CHK_IO: check writes and erases
 */
enum {
	UBI_CHK_GEN = 0x1,
	UBI_CHK_IO  = 0x2,
};


#ifdef CONFIG_MTD_UBI_DEBUG_PARANOID
int ubi_dbg_check_all_ff(struct ubi_device *ubi, int pnum, int offset, int len);
int ubi_dbg_check_all_ff(struct ubi_device *ubi, int pnum, int offset, int len);
int ubi_dbg_check_write(struct ubi_device *ubi, const void *buf, int pnum,
int ubi_dbg_check_write(struct ubi_device *ubi, const void *buf, int pnum,
			int offset, int len);
			int offset, int len);
#else
#define ubi_dbg_check_all_ff(ubi, pnum, offset, len) 0
#define ubi_dbg_check_write(ubi, buf, pnum, offset, len) 0
#endif


#ifdef CONFIG_MTD_UBI_DEBUG_DISABLE_BGT
extern unsigned int ubi_tst_flags;
#define DBG_DISABLE_BGT 1

#else
/*
#define DBG_DISABLE_BGT 0
 * Special testing flags.
#endif
 *
 * UBIFS_TST_DISABLE_BGT: disable the background thread
 * UBI_TST_EMULATE_BITFLIPS: emulate bit-flips
 * UBI_TST_EMULATE_WRITE_FAILURES: emulate write failures
 * UBI_TST_EMULATE_ERASE_FAILURES: emulate erase failures
 */
enum {
	UBI_TST_DISABLE_BGT            = 0x1,
	UBI_TST_EMULATE_BITFLIPS       = 0x2,
	UBI_TST_EMULATE_WRITE_FAILURES = 0x4,
	UBI_TST_EMULATE_ERASE_FAILURES = 0x8,
};

/**
 * ubi_dbg_is_bgt_disabled - if the background thread is disabled.
 *
 * Returns non-zero if the UBI background thread is disabled for testing
 * purposes.
 */
static inline int ubi_dbg_is_bgt_disabled(void)
{
	return ubi_tst_flags & UBI_TST_DISABLE_BGT;
}


#ifdef CONFIG_MTD_UBI_DEBUG_EMULATE_BITFLIPS
/**
/**
 * ubi_dbg_is_bitflip - if it is time to emulate a bit-flip.
 * ubi_dbg_is_bitflip - if it is time to emulate a bit-flip.
 *
 *
@@ -120,13 +151,11 @@ int ubi_dbg_check_write(struct ubi_device *ubi, const void *buf, int pnum,
 */
 */
static inline int ubi_dbg_is_bitflip(void)
static inline int ubi_dbg_is_bitflip(void)
{
{
	if (ubi_tst_flags & UBI_TST_EMULATE_BITFLIPS)
		return !(random32() % 200);
		return !(random32() % 200);
	return 0;
}
}
#else
#define ubi_dbg_is_bitflip() 0
#endif


#ifdef CONFIG_MTD_UBI_DEBUG_EMULATE_WRITE_FAILURES
/**
/**
 * ubi_dbg_is_write_failure - if it is time to emulate a write failure.
 * ubi_dbg_is_write_failure - if it is time to emulate a write failure.
 *
 *
@@ -135,13 +164,11 @@ static inline int ubi_dbg_is_bitflip(void)
 */
 */
static inline int ubi_dbg_is_write_failure(void)
static inline int ubi_dbg_is_write_failure(void)
{
{
	if (ubi_tst_flags & UBI_TST_EMULATE_WRITE_FAILURES)
		return !(random32() % 500);
		return !(random32() % 500);
	return 0;
}
}
#else
#define ubi_dbg_is_write_failure() 0
#endif


#ifdef CONFIG_MTD_UBI_DEBUG_EMULATE_ERASE_FAILURES
/**
/**
 * ubi_dbg_is_erase_failure - if its time to emulate an erase failure.
 * ubi_dbg_is_erase_failure - if its time to emulate an erase failure.
 *
 *
@@ -150,11 +177,10 @@ static inline int ubi_dbg_is_write_failure(void)
 */
 */
static inline int ubi_dbg_is_erase_failure(void)
static inline int ubi_dbg_is_erase_failure(void)
{
{
	if (ubi_tst_flags & UBI_TST_EMULATE_ERASE_FAILURES)
		return !(random32() % 400);
		return !(random32() % 400);
	return 0;
}
}
#else
#define ubi_dbg_is_erase_failure() 0
#endif


#else
#else


@@ -177,8 +203,7 @@ static inline int ubi_dbg_is_erase_failure(void)
#define ubi_dbg_dump_flash(ubi, pnum, offset, len) ({})
#define ubi_dbg_dump_flash(ubi, pnum, offset, len) ({})
#define ubi_dbg_print_hex_dump(l, ps, pt, r, g, b, len, a)  ({})
#define ubi_dbg_print_hex_dump(l, ps, pt, r, g, b, len, a)  ({})


#define UBI_IO_DEBUG               0
#define ubi_dbg_is_bgt_disabled()  0
#define DBG_DISABLE_BGT            0
#define ubi_dbg_is_bitflip()       0
#define ubi_dbg_is_bitflip()       0
#define ubi_dbg_is_write_failure() 0
#define ubi_dbg_is_write_failure() 0
#define ubi_dbg_is_erase_failure() 0
#define ubi_dbg_is_erase_failure() 0
Loading