ubifs: correct UBIFS_DFS_DIR_LEN macro definition and improve code clarity
authorZhaoLong Wang <wangzhaolong1@huawei.com>
Thu, 18 Apr 2024 07:07:04 +0000 (15:07 +0800)
committerRichard Weinberger <richard@nod.at>
Fri, 12 Jul 2024 19:52:24 +0000 (21:52 +0200)
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: ZhaoLong Wang <wangzhaolong1@huawei.com>
Reviewed-by: Zhihao Cheng <chengzhihao1@huawei.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
drivers/mtd/ubi/debug.c
drivers/mtd/ubi/ubi.h
fs/ubifs/debug.c
fs/ubifs/debug.h
fs/ubifs/sysfs.c
fs/ubifs/ubifs.h

index d57f52bd2ff3cd7a20b293b3993874a4826cffb2..9ec3b8b6a0aa8f18eeb3e4837cb50b68ee258e5d 100644 (file)
@@ -598,9 +598,9 @@ int ubi_debugfs_init_dev(struct ubi_device *ubi)
        if (!IS_ENABLED(CONFIG_DEBUG_FS))
                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);
-       if (n > UBI_DFS_DIR_LEN) {
+       if (n >= UBI_DFS_DIR_LEN) {
                /* The array size is too small */
                return -EINVAL;
        }
index 1aead55090d0a17c2aa0f4d4fb137c7976a27df7..1c9e874e8edeae982b3f97ee643090fc97c93886 100644 (file)
@@ -420,7 +420,7 @@ struct ubi_debug_info {
        unsigned int power_cut_min;
        unsigned int power_cut_max;
        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_chk_gen;
        struct dentry *dfs_chk_io;
index ac77ac1fd73e351863c0d7ab98f86c1f12a82b9f..d91cec93d9689a1d28f29d31e5869b0f6161e4d0 100644 (file)
@@ -2827,9 +2827,9 @@ void dbg_debugfs_init_fs(struct ubifs_info *c)
        const char *fname;
        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);
-       if (n > UBIFS_DFS_DIR_LEN) {
+       if (n >= UBIFS_DFS_DIR_LEN) {
                /* The array size is too small */
                return;
        }
index ed966108da806793f6f6991d9dff67d573709907..d425861e6b821f769ee904bd368455528937813a 100644 (file)
@@ -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"
- * + 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_LEN  (3 + 1 + 2*2 + 1)
+#define UBIFS_DFS_DIR_LEN  (3 + 1 + 2 + 3 + 1)
 
 /**
  * ubifs_debug_info - per-FS debugging information.
@@ -103,7 +104,7 @@ struct ubifs_debug_info {
        unsigned int chk_fs: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_dump_lprops;
        struct dentry *dfs_dump_budg;
index 1c958148bb877f7ba6d9c562945798b363d6bd55..aae32222f11b37823ae424158881c651e52d6a0a 100644 (file)
@@ -91,17 +91,17 @@ static struct kset ubifs_kset = {
 int ubifs_sysfs_register(struct ubifs_info *c)
 {
        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);
        if (!c->stats) {
                ret = -ENOMEM;
                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);
 
-       if (n > UBIFS_DFS_DIR_LEN) {
+       if (n >= UBIFS_DFS_DIR_LEN) {
                /* The array size is too small */
                ret = -EINVAL;
                goto out_free;
index b2c6554fa85722a9ffc7f50b49c046003bd878f1..d69a5a42d6936c32665496ab0a40a47c22365a5b 100644 (file)
 #define UBIFS_HMAC_ARR_SZ 0
 #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.
  */