|
9 | 9 | #include <linux/fs.h>
|
10 | 10 | #include <linux/ratelimit.h>
|
11 | 11 | #include <linux/nls.h>
|
| 12 | +#include <linux/blkdev.h> |
12 | 13 |
|
13 | 14 | #define EXFAT_ROOT_INO 1
|
14 | 15 |
|
@@ -41,6 +42,14 @@ enum {
|
41 | 42 | #define ES_2_ENTRIES 2
|
42 | 43 | #define ES_ALL_ENTRIES 0
|
43 | 44 |
|
| 45 | +#define ES_IDX_FILE 0 |
| 46 | +#define ES_IDX_STREAM 1 |
| 47 | +#define ES_IDX_FIRST_FILENAME 2 |
| 48 | +#define EXFAT_FILENAME_ENTRY_NUM(name_len) \ |
| 49 | + DIV_ROUND_UP(name_len, EXFAT_FILE_NAME_LEN) |
| 50 | +#define ES_IDX_LAST_FILENAME(name_len) \ |
| 51 | + (ES_IDX_FIRST_FILENAME + EXFAT_FILENAME_ENTRY_NUM(name_len) - 1) |
| 52 | + |
44 | 53 | #define DIR_DELETED 0xFFFF0321
|
45 | 54 |
|
46 | 55 | /* type values */
|
|
68 | 77 | #define MAX_NAME_LENGTH 255 /* max len of file name excluding NULL */
|
69 | 78 | #define MAX_VFSNAME_BUF_SIZE ((MAX_NAME_LENGTH + 1) * MAX_CHARSET_SIZE)
|
70 | 79 |
|
71 |
| -/* Enough size to hold 256 dentry (even 512 Byte sector) */ |
72 |
| -#define DIR_CACHE_SIZE (256*sizeof(struct exfat_dentry)/512+1) |
73 |
| - |
74 | 80 | #define EXFAT_HINT_NONE -1
|
75 | 81 | #define EXFAT_MIN_SUBDIR 2
|
76 | 82 |
|
@@ -125,6 +131,17 @@ enum {
|
125 | 131 | #define BITS_PER_BYTE_MASK 0x7
|
126 | 132 | #define IGNORED_BITS_REMAINED(clu, clu_base) ((1 << ((clu) - (clu_base))) - 1)
|
127 | 133 |
|
| 134 | +#define ES_ENTRY_NUM(name_len) (ES_IDX_LAST_FILENAME(name_len) + 1) |
| 135 | +/* 19 entries = 1 file entry + 1 stream entry + 17 filename entries */ |
| 136 | +#define ES_MAX_ENTRY_NUM ES_ENTRY_NUM(MAX_NAME_LENGTH) |
| 137 | + |
| 138 | +/* |
| 139 | + * 19 entries x 32 bytes/entry = 608 bytes. |
| 140 | + * The 608 bytes are in 3 sectors at most (even 512 Byte sector). |
| 141 | + */ |
| 142 | +#define DIR_CACHE_SIZE \ |
| 143 | + (DIV_ROUND_UP(EXFAT_DEN_TO_B(ES_MAX_ENTRY_NUM), SECTOR_SIZE) + 1) |
| 144 | + |
128 | 145 | struct exfat_dentry_namebuf {
|
129 | 146 | char *lfn;
|
130 | 147 | int lfnbuf_len; /* usually MAX_UNINAME_BUF_SIZE */
|
@@ -166,11 +183,11 @@ struct exfat_hint {
|
166 | 183 |
|
167 | 184 | struct exfat_entry_set_cache {
|
168 | 185 | struct super_block *sb;
|
169 |
| - bool modified; |
170 | 186 | unsigned int start_off;
|
171 | 187 | int num_bh;
|
172 | 188 | struct buffer_head *bh[DIR_CACHE_SIZE];
|
173 | 189 | unsigned int num_entries;
|
| 190 | + bool modified; |
174 | 191 | };
|
175 | 192 |
|
176 | 193 | struct exfat_dir_entry {
|
|
0 commit comments