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

Commit ae380ce0 authored by Artem Bityutskiy's avatar Artem Bityutskiy Committed by Artem Bityutskiy
Browse files

UBIFS: lessen the size of debugging info data structure



This patch lessens the 'struct ubifs_debug_info' size by 90 bytes by
allocating less bytes for the debugfs root directory name. It introduces macros
for the name patter an length instead of hard-coding 100 bytes. It also makes
UBIFS use 'snprintf()' and teaches it to gracefully catch situations when the
name array is too short.

Additionally, this patch makes 2 unrelated changes - I just thought they do not
deserve separate commits: simplifies 'ubifs_assert()' for non-debugging case
and makes 'dbg_debugfs_init()' properly verify debugfs return code which may be
an error code or NULL, so we should you 'IS_ERR_OR_NULL()' instead of
'IS_ERR()'.

Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
parent 549c999a
Loading
Loading
Loading
Loading
+13 −5
Original line number Original line Diff line number Diff line
@@ -2815,8 +2815,8 @@ static struct dentry *dfs_rootdir;
int dbg_debugfs_init(void)
int dbg_debugfs_init(void)
{
{
	dfs_rootdir = debugfs_create_dir("ubifs", NULL);
	dfs_rootdir = debugfs_create_dir("ubifs", NULL);
	if (IS_ERR(dfs_rootdir)) {
	if (IS_ERR_OR_NULL(dfs_rootdir)) {
		int err = PTR_ERR(dfs_rootdir);
		int err = dfs_rootdir ? PTR_ERR(dfs_rootdir) : -ENODEV;
		ubifs_err("cannot create \"ubifs\" debugfs directory, "
		ubifs_err("cannot create \"ubifs\" debugfs directory, "
			  "error %d\n", err);
			  "error %d\n", err);
		return err;
		return err;
@@ -2880,12 +2880,20 @@ static const struct file_operations dfs_fops = {
 */
 */
int dbg_debugfs_init_fs(struct ubifs_info *c)
int dbg_debugfs_init_fs(struct ubifs_info *c)
{
{
	int err;
	int err, n;
	const char *fname;
	const char *fname;
	struct dentry *dent;
	struct dentry *dent;
	struct ubifs_debug_info *d = c->dbg;
	struct ubifs_debug_info *d = c->dbg;


	sprintf(d->dfs_dir_name, "ubi%d_%d", c->vi.ubi_num, c->vi.vol_id);
	n = snprintf(d->dfs_dir_name, UBIFS_DFS_DIR_LEN + 1, UBIFS_DFS_DIR_NAME,
		     c->vi.ubi_num, c->vi.vol_id);
	if (n == UBIFS_DFS_DIR_LEN) {
		/* The array size is too small */
		fname = UBIFS_DFS_DIR_NAME;
		dent = ERR_PTR(-EINVAL);
		goto out;
	}

	fname = d->dfs_dir_name;
	fname = d->dfs_dir_name;
	dent = debugfs_create_dir(fname, dfs_rootdir);
	dent = debugfs_create_dir(fname, dfs_rootdir);
	if (IS_ERR_OR_NULL(dent))
	if (IS_ERR_OR_NULL(dent))
@@ -2916,7 +2924,7 @@ int dbg_debugfs_init_fs(struct ubifs_info *c)
	debugfs_remove_recursive(d->dfs_dir);
	debugfs_remove_recursive(d->dfs_dir);
out:
out:
	err = dent ? PTR_ERR(dent) : -ENODEV;
	err = dent ? PTR_ERR(dent) : -ENODEV;
	ubifs_err("cannot create \"%s\" debugfs directory, error %d\n",
	ubifs_err("cannot create \"%s\" debugfs filr or directory, error %d\n",
		  fname, err);
		  fname, err);
	return err;
	return err;
}
}
+9 −2
Original line number Original line Diff line number Diff line
@@ -33,6 +33,13 @@ typedef int (*dbg_znode_callback)(struct ubifs_info *c,


#include <linux/random.h>
#include <linux/random.h>


/*
 * The UBIFS debugfs directory name pattern and maximum name length (3 for "ubi"
 * + 1 for "_" and plus 2x2 for 2 UBI numbers and 1 for the trailing zero byte.
 */
#define UBIFS_DFS_DIR_NAME "ubi%d_%d"
#define UBIFS_DFS_DIR_LEN  (3 + 1 + 2*2 + 1)

/**
/**
 * ubifs_debug_info - per-FS debugging information.
 * ubifs_debug_info - per-FS debugging information.
 * @old_zroot: old index root - used by 'dbg_check_old_index()'
 * @old_zroot: old index root - used by 'dbg_check_old_index()'
@@ -84,7 +91,7 @@ struct ubifs_debug_info {
	long long saved_free;
	long long saved_free;
	int saved_idx_gc_cnt;
	int saved_idx_gc_cnt;


	char dfs_dir_name[100];
	char dfs_dir_name[UBIFS_DFS_DIR_LEN + 1];
	struct dentry *dfs_dir;
	struct dentry *dfs_dir;
	struct dentry *dfs_dump_lprops;
	struct dentry *dfs_dump_lprops;
	struct dentry *dfs_dump_budg;
	struct dentry *dfs_dump_budg;
@@ -313,7 +320,7 @@ void dbg_debugfs_exit_fs(struct ubifs_info *c);


/* Use "if (0)" to make compiler check arguments even if debugging is off */
/* Use "if (0)" to make compiler check arguments even if debugging is off */
#define ubifs_assert(expr)  do {                                               \
#define ubifs_assert(expr)  do {                                               \
	if (0 && (expr))                                                       \
	if (0)                                                                 \
		printk(KERN_CRIT "UBIFS assert failed in %s at %u (pid %d)\n", \
		printk(KERN_CRIT "UBIFS assert failed in %s at %u (pid %d)\n", \
		       __func__, __LINE__, current->pid);                      \
		       __func__, __LINE__, current->pid);                      \
} while (0)
} while (0)