Commit 7037c96d authored by ZhaoLong Wang's avatar ZhaoLong Wang Committed by Richard Weinberger

ubifs: correct UBIFS_DFS_DIR_LEN macro definition and improve code clarity

The UBIFS_DFS_DIR_LEN macro, which defines the maximum length of the UBIFS
debugfs directory name, has an incorrect formula and misleading comments.
The current formula is (3 + 1 + 2*2 + 1), which assumes that both UBI device
number and volume ID are limited to 2 characters. However, UBI device number
ranges from 0 to 31 (2 characters), and volume ID ranges from 0 to 127 (up
to 3 characters).

Although the current code works due to the cancellation of mathematical
errors (9 + 1 = 10, which matches the correct UBIFS_DFS_DIR_LEN value), it
can lead to confusion and potential issues in the future.

This patch aims to improve the code clarity and maintainability by making
the following changes:

1. Corrects the UBIFS_DFS_DIR_LEN macro definition to (3 + 1 + 2 + 3 + 1),
   accommodating the maximum lengths of both UBI device number and volume ID,
   plus the separators and null terminator.
2. Updates the snprintf calls to use UBIFS_DFS_DIR_LEN instead of
   UBIFS_DFS_DIR_LEN + 1, removing the unnecessary +1.
3. Modifies the error checks to compare against UBIFS_DFS_DIR_LEN using >=
   instead of >, aligning with the corrected macro definition.
4. Removes the redundant +1 in the dfs_dir_name array definitions in ubi.h
   and debug.h.

While these changes do not affect the runtime behavior, they make the code
more readable, maintainable, and less prone to future errors.

v2->v3:

 - Removes the duplicated UBIFS_DFS_DIR_LEN and UBIFS_DFS_DIR_NAME macro
   definitions in ubifs.h, as they are already defined in debug.h.
