exfat: reduce the size of exfat_entry_set_cache
authorYuezhang Mo <Yuezhang.Mo@sony.com>
Thu, 7 Apr 2022 07:55:56 +0000 (15:55 +0800)
committerNamjae Jeon <linkinjeon@kernel.org>
Mon, 12 Dec 2022 02:02:48 +0000 (11:02 +0900)
In normal, there are 19 directory entries at most for a file or
a directory.
  - A file directory entry
  - A stream extension directory entry
  - 1~17 file name directory entry

So the directory entries are in 3 sectors at most, it is enough
for struct exfat_entry_set_cache to pre-allocate 3 bh.

This commit changes the size of struct exfat_entry_set_cache as:

                   Before   After
32-bit system      88       32    bytes
64-bit system      168      48    bytes

Signed-off-by: Yuezhang Mo <Yuezhang.Mo@sony.com>
Reviewed-by: Andy Wu <Andy.Wu@sony.com>
Reviewed-by: Aoyama Wataru <wataru.aoyama@sony.com>
Reviewed-by: Sungjong Seo <sj1557.seo@samsung.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
fs/exfat/exfat_fs.h

index a8f8eee..af55018 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/fs.h>
 #include <linux/ratelimit.h>
 #include <linux/nls.h>
+#include <linux/blkdev.h>
 
 #define EXFAT_ROOT_INO         1
 
@@ -41,6 +42,14 @@ enum {
 #define ES_2_ENTRIES           2
 #define ES_ALL_ENTRIES         0
 
+#define ES_IDX_FILE            0
+#define ES_IDX_STREAM          1
+#define ES_IDX_FIRST_FILENAME  2
+#define EXFAT_FILENAME_ENTRY_NUM(name_len) \
+       DIV_ROUND_UP(name_len, EXFAT_FILE_NAME_LEN)
+#define ES_IDX_LAST_FILENAME(name_len) \
+       (ES_IDX_FIRST_FILENAME + EXFAT_FILENAME_ENTRY_NUM(name_len) - 1)
+
 #define DIR_DELETED            0xFFFF0321
 
 /* type values */
@@ -68,9 +77,6 @@ enum {
 #define MAX_NAME_LENGTH                255 /* max len of file name excluding NULL */
 #define MAX_VFSNAME_BUF_SIZE   ((MAX_NAME_LENGTH + 1) * MAX_CHARSET_SIZE)
 
-/* Enough size to hold 256 dentry (even 512 Byte sector) */
-#define DIR_CACHE_SIZE         (256*sizeof(struct exfat_dentry)/512+1)
-
 #define EXFAT_HINT_NONE                -1
 #define EXFAT_MIN_SUBDIR       2
 
@@ -125,6 +131,17 @@ enum {
 #define BITS_PER_BYTE_MASK     0x7
 #define IGNORED_BITS_REMAINED(clu, clu_base) ((1 << ((clu) - (clu_base))) - 1)
 
+#define ES_ENTRY_NUM(name_len) (ES_IDX_LAST_FILENAME(name_len) + 1)
+/* 19 entries = 1 file entry + 1 stream entry + 17 filename entries */
+#define ES_MAX_ENTRY_NUM       ES_ENTRY_NUM(MAX_NAME_LENGTH)
+
+/*
+ * 19 entries x 32 bytes/entry = 608 bytes.
+ * The 608 bytes are in 3 sectors at most (even 512 Byte sector).
+ */
+#define DIR_CACHE_SIZE         \
+       (DIV_ROUND_UP(EXFAT_DEN_TO_B(ES_MAX_ENTRY_NUM), SECTOR_SIZE) + 1)
+
 struct exfat_dentry_namebuf {
        char *lfn;
        int lfnbuf_len; /* usually MAX_UNINAME_BUF_SIZE */
@@ -166,11 +183,11 @@ struct exfat_hint {
 
 struct exfat_entry_set_cache {
        struct super_block *sb;
-       bool modified;
        unsigned int start_off;
        int num_bh;
        struct buffer_head *bh[DIR_CACHE_SIZE];
        unsigned int num_entries;
+       bool modified;
 };
 
 struct exfat_dir_entry {