Signed-off-by: default avatarZhaoLong Wang <wangzhaolong1@huawei.com>
Reviewed-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent 72f3d3da
...@@ -598,9 +598,9 @@ int ubi_debugfs_init_dev(struct ubi_device *ubi) ...@@ -598,9 +598,9 @@ int ubi_debugfs_init_dev(struct ubi_device *ubi)
if (!IS_ENABLED(CONFIG_DEBUG_FS)) if (!IS_ENABLED(CONFIG_DEBUG_FS))
return 0; return 0;
n = snprintf(d->dfs_dir_name, UBI_DFS_DIR_LEN + 1, UBI_DFS_DIR_NAME, n = snprintf(d->dfs_dir_name, UBI_DFS_DIR_LEN, UBI_DFS_DIR_NAME,
ubi->ubi_num); ubi->ubi_num);
if (n > UBI_DFS_DIR_LEN) { if (n >= UBI_DFS_DIR_LEN) {
/* The array size is too small */ /* The array size is too small */
return -EINVAL; return -EINVAL;
} }
......
...@@ -420,7 +420,7 @@ struct ubi_debug_info { ...@@ -420,7 +420,7 @@ struct ubi_debug_info {
unsigned int power_cut_min; unsigned int power_cut_min;
unsigned int power_cut_max; unsigned int power_cut_max;
unsigned int emulate_failures; unsigned int emulate_failures;
char dfs_dir_name[UBI_DFS_DIR_LEN + 1]; char dfs_dir_name[UBI_DFS_DIR_LEN];
struct dentry *dfs_dir; struct dentry *dfs_dir;
struct dentry *dfs_chk_gen; struct dentry *dfs_chk_gen;
struct dentry *dfs_chk_io; struct dentry *dfs_chk_io;
......
...@@ -2827,9 +2827,9 @@ void dbg_debugfs_init_fs(struct ubifs_info *c) ...@@ -2827,9 +2827,9 @@ void dbg_debugfs_init_fs(struct ubifs_info *c)
const char *fname; const char *fname;
struct ubifs_debug_info *d = c->dbg; struct ubifs_debug_info *d = c->dbg;
n = snprintf(d->dfs_dir_name, UBIFS_DFS_DIR_LEN + 1, UBIFS_DFS_DIR_NAME, n = snprintf(d->dfs_dir_name, UBIFS_DFS_DIR_LEN, UBIFS_DFS_DIR_NAME,
c->vi.ubi_num, c->vi.vol_id); c->vi.ubi_num, c->vi.vol_id);
if (n > UBIFS_DFS_DIR_LEN) { if (n >= UBIFS_DFS_DIR_LEN) {
/* The array size is too small */ /* The array size is too small */
return; return;
} }
......
...@@ -19,10 +19,11 @@ typedef int (*dbg_znode_callback)(struct ubifs_info *c, ...@@ -19,10 +19,11 @@ typedef int (*dbg_znode_callback)(struct ubifs_info *c,
/* /*
* The UBIFS debugfs directory name pattern and maximum name length (3 for "ubi" * 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. * + 1 for "_" and 2 for UBI device numbers and 3 for volume number and 1 for
* the trailing zero byte.
*/ */
#define UBIFS_DFS_DIR_NAME "ubi%d_%d" #define UBIFS_DFS_DIR_NAME "ubi%d_%d"
#define UBIFS_DFS_DIR_LEN (3 + 1 + 2*2 + 1) #define UBIFS_DFS_DIR_LEN (3 + 1 + 2 + 3 + 1)
/** /**
* ubifs_debug_info - per-FS debugging information. * ubifs_debug_info - per-FS debugging information.
...@@ -103,7 +104,7 @@ struct ubifs_debug_info { ...@@ -103,7 +104,7 @@ struct ubifs_debug_info {
unsigned int chk_fs:1; unsigned int chk_fs:1;
unsigned int tst_rcvry:1; unsigned int tst_rcvry:1;
char dfs_dir_name[UBIFS_DFS_DIR_LEN + 1]; char dfs_dir_name[UBIFS_DFS_DIR_LEN];
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;
......
...@@ -91,17 +91,17 @@ static struct kset ubifs_kset = { ...@@ -91,17 +91,17 @@ static struct kset ubifs_kset = {
int ubifs_sysfs_register(struct ubifs_info *c) int ubifs_sysfs_register(struct ubifs_info *c)
{ {
int ret, n; int ret, n;
char dfs_dir_name[UBIFS_DFS_DIR_LEN+1]; char dfs_dir_name[UBIFS_DFS_DIR_LEN];
c->stats = kzalloc(sizeof(struct ubifs_stats_info), GFP_KERNEL); c->stats = kzalloc(sizeof(struct ubifs_stats_info), GFP_KERNEL);
if (!c->stats) { if (!c->stats) {
ret = -ENOMEM; ret = -ENOMEM;
goto out_last; goto out_last;
} }
n = snprintf(dfs_dir_name, UBIFS_DFS_DIR_LEN + 1, UBIFS_DFS_DIR_NAME, n = snprintf(dfs_dir_name, UBIFS_DFS_DIR_LEN, UBIFS_DFS_DIR_NAME,
c->vi.ubi_num, c->vi.vol_id); c->vi.ubi_num, c->vi.vol_id);
if (n > UBIFS_DFS_DIR_LEN) { if (n >= UBIFS_DFS_DIR_LEN) {
/* The array size is too small */ /* The array size is too small */
ret = -EINVAL; ret = -EINVAL;
goto out_free; goto out_free;
......
...@@ -157,13 +157,6 @@ ...@@ -157,13 +157,6 @@
#define UBIFS_HMAC_ARR_SZ 0 #define UBIFS_HMAC_ARR_SZ 0
#endif #endif
/*
* The UBIFS sysfs 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)
/* /*
* Lockdep classes for UBIFS inode @ui_mutex. * Lockdep classes for UBIFS inode @ui_mutex.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment