This source file includes following definitions.
- __set_sb_dirty
- exfat_bitmap_test
- exfat_bitmap_set
- exfat_bitmap_clear
- fs_set_vol_flags
- fs_error
- clear_cluster
- fat_alloc_cluster
- exfat_alloc_cluster
- fat_free_cluster
- exfat_free_cluster
- find_last_cluster
- count_num_clusters
- fat_count_used_clusters
- exfat_count_used_clusters
- exfat_chain_cont_cluster
- load_alloc_bitmap
- free_alloc_bitmap
- set_alloc_bitmap
- clr_alloc_bitmap
- test_alloc_bitmap
- sync_alloc_bitmap
- __load_upcase_table
- __load_default_upcase_table
- load_upcase_table
- free_upcase_table
- fat_get_entry_type
- exfat_get_entry_type
- fat_set_entry_type
- exfat_set_entry_type
- fat_get_entry_attr
- exfat_get_entry_attr
- fat_set_entry_attr
- exfat_set_entry_attr
- fat_get_entry_flag
- exfat_get_entry_flag
- fat_set_entry_flag
- exfat_set_entry_flag
- fat_get_entry_clu0
- exfat_get_entry_clu0
- fat_set_entry_clu0
- exfat_set_entry_clu0
- fat_get_entry_size
- exfat_get_entry_size
- fat_set_entry_size
- exfat_set_entry_size
- fat_get_entry_time
- exfat_get_entry_time
- fat_set_entry_time
- exfat_set_entry_time
- fat_init_dir_entry
- exfat_init_dir_entry
- fat_init_ext_entry
- exfat_init_ext_entry
- init_dos_entry
- init_ext_entry
- init_file_entry
- init_strm_entry
- init_name_entry
- fat_delete_dir_entry
- exfat_delete_dir_entry
- update_dir_checksum
- update_dir_checksum_with_entry_set
- _walk_fat_chain
- find_location
- get_entry_with_sector
- get_entry_in_dir
- get_entry_set_in_dir
- release_entry_set
- __write_partial_entries_in_entry_set
- write_whole_entry_set
- write_partial_entries_in_entry_set
- search_deleted_or_unused_entry
- find_empty_entry
- fat_find_dir_entry
- exfat_find_dir_entry
- fat_count_ext_entries
- exfat_count_ext_entries
- count_dos_name_entries
- is_dir_empty
- get_num_entries_and_dos_name
- get_uni_name_from_dos_entry
- fat_get_uni_name_from_ext_entry
- exfat_get_uni_name_from_ext_entry
- extract_uni_name_from_ext_entry
- extract_uni_name_from_name_entry
- fat_generate_dos_name
- fat_attach_count_to_dos_name
- fat_calc_num_entries
- exfat_calc_num_entries
- calc_checksum_1byte
- calc_checksum_2byte
- calc_checksum_4byte
- resolve_path
- fat16_mount
- fat32_mount
- exfat_mount
- create_dir
- create_file
- remove_file
- exfat_rename_file
- move_file
- sector_read
- sector_write
- multi_sector_read
- multi_sector_write
1
2
3
4
5
6 #include <linux/types.h>
7 #include <linux/buffer_head.h>
8 #include <linux/fs.h>
9 #include <linux/mutex.h>
10 #include <linux/blkdev.h>
11 #include <linux/slab.h>
12 #include "exfat.h"
13
14 static void __set_sb_dirty(struct super_block *sb)
15 {
16 struct exfat_sb_info *sbi = EXFAT_SB(sb);
17
18 sbi->s_dirt = 1;
19 }
20
21 static u8 name_buf[MAX_PATH_LENGTH * MAX_CHARSET_SIZE];
22
23 static char *reserved_names[] = {
24 "AUX ", "CON ", "NUL ", "PRN ",
25 "COM1 ", "COM2 ", "COM3 ", "COM4 ",
26 "COM5 ", "COM6 ", "COM7 ", "COM8 ", "COM9 ",
27 "LPT1 ", "LPT2 ", "LPT3 ", "LPT4 ",
28 "LPT5 ", "LPT6 ", "LPT7 ", "LPT8 ", "LPT9 ",
29 NULL
30 };
31
32 static u8 free_bit[] = {
33 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2,
34 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3,
35 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,
36 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,
37 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2,
38 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3,
39 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,
40 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5,
41 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2,
42 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3,
43 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,
44 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,
45 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
46 };
47
48 static u8 used_bit[] = {
49 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3,
50 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4,
51 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5,
52 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
53 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4,
54 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6,
55 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,
56 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
57 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5,
58 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5,
59 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6,
60 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
61 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
62 };
63
64 #define BITMAP_LOC(v) ((v) >> 3)
65 #define BITMAP_SHIFT(v) ((v) & 0x07)
66
67 static inline s32 exfat_bitmap_test(u8 *bitmap, int i)
68 {
69 u8 data;
70
71 data = bitmap[BITMAP_LOC(i)];
72 if ((data >> BITMAP_SHIFT(i)) & 0x01)
73 return 1;
74 return 0;
75 }
76
77 static inline void exfat_bitmap_set(u8 *bitmap, int i)
78 {
79 bitmap[BITMAP_LOC(i)] |= (0x01 << BITMAP_SHIFT(i));
80 }
81
82 static inline void exfat_bitmap_clear(u8 *bitmap, int i)
83 {
84 bitmap[BITMAP_LOC(i)] &= ~(0x01 << BITMAP_SHIFT(i));
85 }
86
87
88
89
90
91 void fs_set_vol_flags(struct super_block *sb, u32 new_flag)
92 {
93 struct pbr_sector_t *p_pbr;
94 struct bpbex_t *p_bpb;
95 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
96
97 if (p_fs->vol_flag == new_flag)
98 return;
99
100 p_fs->vol_flag = new_flag;
101
102 if (p_fs->vol_type == EXFAT) {
103 if (!p_fs->pbr_bh) {
104 if (sector_read(sb, p_fs->PBR_sector,
105 &p_fs->pbr_bh, 1) != FFS_SUCCESS)
106 return;
107 }
108
109 p_pbr = (struct pbr_sector_t *)p_fs->pbr_bh->b_data;
110 p_bpb = (struct bpbex_t *)p_pbr->bpb;
111 SET16(p_bpb->vol_flags, (u16)new_flag);
112
113
114
115
116 if ((new_flag == VOL_DIRTY) && (!buffer_dirty(p_fs->pbr_bh)))
117 sector_write(sb, p_fs->PBR_sector, p_fs->pbr_bh, 1);
118 else
119 sector_write(sb, p_fs->PBR_sector, p_fs->pbr_bh, 0);
120 }
121 }
122
123 void fs_error(struct super_block *sb)
124 {
125 struct exfat_mount_options *opts = &EXFAT_SB(sb)->options;
126
127 if (opts->errors == EXFAT_ERRORS_PANIC) {
128 panic("[EXFAT] Filesystem panic from previous error\n");
129 } else if ((opts->errors == EXFAT_ERRORS_RO) && !sb_rdonly(sb)) {
130 sb->s_flags |= SB_RDONLY;
131 pr_err("[EXFAT] Filesystem has been set read-only\n");
132 }
133 }
134
135
136
137
138
139 s32 clear_cluster(struct super_block *sb, u32 clu)
140 {
141 sector_t s, n;
142 s32 ret = FFS_SUCCESS;
143 struct buffer_head *tmp_bh = NULL;
144 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
145 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
146
147 if (clu == CLUSTER_32(0)) {
148 s = p_fs->root_start_sector;
149 n = p_fs->data_start_sector;
150 } else {
151 s = START_SECTOR(clu);
152 n = s + p_fs->sectors_per_clu;
153 }
154
155 for (; s < n; s++) {
156 ret = sector_read(sb, s, &tmp_bh, 0);
157 if (ret != FFS_SUCCESS)
158 return ret;
159
160 memset((char *)tmp_bh->b_data, 0x0, p_bd->sector_size);
161 ret = sector_write(sb, s, tmp_bh, 0);
162 if (ret != FFS_SUCCESS)
163 break;
164 }
165
166 brelse(tmp_bh);
167 return ret;
168 }
169
170 s32 fat_alloc_cluster(struct super_block *sb, s32 num_alloc,
171 struct chain_t *p_chain)
172 {
173 int i, num_clusters = 0;
174 u32 new_clu, last_clu = CLUSTER_32(~0), read_clu;
175 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
176
177 new_clu = p_chain->dir;
178 if (new_clu == CLUSTER_32(~0))
179 new_clu = p_fs->clu_srch_ptr;
180 else if (new_clu >= p_fs->num_clusters)
181 new_clu = 2;
182
183 __set_sb_dirty(sb);
184
185 p_chain->dir = CLUSTER_32(~0);
186
187 for (i = 2; i < p_fs->num_clusters; i++) {
188 if (FAT_read(sb, new_clu, &read_clu) != 0)
189 return -1;
190
191 if (read_clu == CLUSTER_32(0)) {
192 if (FAT_write(sb, new_clu, CLUSTER_32(~0)) < 0)
193 return -1;
194 num_clusters++;
195
196 if (p_chain->dir == CLUSTER_32(~0)) {
197 p_chain->dir = new_clu;
198 } else {
199 if (FAT_write(sb, last_clu, new_clu) < 0)
200 return -1;
201 }
202
203 last_clu = new_clu;
204
205 if ((--num_alloc) == 0) {
206 p_fs->clu_srch_ptr = new_clu;
207 if (p_fs->used_clusters != UINT_MAX)
208 p_fs->used_clusters += num_clusters;
209
210 return num_clusters;
211 }
212 }
213 if ((++new_clu) >= p_fs->num_clusters)
214 new_clu = 2;
215 }
216
217 p_fs->clu_srch_ptr = new_clu;
218 if (p_fs->used_clusters != UINT_MAX)
219 p_fs->used_clusters += num_clusters;
220
221 return num_clusters;
222 }
223
224 s32 exfat_alloc_cluster(struct super_block *sb, s32 num_alloc,
225 struct chain_t *p_chain)
226 {
227 s32 num_clusters = 0;
228 u32 hint_clu, new_clu, last_clu = CLUSTER_32(~0);
229 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
230
231 hint_clu = p_chain->dir;
232 if (hint_clu == CLUSTER_32(~0)) {
233 hint_clu = test_alloc_bitmap(sb, p_fs->clu_srch_ptr - 2);
234 if (hint_clu == CLUSTER_32(~0))
235 return 0;
236 } else if (hint_clu >= p_fs->num_clusters) {
237 hint_clu = 2;
238 p_chain->flags = 0x01;
239 }
240
241 __set_sb_dirty(sb);
242
243 p_chain->dir = CLUSTER_32(~0);
244
245 while ((new_clu = test_alloc_bitmap(sb, hint_clu - 2)) != CLUSTER_32(~0)) {
246 if (new_clu != hint_clu) {
247 if (p_chain->flags == 0x03) {
248 exfat_chain_cont_cluster(sb, p_chain->dir,
249 num_clusters);
250 p_chain->flags = 0x01;
251 }
252 }
253
254 if (set_alloc_bitmap(sb, new_clu - 2) != FFS_SUCCESS)
255 return -1;
256
257 num_clusters++;
258
259 if (p_chain->flags == 0x01) {
260 if (FAT_write(sb, new_clu, CLUSTER_32(~0)) < 0)
261 return -1;
262 }
263
264 if (p_chain->dir == CLUSTER_32(~0)) {
265 p_chain->dir = new_clu;
266 } else {
267 if (p_chain->flags == 0x01) {
268 if (FAT_write(sb, last_clu, new_clu) < 0)
269 return -1;
270 }
271 }
272 last_clu = new_clu;
273
274 if ((--num_alloc) == 0) {
275 p_fs->clu_srch_ptr = hint_clu;
276 if (p_fs->used_clusters != UINT_MAX)
277 p_fs->used_clusters += num_clusters;
278
279 p_chain->size += num_clusters;
280 return num_clusters;
281 }
282
283 hint_clu = new_clu + 1;
284 if (hint_clu >= p_fs->num_clusters) {
285 hint_clu = 2;
286
287 if (p_chain->flags == 0x03) {
288 exfat_chain_cont_cluster(sb, p_chain->dir,
289 num_clusters);
290 p_chain->flags = 0x01;
291 }
292 }
293 }
294
295 p_fs->clu_srch_ptr = hint_clu;
296 if (p_fs->used_clusters != UINT_MAX)
297 p_fs->used_clusters += num_clusters;
298
299 p_chain->size += num_clusters;
300 return num_clusters;
301 }
302
303 void fat_free_cluster(struct super_block *sb, struct chain_t *p_chain,
304 s32 do_relse)
305 {
306 s32 num_clusters = 0;
307 u32 clu, prev;
308 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
309 int i;
310 sector_t sector;
311
312 if ((p_chain->dir == CLUSTER_32(0)) || (p_chain->dir == CLUSTER_32(~0)))
313 return;
314 __set_sb_dirty(sb);
315 clu = p_chain->dir;
316
317 if (p_chain->size <= 0)
318 return;
319
320 do {
321 if (p_fs->dev_ejected)
322 break;
323
324 if (do_relse) {
325 sector = START_SECTOR(clu);
326 for (i = 0; i < p_fs->sectors_per_clu; i++)
327 buf_release(sb, sector + i);
328 }
329
330 prev = clu;
331 if (FAT_read(sb, clu, &clu) == -1)
332 break;
333
334 if (FAT_write(sb, prev, CLUSTER_32(0)) < 0)
335 break;
336 num_clusters++;
337
338 } while (clu != CLUSTER_32(~0));
339
340 if (p_fs->used_clusters != UINT_MAX)
341 p_fs->used_clusters -= num_clusters;
342 }
343
344 void exfat_free_cluster(struct super_block *sb, struct chain_t *p_chain,
345 s32 do_relse)
346 {
347 s32 num_clusters = 0;
348 u32 clu;
349 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
350 int i;
351 sector_t sector;
352
353 if ((p_chain->dir == CLUSTER_32(0)) || (p_chain->dir == CLUSTER_32(~0)))
354 return;
355
356 if (p_chain->size <= 0) {
357 pr_err("[EXFAT] free_cluster : skip free-req clu:%u, because of zero-size truncation\n",
358 p_chain->dir);
359 return;
360 }
361
362 __set_sb_dirty(sb);
363 clu = p_chain->dir;
364
365 if (p_chain->flags == 0x03) {
366 do {
367 if (do_relse) {
368 sector = START_SECTOR(clu);
369 for (i = 0; i < p_fs->sectors_per_clu; i++)
370 buf_release(sb, sector + i);
371 }
372
373 if (clr_alloc_bitmap(sb, clu - 2) != FFS_SUCCESS)
374 break;
375 clu++;
376
377 num_clusters++;
378 } while (num_clusters < p_chain->size);
379 } else {
380 do {
381 if (p_fs->dev_ejected)
382 break;
383
384 if (do_relse) {
385 sector = START_SECTOR(clu);
386 for (i = 0; i < p_fs->sectors_per_clu; i++)
387 buf_release(sb, sector + i);
388 }
389
390 if (clr_alloc_bitmap(sb, clu - 2) != FFS_SUCCESS)
391 break;
392
393 if (FAT_read(sb, clu, &clu) == -1)
394 break;
395 num_clusters++;
396 } while ((clu != CLUSTER_32(0)) && (clu != CLUSTER_32(~0)));
397 }
398
399 if (p_fs->used_clusters != UINT_MAX)
400 p_fs->used_clusters -= num_clusters;
401 }
402
403 u32 find_last_cluster(struct super_block *sb, struct chain_t *p_chain)
404 {
405 u32 clu, next;
406 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
407
408 clu = p_chain->dir;
409
410 if (p_chain->flags == 0x03) {
411 clu += p_chain->size - 1;
412 } else {
413 while ((FAT_read(sb, clu, &next) == 0) &&
414 (next != CLUSTER_32(~0))) {
415 if (p_fs->dev_ejected)
416 break;
417 clu = next;
418 }
419 }
420
421 return clu;
422 }
423
424 s32 count_num_clusters(struct super_block *sb, struct chain_t *p_chain)
425 {
426 int i, count = 0;
427 u32 clu;
428 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
429
430 if ((p_chain->dir == CLUSTER_32(0)) || (p_chain->dir == CLUSTER_32(~0)))
431 return 0;
432
433 clu = p_chain->dir;
434
435 if (p_chain->flags == 0x03) {
436 count = p_chain->size;
437 } else {
438 for (i = 2; i < p_fs->num_clusters; i++) {
439 count++;
440 if (FAT_read(sb, clu, &clu) != 0)
441 return 0;
442 if (clu == CLUSTER_32(~0))
443 break;
444 }
445 }
446
447 return count;
448 }
449
450 s32 fat_count_used_clusters(struct super_block *sb)
451 {
452 int i, count = 0;
453 u32 clu;
454 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
455
456 for (i = 2; i < p_fs->num_clusters; i++) {
457 if (FAT_read(sb, i, &clu) != 0)
458 break;
459 if (clu != CLUSTER_32(0))
460 count++;
461 }
462
463 return count;
464 }
465
466 s32 exfat_count_used_clusters(struct super_block *sb)
467 {
468 int i, map_i, map_b, count = 0;
469 u8 k;
470 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
471 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
472
473 map_i = map_b = 0;
474
475 for (i = 2; i < p_fs->num_clusters; i += 8) {
476 k = *(((u8 *)p_fs->vol_amap[map_i]->b_data) + map_b);
477 count += used_bit[k];
478
479 if ((++map_b) >= p_bd->sector_size) {
480 map_i++;
481 map_b = 0;
482 }
483 }
484
485 return count;
486 }
487
488 void exfat_chain_cont_cluster(struct super_block *sb, u32 chain, s32 len)
489 {
490 if (len == 0)
491 return;
492
493 while (len > 1) {
494 if (FAT_write(sb, chain, chain + 1) < 0)
495 break;
496 chain++;
497 len--;
498 }
499 FAT_write(sb, chain, CLUSTER_32(~0));
500 }
501
502
503
504
505
506 s32 load_alloc_bitmap(struct super_block *sb)
507 {
508 int i, j, ret;
509 u32 map_size;
510 u32 type;
511 sector_t sector;
512 struct chain_t clu;
513 struct bmap_dentry_t *ep;
514 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
515 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
516
517 clu.dir = p_fs->root_dir;
518 clu.flags = 0x01;
519
520 while (clu.dir != CLUSTER_32(~0)) {
521 if (p_fs->dev_ejected)
522 break;
523
524 for (i = 0; i < p_fs->dentries_per_clu; i++) {
525 ep = (struct bmap_dentry_t *)get_entry_in_dir(sb, &clu,
526 i, NULL);
527 if (!ep)
528 return FFS_MEDIAERR;
529
530 type = p_fs->fs_func->get_entry_type((struct dentry_t *)ep);
531
532 if (type == TYPE_UNUSED)
533 break;
534 if (type != TYPE_BITMAP)
535 continue;
536
537 if (ep->flags == 0x0) {
538 p_fs->map_clu = GET32_A(ep->start_clu);
539 map_size = (u32)GET64_A(ep->size);
540
541 p_fs->map_sectors = ((map_size - 1) >> p_bd->sector_size_bits) + 1;
542
543 p_fs->vol_amap = kmalloc_array(p_fs->map_sectors,
544 sizeof(struct buffer_head *),
545 GFP_KERNEL);
546 if (!p_fs->vol_amap)
547 return FFS_MEMORYERR;
548
549 sector = START_SECTOR(p_fs->map_clu);
550
551 for (j = 0; j < p_fs->map_sectors; j++) {
552 p_fs->vol_amap[j] = NULL;
553 ret = sector_read(sb, sector + j, &(p_fs->vol_amap[j]), 1);
554 if (ret != FFS_SUCCESS) {
555
556 i = 0;
557 while (i < j)
558 brelse(p_fs->vol_amap[i++]);
559
560 kfree(p_fs->vol_amap);
561 p_fs->vol_amap = NULL;
562 return ret;
563 }
564 }
565
566 p_fs->pbr_bh = NULL;
567 return FFS_SUCCESS;
568 }
569 }
570
571 if (FAT_read(sb, clu.dir, &clu.dir) != 0)
572 return FFS_MEDIAERR;
573 }
574
575 return FFS_FORMATERR;
576 }
577
578 void free_alloc_bitmap(struct super_block *sb)
579 {
580 int i;
581 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
582
583 brelse(p_fs->pbr_bh);
584
585 for (i = 0; i < p_fs->map_sectors; i++)
586 __brelse(p_fs->vol_amap[i]);
587
588 kfree(p_fs->vol_amap);
589 p_fs->vol_amap = NULL;
590 }
591
592 s32 set_alloc_bitmap(struct super_block *sb, u32 clu)
593 {
594 int i, b;
595 sector_t sector;
596 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
597 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
598
599 i = clu >> (p_bd->sector_size_bits + 3);
600 b = clu & ((p_bd->sector_size << 3) - 1);
601
602 sector = START_SECTOR(p_fs->map_clu) + i;
603
604 exfat_bitmap_set((u8 *)p_fs->vol_amap[i]->b_data, b);
605
606 return sector_write(sb, sector, p_fs->vol_amap[i], 0);
607 }
608
609 s32 clr_alloc_bitmap(struct super_block *sb, u32 clu)
610 {
611 int i, b;
612 sector_t sector;
613 #ifdef CONFIG_EXFAT_DISCARD
614 struct exfat_sb_info *sbi = EXFAT_SB(sb);
615 struct exfat_mount_options *opts = &sbi->options;
616 int ret;
617 #endif
618 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
619 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
620
621 i = clu >> (p_bd->sector_size_bits + 3);
622 b = clu & ((p_bd->sector_size << 3) - 1);
623
624 sector = START_SECTOR(p_fs->map_clu) + i;
625
626 exfat_bitmap_clear((u8 *)p_fs->vol_amap[i]->b_data, b);
627
628 return sector_write(sb, sector, p_fs->vol_amap[i], 0);
629
630 #ifdef CONFIG_EXFAT_DISCARD
631 if (opts->discard) {
632 ret = sb_issue_discard(sb, START_SECTOR(clu),
633 (1 << p_fs->sectors_per_clu_bits),
634 GFP_NOFS, 0);
635 if (ret == -EOPNOTSUPP) {
636 pr_warn("discard not supported by device, disabling");
637 opts->discard = 0;
638 }
639 }
640 #endif
641 }
642
643 u32 test_alloc_bitmap(struct super_block *sb, u32 clu)
644 {
645 int i, map_i, map_b;
646 u32 clu_base, clu_free;
647 u8 k, clu_mask;
648 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
649 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
650
651 clu_base = (clu & ~(0x7)) + 2;
652 clu_mask = (1 << (clu - clu_base + 2)) - 1;
653
654 map_i = clu >> (p_bd->sector_size_bits + 3);
655 map_b = (clu >> 3) & p_bd->sector_size_mask;
656
657 for (i = 2; i < p_fs->num_clusters; i += 8) {
658 k = *(((u8 *)p_fs->vol_amap[map_i]->b_data) + map_b);
659 if (clu_mask > 0) {
660 k |= clu_mask;
661 clu_mask = 0;
662 }
663 if (k < 0xFF) {
664 clu_free = clu_base + free_bit[k];
665 if (clu_free < p_fs->num_clusters)
666 return clu_free;
667 }
668 clu_base += 8;
669
670 if (((++map_b) >= p_bd->sector_size) ||
671 (clu_base >= p_fs->num_clusters)) {
672 if ((++map_i) >= p_fs->map_sectors) {
673 clu_base = 2;
674 map_i = 0;
675 }
676 map_b = 0;
677 }
678 }
679
680 return CLUSTER_32(~0);
681 }
682
683 void sync_alloc_bitmap(struct super_block *sb)
684 {
685 int i;
686 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
687
688 if (!p_fs->vol_amap)
689 return;
690
691 for (i = 0; i < p_fs->map_sectors; i++)
692 sync_dirty_buffer(p_fs->vol_amap[i]);
693 }
694
695
696
697
698 static s32 __load_upcase_table(struct super_block *sb, sector_t sector,
699 u32 num_sectors, u32 utbl_checksum)
700 {
701 int i, ret = FFS_ERROR;
702 u32 j;
703 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
704 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
705 struct buffer_head *tmp_bh = NULL;
706 sector_t end_sector = num_sectors + sector;
707
708 bool skip = false;
709 u32 index = 0;
710 u16 uni = 0;
711 u16 **upcase_table;
712
713 u32 checksum = 0;
714
715 upcase_table = p_fs->vol_utbl = kmalloc(UTBL_COL_COUNT * sizeof(u16 *),
716 GFP_KERNEL);
717 if (!upcase_table)
718 return FFS_MEMORYERR;
719 memset(upcase_table, 0, UTBL_COL_COUNT * sizeof(u16 *));
720
721 while (sector < end_sector) {
722 ret = sector_read(sb, sector, &tmp_bh, 1);
723 if (ret != FFS_SUCCESS) {
724 pr_debug("sector read (0x%llX)fail\n",
725 (unsigned long long)sector);
726 goto error;
727 }
728 sector++;
729
730 for (i = 0; i < p_bd->sector_size && index <= 0xFFFF; i += 2) {
731 uni = GET16(((u8 *)tmp_bh->b_data) + i);
732
733 checksum = ((checksum & 1) ? 0x80000000 : 0) +
734 (checksum >> 1) + *(((u8 *)tmp_bh->b_data) +
735 i);
736 checksum = ((checksum & 1) ? 0x80000000 : 0) +
737 (checksum >> 1) + *(((u8 *)tmp_bh->b_data) +
738 (i + 1));
739
740 if (skip) {
741 pr_debug("skip from 0x%X ", index);
742 index += uni;
743 pr_debug("to 0x%X (amount of 0x%X)\n",
744 index, uni);
745 skip = false;
746 } else if (uni == index) {
747 index++;
748 } else if (uni == 0xFFFF) {
749 skip = true;
750 } else {
751 u16 col_index = get_col_index(index);
752
753 if (!upcase_table[col_index]) {
754 pr_debug("alloc = 0x%X\n", col_index);
755 upcase_table[col_index] = kmalloc_array(UTBL_ROW_COUNT,
756 sizeof(u16), GFP_KERNEL);
757 if (!upcase_table[col_index]) {
758 ret = FFS_MEMORYERR;
759 goto error;
760 }
761
762 for (j = 0; j < UTBL_ROW_COUNT; j++)
763 upcase_table[col_index][j] = (col_index << LOW_INDEX_BIT) | j;
764 }
765
766 upcase_table[col_index][get_row_index(index)] = uni;
767 index++;
768 }
769 }
770 }
771 if (index >= 0xFFFF && utbl_checksum == checksum) {
772 if (tmp_bh)
773 brelse(tmp_bh);
774 return FFS_SUCCESS;
775 }
776 ret = FFS_ERROR;
777 error:
778 if (tmp_bh)
779 brelse(tmp_bh);
780 free_upcase_table(sb);
781 return ret;
782 }
783
784 static s32 __load_default_upcase_table(struct super_block *sb)
785 {
786 int i, ret = FFS_ERROR;
787 u32 j;
788 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
789
790 bool skip = false;
791 u32 index = 0;
792 u16 uni = 0;
793 u16 **upcase_table;
794
795 upcase_table = p_fs->vol_utbl = kmalloc(UTBL_COL_COUNT * sizeof(u16 *),
796 GFP_KERNEL);
797 if (!upcase_table)
798 return FFS_MEMORYERR;
799 memset(upcase_table, 0, UTBL_COL_COUNT * sizeof(u16 *));
800
801 for (i = 0; index <= 0xFFFF && i < NUM_UPCASE * 2; i += 2) {
802 uni = GET16(uni_upcase + i);
803 if (skip) {
804 pr_debug("skip from 0x%X ", index);
805 index += uni;
806 pr_debug("to 0x%X (amount of 0x%X)\n", index, uni);
807 skip = false;
808 } else if (uni == index) {
809 index++;
810 } else if (uni == 0xFFFF) {
811 skip = true;
812 } else {
813 u16 col_index = get_col_index(index);
814
815 if (!upcase_table[col_index]) {
816 pr_debug("alloc = 0x%X\n", col_index);
817 upcase_table[col_index] = kmalloc_array(UTBL_ROW_COUNT,
818 sizeof(u16),
819 GFP_KERNEL);
820 if (!upcase_table[col_index]) {
821 ret = FFS_MEMORYERR;
822 goto error;
823 }
824
825 for (j = 0; j < UTBL_ROW_COUNT; j++)
826 upcase_table[col_index][j] = (col_index << LOW_INDEX_BIT) | j;
827 }
828
829 upcase_table[col_index][get_row_index(index)] = uni;
830 index++;
831 }
832 }
833
834 if (index >= 0xFFFF)
835 return FFS_SUCCESS;
836
837 error:
838
839 free_upcase_table(sb);
840 return ret;
841 }
842
843 s32 load_upcase_table(struct super_block *sb)
844 {
845 int i;
846 u32 tbl_clu, tbl_size;
847 sector_t sector;
848 u32 type, num_sectors;
849 struct chain_t clu;
850 struct case_dentry_t *ep;
851 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
852 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
853
854 clu.dir = p_fs->root_dir;
855 clu.flags = 0x01;
856
857 if (p_fs->dev_ejected)
858 return FFS_MEDIAERR;
859
860 while (clu.dir != CLUSTER_32(~0)) {
861 for (i = 0; i < p_fs->dentries_per_clu; i++) {
862 ep = (struct case_dentry_t *)get_entry_in_dir(sb, &clu,
863 i, NULL);
864 if (!ep)
865 return FFS_MEDIAERR;
866
867 type = p_fs->fs_func->get_entry_type((struct dentry_t *)ep);
868
869 if (type == TYPE_UNUSED)
870 break;
871 if (type != TYPE_UPCASE)
872 continue;
873
874 tbl_clu = GET32_A(ep->start_clu);
875 tbl_size = (u32)GET64_A(ep->size);
876
877 sector = START_SECTOR(tbl_clu);
878 num_sectors = ((tbl_size - 1) >> p_bd->sector_size_bits) + 1;
879 if (__load_upcase_table(sb, sector, num_sectors,
880 GET32_A(ep->checksum)) != FFS_SUCCESS)
881 break;
882 return FFS_SUCCESS;
883 }
884 if (FAT_read(sb, clu.dir, &clu.dir) != 0)
885 return FFS_MEDIAERR;
886 }
887
888 return __load_default_upcase_table(sb);
889 }
890
891 void free_upcase_table(struct super_block *sb)
892 {
893 u32 i;
894 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
895 u16 **upcase_table;
896
897 upcase_table = p_fs->vol_utbl;
898 for (i = 0; i < UTBL_COL_COUNT; i++)
899 kfree(upcase_table[i]);
900
901 kfree(p_fs->vol_utbl);
902 p_fs->vol_utbl = NULL;
903 }
904
905
906
907
908
909 u32 fat_get_entry_type(struct dentry_t *p_entry)
910 {
911 struct dos_dentry_t *ep = (struct dos_dentry_t *)p_entry;
912
913 if (*(ep->name) == 0x0)
914 return TYPE_UNUSED;
915
916 else if (*(ep->name) == 0xE5)
917 return TYPE_DELETED;
918
919 else if (ep->attr == ATTR_EXTEND)
920 return TYPE_EXTEND;
921
922 else if ((ep->attr & (ATTR_SUBDIR | ATTR_VOLUME)) == ATTR_VOLUME)
923 return TYPE_VOLUME;
924
925 else if ((ep->attr & (ATTR_SUBDIR | ATTR_VOLUME)) == ATTR_SUBDIR)
926 return TYPE_DIR;
927
928 return TYPE_FILE;
929 }
930
931 u32 exfat_get_entry_type(struct dentry_t *p_entry)
932 {
933 struct file_dentry_t *ep = (struct file_dentry_t *)p_entry;
934
935 if (ep->type == 0x0) {
936 return TYPE_UNUSED;
937 } else if (ep->type < 0x80) {
938 return TYPE_DELETED;
939 } else if (ep->type == 0x80) {
940 return TYPE_INVALID;
941 } else if (ep->type < 0xA0) {
942 if (ep->type == 0x81) {
943 return TYPE_BITMAP;
944 } else if (ep->type == 0x82) {
945 return TYPE_UPCASE;
946 } else if (ep->type == 0x83) {
947 return TYPE_VOLUME;
948 } else if (ep->type == 0x85) {
949 if (GET16_A(ep->attr) & ATTR_SUBDIR)
950 return TYPE_DIR;
951 else
952 return TYPE_FILE;
953 }
954 return TYPE_CRITICAL_PRI;
955 } else if (ep->type < 0xC0) {
956 if (ep->type == 0xA0)
957 return TYPE_GUID;
958 else if (ep->type == 0xA1)
959 return TYPE_PADDING;
960 else if (ep->type == 0xA2)
961 return TYPE_ACLTAB;
962 return TYPE_BENIGN_PRI;
963 } else if (ep->type < 0xE0) {
964 if (ep->type == 0xC0)
965 return TYPE_STREAM;
966 else if (ep->type == 0xC1)
967 return TYPE_EXTEND;
968 else if (ep->type == 0xC2)
969 return TYPE_ACL;
970 return TYPE_CRITICAL_SEC;
971 }
972
973 return TYPE_BENIGN_SEC;
974 }
975
976 void fat_set_entry_type(struct dentry_t *p_entry, u32 type)
977 {
978 struct dos_dentry_t *ep = (struct dos_dentry_t *)p_entry;
979
980 if (type == TYPE_UNUSED)
981 *(ep->name) = 0x0;
982
983 else if (type == TYPE_DELETED)
984 *(ep->name) = 0xE5;
985
986 else if (type == TYPE_EXTEND)
987 ep->attr = ATTR_EXTEND;
988
989 else if (type == TYPE_DIR)
990 ep->attr = ATTR_SUBDIR;
991
992 else if (type == TYPE_FILE)
993 ep->attr = ATTR_ARCHIVE;
994
995 else if (type == TYPE_SYMLINK)
996 ep->attr = ATTR_ARCHIVE | ATTR_SYMLINK;
997 }
998
999 void exfat_set_entry_type(struct dentry_t *p_entry, u32 type)
1000 {
1001 struct file_dentry_t *ep = (struct file_dentry_t *)p_entry;
1002
1003 if (type == TYPE_UNUSED) {
1004 ep->type = 0x0;
1005 } else if (type == TYPE_DELETED) {
1006 ep->type &= ~0x80;
1007 } else if (type == TYPE_STREAM) {
1008 ep->type = 0xC0;
1009 } else if (type == TYPE_EXTEND) {
1010 ep->type = 0xC1;
1011 } else if (type == TYPE_BITMAP) {
1012 ep->type = 0x81;
1013 } else if (type == TYPE_UPCASE) {
1014 ep->type = 0x82;
1015 } else if (type == TYPE_VOLUME) {
1016 ep->type = 0x83;
1017 } else if (type == TYPE_DIR) {
1018 ep->type = 0x85;
1019 SET16_A(ep->attr, ATTR_SUBDIR);
1020 } else if (type == TYPE_FILE) {
1021 ep->type = 0x85;
1022 SET16_A(ep->attr, ATTR_ARCHIVE);
1023 } else if (type == TYPE_SYMLINK) {
1024 ep->type = 0x85;
1025 SET16_A(ep->attr, ATTR_ARCHIVE | ATTR_SYMLINK);
1026 }
1027 }
1028
1029 u32 fat_get_entry_attr(struct dentry_t *p_entry)
1030 {
1031 struct dos_dentry_t *ep = (struct dos_dentry_t *)p_entry;
1032
1033 return (u32)ep->attr;
1034 }
1035
1036 u32 exfat_get_entry_attr(struct dentry_t *p_entry)
1037 {
1038 struct file_dentry_t *ep = (struct file_dentry_t *)p_entry;
1039
1040 return (u32)GET16_A(ep->attr);
1041 }
1042
1043 void fat_set_entry_attr(struct dentry_t *p_entry, u32 attr)
1044 {
1045 struct dos_dentry_t *ep = (struct dos_dentry_t *)p_entry;
1046
1047 ep->attr = (u8)attr;
1048 }
1049
1050 void exfat_set_entry_attr(struct dentry_t *p_entry, u32 attr)
1051 {
1052 struct file_dentry_t *ep = (struct file_dentry_t *)p_entry;
1053
1054 SET16_A(ep->attr, (u16)attr);
1055 }
1056
1057 u8 fat_get_entry_flag(struct dentry_t *p_entry)
1058 {
1059 return 0x01;
1060 }
1061
1062 u8 exfat_get_entry_flag(struct dentry_t *p_entry)
1063 {
1064 struct strm_dentry_t *ep = (struct strm_dentry_t *)p_entry;
1065
1066 return ep->flags;
1067 }
1068
1069 void fat_set_entry_flag(struct dentry_t *p_entry, u8 flags)
1070 {
1071 }
1072
1073 void exfat_set_entry_flag(struct dentry_t *p_entry, u8 flags)
1074 {
1075 struct strm_dentry_t *ep = (struct strm_dentry_t *)p_entry;
1076
1077 ep->flags = flags;
1078 }
1079
1080 u32 fat_get_entry_clu0(struct dentry_t *p_entry)
1081 {
1082 struct dos_dentry_t *ep = (struct dos_dentry_t *)p_entry;
1083
1084 return ((u32)GET16_A(ep->start_clu_hi) << 16) |
1085 GET16_A(ep->start_clu_lo);
1086 }
1087
1088 u32 exfat_get_entry_clu0(struct dentry_t *p_entry)
1089 {
1090 struct strm_dentry_t *ep = (struct strm_dentry_t *)p_entry;
1091
1092 return GET32_A(ep->start_clu);
1093 }
1094
1095 void fat_set_entry_clu0(struct dentry_t *p_entry, u32 start_clu)
1096 {
1097 struct dos_dentry_t *ep = (struct dos_dentry_t *)p_entry;
1098
1099 SET16_A(ep->start_clu_lo, CLUSTER_16(start_clu));
1100 SET16_A(ep->start_clu_hi, CLUSTER_16(start_clu >> 16));
1101 }
1102
1103 void exfat_set_entry_clu0(struct dentry_t *p_entry, u32 start_clu)
1104 {
1105 struct strm_dentry_t *ep = (struct strm_dentry_t *)p_entry;
1106
1107 SET32_A(ep->start_clu, start_clu);
1108 }
1109
1110 u64 fat_get_entry_size(struct dentry_t *p_entry)
1111 {
1112 struct dos_dentry_t *ep = (struct dos_dentry_t *)p_entry;
1113
1114 return (u64)GET32_A(ep->size);
1115 }
1116
1117 u64 exfat_get_entry_size(struct dentry_t *p_entry)
1118 {
1119 struct strm_dentry_t *ep = (struct strm_dentry_t *)p_entry;
1120
1121 return GET64_A(ep->valid_size);
1122 }
1123
1124 void fat_set_entry_size(struct dentry_t *p_entry, u64 size)
1125 {
1126 struct dos_dentry_t *ep = (struct dos_dentry_t *)p_entry;
1127
1128 SET32_A(ep->size, (u32)size);
1129 }
1130
1131 void exfat_set_entry_size(struct dentry_t *p_entry, u64 size)
1132 {
1133 struct strm_dentry_t *ep = (struct strm_dentry_t *)p_entry;
1134
1135 SET64_A(ep->valid_size, size);
1136 SET64_A(ep->size, size);
1137 }
1138
1139 void fat_get_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp,
1140 u8 mode)
1141 {
1142 u16 t = 0x00, d = 0x21;
1143 struct dos_dentry_t *ep = (struct dos_dentry_t *)p_entry;
1144
1145 switch (mode) {
1146 case TM_CREATE:
1147 t = GET16_A(ep->create_time);
1148 d = GET16_A(ep->create_date);
1149 break;
1150 case TM_MODIFY:
1151 t = GET16_A(ep->modify_time);
1152 d = GET16_A(ep->modify_date);
1153 break;
1154 }
1155
1156 tp->sec = (t & 0x001F) << 1;
1157 tp->min = (t >> 5) & 0x003F;
1158 tp->hour = (t >> 11);
1159 tp->day = (d & 0x001F);
1160 tp->mon = (d >> 5) & 0x000F;
1161 tp->year = (d >> 9);
1162 }
1163
1164 void exfat_get_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp,
1165 u8 mode)
1166 {
1167 u16 t = 0x00, d = 0x21;
1168 struct file_dentry_t *ep = (struct file_dentry_t *)p_entry;
1169
1170 switch (mode) {
1171 case TM_CREATE:
1172 t = GET16_A(ep->create_time);
1173 d = GET16_A(ep->create_date);
1174 break;
1175 case TM_MODIFY:
1176 t = GET16_A(ep->modify_time);
1177 d = GET16_A(ep->modify_date);
1178 break;
1179 case TM_ACCESS:
1180 t = GET16_A(ep->access_time);
1181 d = GET16_A(ep->access_date);
1182 break;
1183 }
1184
1185 tp->sec = (t & 0x001F) << 1;
1186 tp->min = (t >> 5) & 0x003F;
1187 tp->hour = (t >> 11);
1188 tp->day = (d & 0x001F);
1189 tp->mon = (d >> 5) & 0x000F;
1190 tp->year = (d >> 9);
1191 }
1192
1193 void fat_set_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp,
1194 u8 mode)
1195 {
1196 u16 t, d;
1197 struct dos_dentry_t *ep = (struct dos_dentry_t *)p_entry;
1198
1199 t = (tp->hour << 11) | (tp->min << 5) | (tp->sec >> 1);
1200 d = (tp->year << 9) | (tp->mon << 5) | tp->day;
1201
1202 switch (mode) {
1203 case TM_CREATE:
1204 SET16_A(ep->create_time, t);
1205 SET16_A(ep->create_date, d);
1206 break;
1207 case TM_MODIFY:
1208 SET16_A(ep->modify_time, t);
1209 SET16_A(ep->modify_date, d);
1210 break;
1211 }
1212 }
1213
1214 void exfat_set_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp,
1215 u8 mode)
1216 {
1217 u16 t, d;
1218 struct file_dentry_t *ep = (struct file_dentry_t *)p_entry;
1219
1220 t = (tp->hour << 11) | (tp->min << 5) | (tp->sec >> 1);
1221 d = (tp->year << 9) | (tp->mon << 5) | tp->day;
1222
1223 switch (mode) {
1224 case TM_CREATE:
1225 SET16_A(ep->create_time, t);
1226 SET16_A(ep->create_date, d);
1227 break;
1228 case TM_MODIFY:
1229 SET16_A(ep->modify_time, t);
1230 SET16_A(ep->modify_date, d);
1231 break;
1232 case TM_ACCESS:
1233 SET16_A(ep->access_time, t);
1234 SET16_A(ep->access_date, d);
1235 break;
1236 }
1237 }
1238
1239 s32 fat_init_dir_entry(struct super_block *sb, struct chain_t *p_dir, s32 entry,
1240 u32 type, u32 start_clu, u64 size)
1241 {
1242 sector_t sector;
1243 struct dos_dentry_t *dos_ep;
1244
1245 dos_ep = (struct dos_dentry_t *)get_entry_in_dir(sb, p_dir, entry,
1246 §or);
1247 if (!dos_ep)
1248 return FFS_MEDIAERR;
1249
1250 init_dos_entry(dos_ep, type, start_clu);
1251 buf_modify(sb, sector);
1252
1253 return FFS_SUCCESS;
1254 }
1255
1256 s32 exfat_init_dir_entry(struct super_block *sb, struct chain_t *p_dir,
1257 s32 entry, u32 type, u32 start_clu, u64 size)
1258 {
1259 sector_t sector;
1260 u8 flags;
1261 struct file_dentry_t *file_ep;
1262 struct strm_dentry_t *strm_ep;
1263
1264 flags = (type == TYPE_FILE) ? 0x01 : 0x03;
1265
1266
1267 file_ep = (struct file_dentry_t *)get_entry_in_dir(sb, p_dir, entry,
1268 §or);
1269 if (!file_ep)
1270 return FFS_MEDIAERR;
1271
1272 strm_ep = (struct strm_dentry_t *)get_entry_in_dir(sb, p_dir, entry + 1,
1273 §or);
1274 if (!strm_ep)
1275 return FFS_MEDIAERR;
1276
1277 init_file_entry(file_ep, type);
1278 buf_modify(sb, sector);
1279
1280 init_strm_entry(strm_ep, flags, start_clu, size);
1281 buf_modify(sb, sector);
1282
1283 return FFS_SUCCESS;
1284 }
1285
1286 static s32 fat_init_ext_entry(struct super_block *sb, struct chain_t *p_dir,
1287 s32 entry, s32 num_entries,
1288 struct uni_name_t *p_uniname,
1289 struct dos_name_t *p_dosname)
1290 {
1291 int i;
1292 sector_t sector;
1293 u8 chksum;
1294 u16 *uniname = p_uniname->name;
1295 struct dos_dentry_t *dos_ep;
1296 struct ext_dentry_t *ext_ep;
1297
1298 dos_ep = (struct dos_dentry_t *)get_entry_in_dir(sb, p_dir, entry,
1299 §or);
1300 if (!dos_ep)
1301 return FFS_MEDIAERR;
1302
1303 dos_ep->lcase = p_dosname->name_case;
1304 memcpy(dos_ep->name, p_dosname->name, DOS_NAME_LENGTH);
1305 buf_modify(sb, sector);
1306
1307 if ((--num_entries) > 0) {
1308 chksum = calc_checksum_1byte((void *)dos_ep->name,
1309 DOS_NAME_LENGTH, 0);
1310
1311 for (i = 1; i < num_entries; i++) {
1312 ext_ep = (struct ext_dentry_t *)get_entry_in_dir(sb,
1313 p_dir,
1314 entry - i,
1315 §or);
1316 if (!ext_ep)
1317 return FFS_MEDIAERR;
1318
1319 init_ext_entry(ext_ep, i, chksum, uniname);
1320 buf_modify(sb, sector);
1321 uniname += 13;
1322 }
1323
1324 ext_ep = (struct ext_dentry_t *)get_entry_in_dir(sb, p_dir,
1325 entry - i,
1326 §or);
1327 if (!ext_ep)
1328 return FFS_MEDIAERR;
1329
1330 init_ext_entry(ext_ep, i + 0x40, chksum, uniname);
1331 buf_modify(sb, sector);
1332 }
1333
1334 return FFS_SUCCESS;
1335 }
1336
1337 static s32 exfat_init_ext_entry(struct super_block *sb, struct chain_t *p_dir,
1338 s32 entry, s32 num_entries,
1339 struct uni_name_t *p_uniname,
1340 struct dos_name_t *p_dosname)
1341 {
1342 int i;
1343 sector_t sector;
1344 u16 *uniname = p_uniname->name;
1345 struct file_dentry_t *file_ep;
1346 struct strm_dentry_t *strm_ep;
1347 struct name_dentry_t *name_ep;
1348
1349 file_ep = (struct file_dentry_t *)get_entry_in_dir(sb, p_dir, entry,
1350 §or);
1351 if (!file_ep)
1352 return FFS_MEDIAERR;
1353
1354 file_ep->num_ext = (u8)(num_entries - 1);
1355 buf_modify(sb, sector);
1356
1357 strm_ep = (struct strm_dentry_t *)get_entry_in_dir(sb, p_dir, entry + 1,
1358 §or);
1359 if (!strm_ep)
1360 return FFS_MEDIAERR;
1361
1362 strm_ep->name_len = p_uniname->name_len;
1363 SET16_A(strm_ep->name_hash, p_uniname->name_hash);
1364 buf_modify(sb, sector);
1365
1366 for (i = 2; i < num_entries; i++) {
1367 name_ep = (struct name_dentry_t *)get_entry_in_dir(sb, p_dir,
1368 entry + i,
1369 §or);
1370 if (!name_ep)
1371 return FFS_MEDIAERR;
1372
1373 init_name_entry(name_ep, uniname);
1374 buf_modify(sb, sector);
1375 uniname += 15;
1376 }
1377
1378 update_dir_checksum(sb, p_dir, entry);
1379
1380 return FFS_SUCCESS;
1381 }
1382
1383 void init_dos_entry(struct dos_dentry_t *ep, u32 type, u32 start_clu)
1384 {
1385 struct timestamp_t tm, *tp;
1386
1387 fat_set_entry_type((struct dentry_t *)ep, type);
1388 SET16_A(ep->start_clu_lo, CLUSTER_16(start_clu));
1389 SET16_A(ep->start_clu_hi, CLUSTER_16(start_clu >> 16));
1390 SET32_A(ep->size, 0);
1391
1392 tp = tm_current(&tm);
1393 fat_set_entry_time((struct dentry_t *)ep, tp, TM_CREATE);
1394 fat_set_entry_time((struct dentry_t *)ep, tp, TM_MODIFY);
1395 SET16_A(ep->access_date, 0);
1396 ep->create_time_ms = 0;
1397 }
1398
1399 void init_ext_entry(struct ext_dentry_t *ep, s32 order, u8 chksum, u16 *uniname)
1400 {
1401 int i;
1402 bool end = false;
1403
1404 fat_set_entry_type((struct dentry_t *)ep, TYPE_EXTEND);
1405 ep->order = (u8)order;
1406 ep->sysid = 0;
1407 ep->checksum = chksum;
1408 SET16_A(ep->start_clu, 0);
1409
1410 for (i = 0; i < 10; i += 2) {
1411 if (!end) {
1412 SET16(ep->unicode_0_4 + i, *uniname);
1413 if (*uniname == 0x0)
1414 end = true;
1415 else
1416 uniname++;
1417 } else {
1418 SET16(ep->unicode_0_4 + i, 0xFFFF);
1419 }
1420 }
1421
1422 for (i = 0; i < 12; i += 2) {
1423 if (!end) {
1424 SET16_A(ep->unicode_5_10 + i, *uniname);
1425 if (*uniname == 0x0)
1426 end = true;
1427 else
1428 uniname++;
1429 } else {
1430 SET16_A(ep->unicode_5_10 + i, 0xFFFF);
1431 }
1432 }
1433
1434 for (i = 0; i < 4; i += 2) {
1435 if (!end) {
1436 SET16_A(ep->unicode_11_12 + i, *uniname);
1437 if (*uniname == 0x0)
1438 end = true;
1439 else
1440 uniname++;
1441 } else {
1442 SET16_A(ep->unicode_11_12 + i, 0xFFFF);
1443 }
1444 }
1445 }
1446
1447 void init_file_entry(struct file_dentry_t *ep, u32 type)
1448 {
1449 struct timestamp_t tm, *tp;
1450
1451 exfat_set_entry_type((struct dentry_t *)ep, type);
1452
1453 tp = tm_current(&tm);
1454 exfat_set_entry_time((struct dentry_t *)ep, tp, TM_CREATE);
1455 exfat_set_entry_time((struct dentry_t *)ep, tp, TM_MODIFY);
1456 exfat_set_entry_time((struct dentry_t *)ep, tp, TM_ACCESS);
1457 ep->create_time_ms = 0;
1458 ep->modify_time_ms = 0;
1459 ep->access_time_ms = 0;
1460 }
1461
1462 void init_strm_entry(struct strm_dentry_t *ep, u8 flags, u32 start_clu, u64 size)
1463 {
1464 exfat_set_entry_type((struct dentry_t *)ep, TYPE_STREAM);
1465 ep->flags = flags;
1466 SET32_A(ep->start_clu, start_clu);
1467 SET64_A(ep->valid_size, size);
1468 SET64_A(ep->size, size);
1469 }
1470
1471 void init_name_entry(struct name_dentry_t *ep, u16 *uniname)
1472 {
1473 int i;
1474
1475 exfat_set_entry_type((struct dentry_t *)ep, TYPE_EXTEND);
1476 ep->flags = 0x0;
1477
1478 for (i = 0; i < 30; i++, i++) {
1479 SET16_A(ep->unicode_0_14 + i, *uniname);
1480 if (*uniname == 0x0)
1481 break;
1482 uniname++;
1483 }
1484 }
1485
1486 void fat_delete_dir_entry(struct super_block *sb, struct chain_t *p_dir,
1487 s32 entry, s32 order, s32 num_entries)
1488 {
1489 int i;
1490 sector_t sector;
1491 struct dentry_t *ep;
1492 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
1493
1494 for (i = num_entries - 1; i >= order; i--) {
1495 ep = get_entry_in_dir(sb, p_dir, entry - i, §or);
1496 if (!ep)
1497 return;
1498
1499 p_fs->fs_func->set_entry_type(ep, TYPE_DELETED);
1500 buf_modify(sb, sector);
1501 }
1502 }
1503
1504 void exfat_delete_dir_entry(struct super_block *sb, struct chain_t *p_dir,
1505 s32 entry, s32 order, s32 num_entries)
1506 {
1507 int i;
1508 sector_t sector;
1509 struct dentry_t *ep;
1510 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
1511
1512 for (i = order; i < num_entries; i++) {
1513 ep = get_entry_in_dir(sb, p_dir, entry + i, §or);
1514 if (!ep)
1515 return;
1516
1517 p_fs->fs_func->set_entry_type(ep, TYPE_DELETED);
1518 buf_modify(sb, sector);
1519 }
1520 }
1521
1522 void update_dir_checksum(struct super_block *sb, struct chain_t *p_dir,
1523 s32 entry)
1524 {
1525 int i, num_entries;
1526 sector_t sector;
1527 u16 chksum;
1528 struct file_dentry_t *file_ep;
1529 struct dentry_t *ep;
1530
1531 file_ep = (struct file_dentry_t *)get_entry_in_dir(sb, p_dir, entry,
1532 §or);
1533 if (!file_ep)
1534 return;
1535
1536 buf_lock(sb, sector);
1537
1538 num_entries = (s32)file_ep->num_ext + 1;
1539 chksum = calc_checksum_2byte((void *)file_ep, DENTRY_SIZE, 0,
1540 CS_DIR_ENTRY);
1541
1542 for (i = 1; i < num_entries; i++) {
1543 ep = get_entry_in_dir(sb, p_dir, entry + i, NULL);
1544 if (!ep) {
1545 buf_unlock(sb, sector);
1546 return;
1547 }
1548
1549 chksum = calc_checksum_2byte((void *)ep, DENTRY_SIZE, chksum,
1550 CS_DEFAULT);
1551 }
1552
1553 SET16_A(file_ep->checksum, chksum);
1554 buf_modify(sb, sector);
1555 buf_unlock(sb, sector);
1556 }
1557
1558 void update_dir_checksum_with_entry_set(struct super_block *sb,
1559 struct entry_set_cache_t *es)
1560 {
1561 struct dentry_t *ep;
1562 u16 chksum = 0;
1563 s32 chksum_type = CS_DIR_ENTRY, i;
1564
1565 ep = (struct dentry_t *)&(es->__buf);
1566 for (i = 0; i < es->num_entries; i++) {
1567 pr_debug("%s ep %p\n", __func__, ep);
1568 chksum = calc_checksum_2byte((void *)ep, DENTRY_SIZE, chksum,
1569 chksum_type);
1570 ep++;
1571 chksum_type = CS_DEFAULT;
1572 }
1573
1574 ep = (struct dentry_t *)&(es->__buf);
1575 SET16_A(((struct file_dentry_t *)ep)->checksum, chksum);
1576 write_whole_entry_set(sb, es);
1577 }
1578
1579 static s32 _walk_fat_chain(struct super_block *sb, struct chain_t *p_dir,
1580 s32 byte_offset, u32 *clu)
1581 {
1582 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
1583 s32 clu_offset;
1584 u32 cur_clu;
1585
1586 clu_offset = byte_offset >> p_fs->cluster_size_bits;
1587 cur_clu = p_dir->dir;
1588
1589 if (p_dir->flags == 0x03) {
1590 cur_clu += clu_offset;
1591 } else {
1592 while (clu_offset > 0) {
1593 if (FAT_read(sb, cur_clu, &cur_clu) == -1)
1594 return FFS_MEDIAERR;
1595 clu_offset--;
1596 }
1597 }
1598
1599 if (clu)
1600 *clu = cur_clu;
1601 return FFS_SUCCESS;
1602 }
1603
1604 s32 find_location(struct super_block *sb, struct chain_t *p_dir, s32 entry,
1605 sector_t *sector, s32 *offset)
1606 {
1607 s32 off, ret;
1608 u32 clu = 0;
1609 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
1610 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
1611
1612 off = entry << DENTRY_SIZE_BITS;
1613
1614 if (p_dir->dir == CLUSTER_32(0)) {
1615 *offset = off & p_bd->sector_size_mask;
1616 *sector = off >> p_bd->sector_size_bits;
1617 *sector += p_fs->root_start_sector;
1618 } else {
1619 ret = _walk_fat_chain(sb, p_dir, off, &clu);
1620 if (ret != FFS_SUCCESS)
1621 return ret;
1622
1623
1624 off &= p_fs->cluster_size - 1;
1625
1626
1627 *offset = off & p_bd->sector_size_mask;
1628
1629
1630 *sector = off >> p_bd->sector_size_bits;
1631 *sector += START_SECTOR(clu);
1632 }
1633 return FFS_SUCCESS;
1634 }
1635
1636 struct dentry_t *get_entry_with_sector(struct super_block *sb, sector_t sector,
1637 s32 offset)
1638 {
1639 u8 *buf;
1640
1641 buf = buf_getblk(sb, sector);
1642
1643 if (!buf)
1644 return NULL;
1645
1646 return (struct dentry_t *)(buf + offset);
1647 }
1648
1649 struct dentry_t *get_entry_in_dir(struct super_block *sb, struct chain_t *p_dir,
1650 s32 entry, sector_t *sector)
1651 {
1652 s32 off;
1653 sector_t sec;
1654 u8 *buf;
1655
1656 if (find_location(sb, p_dir, entry, &sec, &off) != FFS_SUCCESS)
1657 return NULL;
1658
1659 buf = buf_getblk(sb, sec);
1660
1661 if (!buf)
1662 return NULL;
1663
1664 if (sector)
1665 *sector = sec;
1666 return (struct dentry_t *)(buf + off);
1667 }
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682 #define ES_MODE_STARTED 0
1683 #define ES_MODE_GET_FILE_ENTRY 1
1684 #define ES_MODE_GET_STRM_ENTRY 2
1685 #define ES_MODE_GET_NAME_ENTRY 3
1686 #define ES_MODE_GET_CRITICAL_SEC_ENTRY 4
1687 struct entry_set_cache_t *get_entry_set_in_dir(struct super_block *sb,
1688 struct chain_t *p_dir, s32 entry,
1689 u32 type,
1690 struct dentry_t **file_ep)
1691 {
1692 s32 off, ret, byte_offset;
1693 u32 clu = 0;
1694 sector_t sec;
1695 u32 entry_type;
1696 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
1697 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
1698 struct entry_set_cache_t *es = NULL;
1699 struct dentry_t *ep, *pos;
1700 u8 *buf;
1701 u8 num_entries;
1702 s32 mode = ES_MODE_STARTED;
1703 size_t bufsize;
1704
1705 pr_debug("%s entered p_dir dir %u flags %x size %d\n",
1706 __func__, p_dir->dir, p_dir->flags, p_dir->size);
1707
1708 byte_offset = entry << DENTRY_SIZE_BITS;
1709 ret = _walk_fat_chain(sb, p_dir, byte_offset, &clu);
1710 if (ret != FFS_SUCCESS)
1711 return NULL;
1712
1713
1714 byte_offset &= p_fs->cluster_size - 1;
1715
1716
1717 off = byte_offset & p_bd->sector_size_mask;
1718
1719
1720 sec = byte_offset >> p_bd->sector_size_bits;
1721 sec += START_SECTOR(clu);
1722
1723 buf = buf_getblk(sb, sec);
1724 if (!buf)
1725 goto err_out;
1726
1727 ep = (struct dentry_t *)(buf + off);
1728 entry_type = p_fs->fs_func->get_entry_type(ep);
1729
1730 if ((entry_type != TYPE_FILE)
1731 && (entry_type != TYPE_DIR))
1732 goto err_out;
1733
1734 if (type == ES_ALL_ENTRIES)
1735 num_entries = ((struct file_dentry_t *)ep)->num_ext + 1;
1736 else
1737 num_entries = type;
1738
1739 bufsize = offsetof(struct entry_set_cache_t, __buf) + (num_entries) *
1740 sizeof(struct dentry_t);
1741 pr_debug("%s: trying to kmalloc %zx bytes for %d entries\n", __func__,
1742 bufsize, num_entries);
1743 es = kmalloc(bufsize, GFP_KERNEL);
1744 if (!es)
1745 goto err_out;
1746
1747 es->num_entries = num_entries;
1748 es->sector = sec;
1749 es->offset = off;
1750 es->alloc_flag = p_dir->flags;
1751
1752 pos = (struct dentry_t *)&es->__buf;
1753
1754 while (num_entries) {
1755
1756
1757
1758
1759 entry_type = p_fs->fs_func->get_entry_type(ep);
1760
1761 if ((entry_type == TYPE_UNUSED) || (entry_type == TYPE_DELETED))
1762 goto err_out;
1763
1764 switch (mode) {
1765 case ES_MODE_STARTED:
1766 if ((entry_type == TYPE_FILE) || (entry_type == TYPE_DIR))
1767 mode = ES_MODE_GET_FILE_ENTRY;
1768 else
1769 goto err_out;
1770 break;
1771 case ES_MODE_GET_FILE_ENTRY:
1772 if (entry_type == TYPE_STREAM)
1773 mode = ES_MODE_GET_STRM_ENTRY;
1774 else
1775 goto err_out;
1776 break;
1777 case ES_MODE_GET_STRM_ENTRY:
1778 if (entry_type == TYPE_EXTEND)
1779 mode = ES_MODE_GET_NAME_ENTRY;
1780 else
1781 goto err_out;
1782 break;
1783 case ES_MODE_GET_NAME_ENTRY:
1784 if (entry_type == TYPE_EXTEND)
1785 break;
1786 else if (entry_type == TYPE_STREAM)
1787 goto err_out;
1788 else if (entry_type & TYPE_CRITICAL_SEC)
1789 mode = ES_MODE_GET_CRITICAL_SEC_ENTRY;
1790 else
1791 goto err_out;
1792 break;
1793 case ES_MODE_GET_CRITICAL_SEC_ENTRY:
1794 if ((entry_type == TYPE_EXTEND) ||
1795 (entry_type == TYPE_STREAM))
1796 goto err_out;
1797 else if ((entry_type & TYPE_CRITICAL_SEC) !=
1798 TYPE_CRITICAL_SEC)
1799 goto err_out;
1800 break;
1801 }
1802
1803 memcpy(pos, ep, sizeof(struct dentry_t));
1804
1805 if (--num_entries == 0)
1806 break;
1807
1808 if (((off + DENTRY_SIZE) & p_bd->sector_size_mask) <
1809 (off & p_bd->sector_size_mask)) {
1810
1811 if (IS_LAST_SECTOR_IN_CLUSTER(sec)) {
1812 if (es->alloc_flag == 0x03) {
1813 clu++;
1814 } else {
1815 if (FAT_read(sb, clu, &clu) == -1)
1816 goto err_out;
1817 }
1818 sec = START_SECTOR(clu);
1819 } else {
1820 sec++;
1821 }
1822 buf = buf_getblk(sb, sec);
1823 if (!buf)
1824 goto err_out;
1825 off = 0;
1826 ep = (struct dentry_t *)(buf);
1827 } else {
1828 ep++;
1829 off += DENTRY_SIZE;
1830 }
1831 pos++;
1832 }
1833
1834 if (file_ep)
1835 *file_ep = (struct dentry_t *)&(es->__buf);
1836
1837 pr_debug("%s exiting es %p sec %llu offset %d flags %d, num_entries %u buf ptr %p\n",
1838 __func__, es, (unsigned long long)es->sector, es->offset,
1839 es->alloc_flag, es->num_entries, &es->__buf);
1840 return es;
1841 err_out:
1842 pr_debug("%s exited NULL (es %p)\n", __func__, es);
1843 kfree(es);
1844 return NULL;
1845 }
1846
1847 void release_entry_set(struct entry_set_cache_t *es)
1848 {
1849 pr_debug("%s es=%p\n", __func__, es);
1850 kfree(es);
1851 }
1852
1853 static s32 __write_partial_entries_in_entry_set(struct super_block *sb,
1854 struct entry_set_cache_t *es,
1855 sector_t sec, s32 off, u32 count)
1856 {
1857 s32 num_entries, buf_off = (off - es->offset);
1858 u32 remaining_byte_in_sector, copy_entries;
1859 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
1860 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
1861 u32 clu;
1862 u8 *buf, *esbuf = (u8 *)&(es->__buf);
1863
1864 pr_debug("%s entered es %p sec %llu off %d count %d\n",
1865 __func__, es, (unsigned long long)sec, off, count);
1866 num_entries = count;
1867
1868 while (num_entries) {
1869
1870 remaining_byte_in_sector = (1 << p_bd->sector_size_bits) - off;
1871 copy_entries = min_t(s32,
1872 remaining_byte_in_sector >> DENTRY_SIZE_BITS,
1873 num_entries);
1874 buf = buf_getblk(sb, sec);
1875 if (!buf)
1876 goto err_out;
1877 pr_debug("es->buf %p buf_off %u\n", esbuf, buf_off);
1878 pr_debug("copying %d entries from %p to sector %llu\n",
1879 copy_entries, (esbuf + buf_off),
1880 (unsigned long long)sec);
1881 memcpy(buf + off, esbuf + buf_off,
1882 copy_entries << DENTRY_SIZE_BITS);
1883 buf_modify(sb, sec);
1884 num_entries -= copy_entries;
1885
1886 if (num_entries) {
1887
1888 if (IS_LAST_SECTOR_IN_CLUSTER(sec)) {
1889 clu = GET_CLUSTER_FROM_SECTOR(sec);
1890 if (es->alloc_flag == 0x03) {
1891 clu++;
1892 } else {
1893 if (FAT_read(sb, clu, &clu) == -1)
1894 goto err_out;
1895 }
1896 sec = START_SECTOR(clu);
1897 } else {
1898 sec++;
1899 }
1900 off = 0;
1901 buf_off += copy_entries << DENTRY_SIZE_BITS;
1902 }
1903 }
1904
1905 pr_debug("%s exited successfully\n", __func__);
1906 return FFS_SUCCESS;
1907 err_out:
1908 pr_debug("%s failed\n", __func__);
1909 return FFS_ERROR;
1910 }
1911
1912
1913 s32 write_whole_entry_set(struct super_block *sb, struct entry_set_cache_t *es)
1914 {
1915 return __write_partial_entries_in_entry_set(sb, es, es->sector,
1916 es->offset,
1917 es->num_entries);
1918 }
1919
1920
1921 s32 write_partial_entries_in_entry_set(struct super_block *sb,
1922 struct entry_set_cache_t *es, struct dentry_t *ep, u32 count)
1923 {
1924 s32 ret, byte_offset, off;
1925 u32 clu = 0;
1926 sector_t sec;
1927 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
1928 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
1929 struct chain_t dir;
1930
1931
1932 if (ep + count > ((struct dentry_t *)&(es->__buf)) + es->num_entries)
1933 return FFS_ERROR;
1934
1935 dir.dir = GET_CLUSTER_FROM_SECTOR(es->sector);
1936 dir.flags = es->alloc_flag;
1937 dir.size = 0xffffffff;
1938
1939 byte_offset = (es->sector - START_SECTOR(dir.dir)) <<
1940 p_bd->sector_size_bits;
1941 byte_offset += ((void **)ep - &(es->__buf)) + es->offset;
1942
1943 ret = _walk_fat_chain(sb, &dir, byte_offset, &clu);
1944 if (ret != FFS_SUCCESS)
1945 return ret;
1946
1947
1948 byte_offset &= p_fs->cluster_size - 1;
1949
1950
1951 off = byte_offset & p_bd->sector_size_mask;
1952
1953
1954 sec = byte_offset >> p_bd->sector_size_bits;
1955 sec += START_SECTOR(clu);
1956 return __write_partial_entries_in_entry_set(sb, es, sec, off, count);
1957 }
1958
1959
1960 s32 search_deleted_or_unused_entry(struct super_block *sb,
1961 struct chain_t *p_dir, s32 num_entries)
1962 {
1963 int i, dentry, num_empty = 0;
1964 s32 dentries_per_clu;
1965 u32 type;
1966 struct chain_t clu;
1967 struct dentry_t *ep;
1968 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
1969
1970 if (p_dir->dir == CLUSTER_32(0))
1971 dentries_per_clu = p_fs->dentries_in_root;
1972 else
1973 dentries_per_clu = p_fs->dentries_per_clu;
1974
1975 if (p_fs->hint_uentry.dir == p_dir->dir) {
1976 if (p_fs->hint_uentry.entry == -1)
1977 return -1;
1978
1979 clu.dir = p_fs->hint_uentry.clu.dir;
1980 clu.size = p_fs->hint_uentry.clu.size;
1981 clu.flags = p_fs->hint_uentry.clu.flags;
1982
1983 dentry = p_fs->hint_uentry.entry;
1984 } else {
1985 p_fs->hint_uentry.entry = -1;
1986
1987 clu.dir = p_dir->dir;
1988 clu.size = p_dir->size;
1989 clu.flags = p_dir->flags;
1990
1991 dentry = 0;
1992 }
1993
1994 while (clu.dir != CLUSTER_32(~0)) {
1995 if (p_fs->dev_ejected)
1996 break;
1997
1998 if (p_dir->dir == CLUSTER_32(0))
1999 i = dentry % dentries_per_clu;
2000 else
2001 i = dentry & (dentries_per_clu - 1);
2002
2003 for (; i < dentries_per_clu; i++, dentry++) {
2004 ep = get_entry_in_dir(sb, &clu, i, NULL);
2005 if (!ep)
2006 return -1;
2007
2008 type = p_fs->fs_func->get_entry_type(ep);
2009
2010 if (type == TYPE_UNUSED) {
2011 num_empty++;
2012 if (p_fs->hint_uentry.entry == -1) {
2013 p_fs->hint_uentry.dir = p_dir->dir;
2014 p_fs->hint_uentry.entry = dentry;
2015
2016 p_fs->hint_uentry.clu.dir = clu.dir;
2017 p_fs->hint_uentry.clu.size = clu.size;
2018 p_fs->hint_uentry.clu.flags = clu.flags;
2019 }
2020 } else if (type == TYPE_DELETED) {
2021 num_empty++;
2022 } else {
2023 num_empty = 0;
2024 }
2025
2026 if (num_empty >= num_entries) {
2027 p_fs->hint_uentry.dir = CLUSTER_32(~0);
2028 p_fs->hint_uentry.entry = -1;
2029
2030 if (p_fs->vol_type == EXFAT)
2031 return dentry - (num_entries - 1);
2032 else
2033 return dentry;
2034 }
2035 }
2036
2037 if (p_dir->dir == CLUSTER_32(0))
2038 break;
2039
2040 if (clu.flags == 0x03) {
2041 if ((--clu.size) > 0)
2042 clu.dir++;
2043 else
2044 clu.dir = CLUSTER_32(~0);
2045 } else {
2046 if (FAT_read(sb, clu.dir, &clu.dir) != 0)
2047 return -1;
2048 }
2049 }
2050
2051 return -1;
2052 }
2053
2054 s32 find_empty_entry(struct inode *inode, struct chain_t *p_dir, s32 num_entries)
2055 {
2056 s32 ret, dentry;
2057 u32 last_clu;
2058 sector_t sector;
2059 u64 size = 0;
2060 struct chain_t clu;
2061 struct dentry_t *ep = NULL;
2062 struct super_block *sb = inode->i_sb;
2063 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
2064 struct file_id_t *fid = &(EXFAT_I(inode)->fid);
2065
2066 if (p_dir->dir == CLUSTER_32(0))
2067 return search_deleted_or_unused_entry(sb, p_dir, num_entries);
2068
2069 while ((dentry = search_deleted_or_unused_entry(sb, p_dir, num_entries)) < 0) {
2070 if (p_fs->dev_ejected)
2071 break;
2072
2073 if (p_fs->vol_type == EXFAT) {
2074 if (p_dir->dir != p_fs->root_dir)
2075 size = i_size_read(inode);
2076 }
2077
2078 last_clu = find_last_cluster(sb, p_dir);
2079 clu.dir = last_clu + 1;
2080 clu.size = 0;
2081 clu.flags = p_dir->flags;
2082
2083
2084 ret = p_fs->fs_func->alloc_cluster(sb, 1, &clu);
2085 if (ret < 1)
2086 return -1;
2087
2088 if (clear_cluster(sb, clu.dir) != FFS_SUCCESS)
2089 return -1;
2090
2091
2092 if (clu.flags != p_dir->flags) {
2093 exfat_chain_cont_cluster(sb, p_dir->dir, p_dir->size);
2094 p_dir->flags = 0x01;
2095 p_fs->hint_uentry.clu.flags = 0x01;
2096 }
2097 if (clu.flags == 0x01)
2098 if (FAT_write(sb, last_clu, clu.dir) < 0)
2099 return -1;
2100
2101 if (p_fs->hint_uentry.entry == -1) {
2102 p_fs->hint_uentry.dir = p_dir->dir;
2103 p_fs->hint_uentry.entry = p_dir->size << (p_fs->cluster_size_bits - DENTRY_SIZE_BITS);
2104
2105 p_fs->hint_uentry.clu.dir = clu.dir;
2106 p_fs->hint_uentry.clu.size = 0;
2107 p_fs->hint_uentry.clu.flags = clu.flags;
2108 }
2109 p_fs->hint_uentry.clu.size++;
2110 p_dir->size++;
2111
2112
2113 if (p_fs->vol_type == EXFAT) {
2114 if (p_dir->dir != p_fs->root_dir) {
2115 size += p_fs->cluster_size;
2116
2117 ep = get_entry_in_dir(sb, &fid->dir,
2118 fid->entry + 1, §or);
2119 if (!ep)
2120 return -1;
2121 p_fs->fs_func->set_entry_size(ep, size);
2122 p_fs->fs_func->set_entry_flag(ep, p_dir->flags);
2123 buf_modify(sb, sector);
2124
2125 update_dir_checksum(sb, &(fid->dir),
2126 fid->entry);
2127 }
2128 }
2129
2130 i_size_write(inode, i_size_read(inode) + p_fs->cluster_size);
2131 EXFAT_I(inode)->mmu_private += p_fs->cluster_size;
2132 EXFAT_I(inode)->fid.size += p_fs->cluster_size;
2133 EXFAT_I(inode)->fid.flags = p_dir->flags;
2134 inode->i_blocks += 1 << (p_fs->cluster_size_bits - 9);
2135 }
2136
2137 return dentry;
2138 }
2139
2140
2141
2142
2143
2144
2145 s32 fat_find_dir_entry(struct super_block *sb, struct chain_t *p_dir,
2146 struct uni_name_t *p_uniname, s32 num_entries,
2147 struct dos_name_t *p_dosname, u32 type)
2148 {
2149 int i, dentry = 0, len;
2150 s32 order = 0;
2151 bool is_feasible_entry = true, has_ext_entry = false;
2152 s32 dentries_per_clu;
2153 u32 entry_type;
2154 u16 entry_uniname[14], *uniname = NULL, unichar;
2155 struct chain_t clu;
2156 struct dentry_t *ep;
2157 struct dos_dentry_t *dos_ep;
2158 struct ext_dentry_t *ext_ep;
2159 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
2160
2161 if (p_dir->dir == p_fs->root_dir) {
2162 if ((!nls_uniname_cmp(sb, p_uniname->name,
2163 (u16 *)UNI_CUR_DIR_NAME)) ||
2164 (!nls_uniname_cmp(sb, p_uniname->name,
2165 (u16 *)UNI_PAR_DIR_NAME)))
2166 return -1;
2167 }
2168
2169 if (p_dir->dir == CLUSTER_32(0))
2170 dentries_per_clu = p_fs->dentries_in_root;
2171 else
2172 dentries_per_clu = p_fs->dentries_per_clu;
2173
2174 clu.dir = p_dir->dir;
2175 clu.flags = p_dir->flags;
2176
2177 while (clu.dir != CLUSTER_32(~0)) {
2178 if (p_fs->dev_ejected)
2179 break;
2180
2181 for (i = 0; i < dentries_per_clu; i++, dentry++) {
2182 ep = get_entry_in_dir(sb, &clu, i, NULL);
2183 if (!ep)
2184 return -2;
2185
2186 entry_type = p_fs->fs_func->get_entry_type(ep);
2187
2188 if ((entry_type == TYPE_FILE) || (entry_type == TYPE_DIR)) {
2189 if ((type == TYPE_ALL) || (type == entry_type)) {
2190 if (is_feasible_entry && has_ext_entry)
2191 return dentry;
2192
2193 dos_ep = (struct dos_dentry_t *)ep;
2194 if (!nls_dosname_cmp(sb, p_dosname->name, dos_ep->name))
2195 return dentry;
2196 }
2197 is_feasible_entry = true;
2198 has_ext_entry = false;
2199 } else if (entry_type == TYPE_EXTEND) {
2200 if (is_feasible_entry) {
2201 ext_ep = (struct ext_dentry_t *)ep;
2202 if (ext_ep->order > 0x40) {
2203 order = (s32)(ext_ep->order - 0x40);
2204 uniname = p_uniname->name + 13 * (order - 1);
2205 } else {
2206 order = (s32)ext_ep->order;
2207 uniname -= 13;
2208 }
2209
2210 len = extract_uni_name_from_ext_entry(ext_ep, entry_uniname, order);
2211
2212 unichar = *(uniname + len);
2213 *(uniname + len) = 0x0;
2214
2215 if (nls_uniname_cmp(sb, uniname, entry_uniname))
2216 is_feasible_entry = false;
2217
2218 *(uniname + len) = unichar;
2219 }
2220 has_ext_entry = true;
2221 } else if (entry_type == TYPE_UNUSED) {
2222 return -2;
2223 }
2224 is_feasible_entry = true;
2225 has_ext_entry = false;
2226 }
2227
2228 if (p_dir->dir == CLUSTER_32(0))
2229 break;
2230
2231 if (FAT_read(sb, clu.dir, &clu.dir) != 0)
2232 return -2;
2233 }
2234
2235 return -2;
2236 }
2237
2238
2239
2240
2241
2242
2243 s32 exfat_find_dir_entry(struct super_block *sb, struct chain_t *p_dir,
2244 struct uni_name_t *p_uniname, s32 num_entries,
2245 struct dos_name_t *p_dosname, u32 type)
2246 {
2247 int i = 0, dentry = 0, num_ext_entries = 0, len, step;
2248 s32 order = 0;
2249 bool is_feasible_entry = false;
2250 s32 dentries_per_clu, num_empty = 0;
2251 u32 entry_type;
2252 u16 entry_uniname[16], *uniname = NULL, unichar;
2253 struct chain_t clu;
2254 struct dentry_t *ep;
2255 struct file_dentry_t *file_ep;
2256 struct strm_dentry_t *strm_ep;
2257 struct name_dentry_t *name_ep;
2258 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
2259
2260 if (p_dir->dir == p_fs->root_dir) {
2261 if ((!nls_uniname_cmp(sb, p_uniname->name,
2262 (u16 *)UNI_CUR_DIR_NAME)) ||
2263 (!nls_uniname_cmp(sb, p_uniname->name,
2264 (u16 *)UNI_PAR_DIR_NAME)))
2265 return -1;
2266 }
2267
2268 if (p_dir->dir == CLUSTER_32(0))
2269 dentries_per_clu = p_fs->dentries_in_root;
2270 else
2271 dentries_per_clu = p_fs->dentries_per_clu;
2272
2273 clu.dir = p_dir->dir;
2274 clu.size = p_dir->size;
2275 clu.flags = p_dir->flags;
2276
2277 p_fs->hint_uentry.dir = p_dir->dir;
2278 p_fs->hint_uentry.entry = -1;
2279
2280 while (clu.dir != CLUSTER_32(~0)) {
2281 if (p_fs->dev_ejected)
2282 break;
2283
2284 while (i < dentries_per_clu) {
2285 ep = get_entry_in_dir(sb, &clu, i, NULL);
2286 if (!ep)
2287 return -2;
2288
2289 entry_type = p_fs->fs_func->get_entry_type(ep);
2290 step = 1;
2291
2292 if ((entry_type == TYPE_UNUSED) || (entry_type == TYPE_DELETED)) {
2293 is_feasible_entry = false;
2294
2295 if (p_fs->hint_uentry.entry == -1) {
2296 num_empty++;
2297
2298 if (num_empty == 1) {
2299 p_fs->hint_uentry.clu.dir = clu.dir;
2300 p_fs->hint_uentry.clu.size = clu.size;
2301 p_fs->hint_uentry.clu.flags = clu.flags;
2302 }
2303 if ((num_empty >= num_entries) || (entry_type == TYPE_UNUSED))
2304 p_fs->hint_uentry.entry = dentry - (num_empty - 1);
2305 }
2306
2307 if (entry_type == TYPE_UNUSED)
2308 return -2;
2309 } else {
2310 num_empty = 0;
2311
2312 if ((entry_type == TYPE_FILE) || (entry_type == TYPE_DIR)) {
2313 file_ep = (struct file_dentry_t *)ep;
2314 if ((type == TYPE_ALL) || (type == entry_type)) {
2315 num_ext_entries = file_ep->num_ext;
2316 is_feasible_entry = true;
2317 } else {
2318 is_feasible_entry = false;
2319 step = file_ep->num_ext + 1;
2320 }
2321 } else if (entry_type == TYPE_STREAM) {
2322 if (is_feasible_entry) {
2323 strm_ep = (struct strm_dentry_t *)ep;
2324 if (p_uniname->name_hash == GET16_A(strm_ep->name_hash) &&
2325 p_uniname->name_len == strm_ep->name_len) {
2326 order = 1;
2327 } else {
2328 is_feasible_entry = false;
2329 step = num_ext_entries;
2330 }
2331 }
2332 } else if (entry_type == TYPE_EXTEND) {
2333 if (is_feasible_entry) {
2334 name_ep = (struct name_dentry_t *)ep;
2335
2336 if ((++order) == 2)
2337 uniname = p_uniname->name;
2338 else
2339 uniname += 15;
2340
2341 len = extract_uni_name_from_name_entry(name_ep,
2342 entry_uniname, order);
2343
2344 unichar = *(uniname + len);
2345 *(uniname + len) = 0x0;
2346
2347 if (nls_uniname_cmp(sb, uniname, entry_uniname)) {
2348 is_feasible_entry = false;
2349 step = num_ext_entries - order + 1;
2350 } else if (order == num_ext_entries) {
2351 p_fs->hint_uentry.dir = CLUSTER_32(~0);
2352 p_fs->hint_uentry.entry = -1;
2353 return dentry - (num_ext_entries);
2354 }
2355
2356 *(uniname + len) = unichar;
2357 }
2358 } else {
2359 is_feasible_entry = false;
2360 }
2361 }
2362
2363 i += step;
2364 dentry += step;
2365 }
2366
2367 i -= dentries_per_clu;
2368
2369 if (p_dir->dir == CLUSTER_32(0))
2370 break;
2371
2372 if (clu.flags == 0x03) {
2373 if ((--clu.size) > 0)
2374 clu.dir++;
2375 else
2376 clu.dir = CLUSTER_32(~0);
2377 } else {
2378 if (FAT_read(sb, clu.dir, &clu.dir) != 0)
2379 return -2;
2380 }
2381 }
2382
2383 return -2;
2384 }
2385
2386 s32 fat_count_ext_entries(struct super_block *sb, struct chain_t *p_dir,
2387 s32 entry, struct dentry_t *p_entry)
2388 {
2389 s32 count = 0;
2390 u8 chksum;
2391 struct dos_dentry_t *dos_ep = (struct dos_dentry_t *)p_entry;
2392 struct ext_dentry_t *ext_ep;
2393 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
2394
2395 chksum = calc_checksum_1byte((void *)dos_ep->name, DOS_NAME_LENGTH, 0);
2396
2397 for (entry--; entry >= 0; entry--) {
2398 ext_ep = (struct ext_dentry_t *)get_entry_in_dir(sb, p_dir,
2399 entry, NULL);
2400 if (!ext_ep)
2401 return -1;
2402
2403 if ((p_fs->fs_func->get_entry_type((struct dentry_t *)ext_ep) ==
2404 TYPE_EXTEND) && (ext_ep->checksum == chksum)) {
2405 count++;
2406 if (ext_ep->order > 0x40)
2407 return count;
2408 } else {
2409 return count;
2410 }
2411 }
2412
2413 return count;
2414 }
2415
2416 s32 exfat_count_ext_entries(struct super_block *sb, struct chain_t *p_dir,
2417 s32 entry, struct dentry_t *p_entry)
2418 {
2419 int i, count = 0;
2420 u32 type;
2421 struct file_dentry_t *file_ep = (struct file_dentry_t *)p_entry;
2422 struct dentry_t *ext_ep;
2423 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
2424
2425 for (i = 0, entry++; i < file_ep->num_ext; i++, entry++) {
2426 ext_ep = get_entry_in_dir(sb, p_dir, entry, NULL);
2427 if (!ext_ep)
2428 return -1;
2429
2430 type = p_fs->fs_func->get_entry_type(ext_ep);
2431 if ((type == TYPE_EXTEND) || (type == TYPE_STREAM))
2432 count++;
2433 else
2434 return count;
2435 }
2436
2437 return count;
2438 }
2439
2440 s32 count_dos_name_entries(struct super_block *sb, struct chain_t *p_dir,
2441 u32 type)
2442 {
2443 int i, count = 0;
2444 s32 dentries_per_clu;
2445 u32 entry_type;
2446 struct chain_t clu;
2447 struct dentry_t *ep;
2448 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
2449
2450 if (p_dir->dir == CLUSTER_32(0))
2451 dentries_per_clu = p_fs->dentries_in_root;
2452 else
2453 dentries_per_clu = p_fs->dentries_per_clu;
2454
2455 clu.dir = p_dir->dir;
2456 clu.size = p_dir->size;
2457 clu.flags = p_dir->flags;
2458
2459 while (clu.dir != CLUSTER_32(~0)) {
2460 if (p_fs->dev_ejected)
2461 break;
2462
2463 for (i = 0; i < dentries_per_clu; i++) {
2464 ep = get_entry_in_dir(sb, &clu, i, NULL);
2465 if (!ep)
2466 return -1;
2467
2468 entry_type = p_fs->fs_func->get_entry_type(ep);
2469
2470 if (entry_type == TYPE_UNUSED)
2471 return count;
2472 if (!(type & TYPE_CRITICAL_PRI) &&
2473 !(type & TYPE_BENIGN_PRI))
2474 continue;
2475
2476 if ((type == TYPE_ALL) || (type == entry_type))
2477 count++;
2478 }
2479
2480 if (p_dir->dir == CLUSTER_32(0))
2481 break;
2482
2483 if (clu.flags == 0x03) {
2484 if ((--clu.size) > 0)
2485 clu.dir++;
2486 else
2487 clu.dir = CLUSTER_32(~0);
2488 } else {
2489 if (FAT_read(sb, clu.dir, &clu.dir) != 0)
2490 return -1;
2491 }
2492 }
2493
2494 return count;
2495 }
2496
2497 bool is_dir_empty(struct super_block *sb, struct chain_t *p_dir)
2498 {
2499 int i, count = 0;
2500 s32 dentries_per_clu;
2501 u32 type;
2502 struct chain_t clu;
2503 struct dentry_t *ep;
2504 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
2505
2506 if (p_dir->dir == CLUSTER_32(0))
2507 dentries_per_clu = p_fs->dentries_in_root;
2508 else
2509 dentries_per_clu = p_fs->dentries_per_clu;
2510
2511 clu.dir = p_dir->dir;
2512 clu.size = p_dir->size;
2513 clu.flags = p_dir->flags;
2514
2515 while (clu.dir != CLUSTER_32(~0)) {
2516 if (p_fs->dev_ejected)
2517 break;
2518
2519 for (i = 0; i < dentries_per_clu; i++) {
2520 ep = get_entry_in_dir(sb, &clu, i, NULL);
2521 if (!ep)
2522 break;
2523
2524 type = p_fs->fs_func->get_entry_type(ep);
2525
2526 if (type == TYPE_UNUSED)
2527 return true;
2528 if ((type != TYPE_FILE) && (type != TYPE_DIR))
2529 continue;
2530
2531 if (p_dir->dir == CLUSTER_32(0))
2532 return false;
2533
2534 if (p_fs->vol_type == EXFAT)
2535 return false;
2536 if ((p_dir->dir == p_fs->root_dir) || ((++count) > 2))
2537 return false;
2538 }
2539
2540 if (p_dir->dir == CLUSTER_32(0))
2541 break;
2542
2543 if (clu.flags == 0x03) {
2544 if ((--clu.size) > 0)
2545 clu.dir++;
2546 else
2547 clu.dir = CLUSTER_32(~0);
2548 }
2549 if (FAT_read(sb, clu.dir, &clu.dir) != 0)
2550 break;
2551 }
2552
2553 return true;
2554 }
2555
2556
2557
2558
2559
2560
2561
2562
2563 s32 get_num_entries_and_dos_name(struct super_block *sb, struct chain_t *p_dir,
2564 struct uni_name_t *p_uniname, s32 *entries,
2565 struct dos_name_t *p_dosname)
2566 {
2567 s32 ret, num_entries;
2568 bool lossy = false;
2569 char **r;
2570 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
2571
2572 num_entries = p_fs->fs_func->calc_num_entries(p_uniname);
2573 if (num_entries == 0)
2574 return FFS_INVALIDPATH;
2575
2576 if (p_fs->vol_type != EXFAT) {
2577 nls_uniname_to_dosname(sb, p_dosname, p_uniname, &lossy);
2578
2579 if (lossy) {
2580 ret = fat_generate_dos_name(sb, p_dir, p_dosname);
2581 if (ret)
2582 return ret;
2583 } else {
2584 for (r = reserved_names; *r; r++) {
2585 if (!strncmp((void *)p_dosname->name, *r, 8))
2586 return FFS_INVALIDPATH;
2587 }
2588
2589 if (p_dosname->name_case != 0xFF)
2590 num_entries = 1;
2591 }
2592
2593 if (num_entries > 1)
2594 p_dosname->name_case = 0x0;
2595 }
2596
2597 *entries = num_entries;
2598
2599 return FFS_SUCCESS;
2600 }
2601
2602 void get_uni_name_from_dos_entry(struct super_block *sb,
2603 struct dos_dentry_t *ep,
2604 struct uni_name_t *p_uniname, u8 mode)
2605 {
2606 struct dos_name_t dos_name;
2607
2608 if (mode == 0x0)
2609 dos_name.name_case = 0x0;
2610 else
2611 dos_name.name_case = ep->lcase;
2612
2613 memcpy(dos_name.name, ep->name, DOS_NAME_LENGTH);
2614 nls_dosname_to_uniname(sb, p_uniname, &dos_name);
2615 }
2616
2617 void fat_get_uni_name_from_ext_entry(struct super_block *sb,
2618 struct chain_t *p_dir, s32 entry,
2619 u16 *uniname)
2620 {
2621 int i;
2622 struct ext_dentry_t *ep;
2623 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
2624
2625 for (entry--, i = 1; entry >= 0; entry--, i++) {
2626 ep = (struct ext_dentry_t *)get_entry_in_dir(sb, p_dir, entry,
2627 NULL);
2628 if (!ep)
2629 return;
2630
2631 if (p_fs->fs_func->get_entry_type((struct dentry_t *)ep) ==
2632 TYPE_EXTEND) {
2633 extract_uni_name_from_ext_entry(ep, uniname, i);
2634 if (ep->order > 0x40)
2635 return;
2636 } else {
2637 return;
2638 }
2639
2640 uniname += 13;
2641 }
2642 }
2643
2644 void exfat_get_uni_name_from_ext_entry(struct super_block *sb,
2645 struct chain_t *p_dir, s32 entry,
2646 u16 *uniname)
2647 {
2648 int i;
2649 struct dentry_t *ep;
2650 struct entry_set_cache_t *es;
2651 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
2652
2653 es = get_entry_set_in_dir(sb, p_dir, entry, ES_ALL_ENTRIES, &ep);
2654 if (!es || es->num_entries < 3) {
2655 if (es)
2656 release_entry_set(es);
2657 return;
2658 }
2659
2660 ep += 2;
2661
2662
2663
2664
2665
2666
2667
2668 for (i = 2; i < es->num_entries; i++, ep++) {
2669 if (p_fs->fs_func->get_entry_type(ep) == TYPE_EXTEND)
2670 extract_uni_name_from_name_entry((struct name_dentry_t *)
2671 ep, uniname, i);
2672 else
2673 goto out;
2674 uniname += 15;
2675 }
2676
2677 out:
2678 release_entry_set(es);
2679 }
2680
2681 s32 extract_uni_name_from_ext_entry(struct ext_dentry_t *ep, u16 *uniname,
2682 s32 order)
2683 {
2684 int i, len = 0;
2685
2686 for (i = 0; i < 10; i += 2) {
2687 *uniname = GET16(ep->unicode_0_4 + i);
2688 if (*uniname == 0x0)
2689 return len;
2690 uniname++;
2691 len++;
2692 }
2693
2694 if (order < 20) {
2695 for (i = 0; i < 12; i += 2) {
2696 *uniname = GET16_A(ep->unicode_5_10 + i);
2697 if (*uniname == 0x0)
2698 return len;
2699 uniname++;
2700 len++;
2701 }
2702 } else {
2703 for (i = 0; i < 8; i += 2) {
2704 *uniname = GET16_A(ep->unicode_5_10 + i);
2705 if (*uniname == 0x0)
2706 return len;
2707 uniname++;
2708 len++;
2709 }
2710 *uniname = 0x0;
2711 return len;
2712 }
2713
2714 for (i = 0; i < 4; i += 2) {
2715 *uniname = GET16_A(ep->unicode_11_12 + i);
2716 if (*uniname == 0x0)
2717 return len;
2718 uniname++;
2719 len++;
2720 }
2721
2722 *uniname = 0x0;
2723 return len;
2724 }
2725
2726 s32 extract_uni_name_from_name_entry(struct name_dentry_t *ep, u16 *uniname,
2727 s32 order)
2728 {
2729 int i, len = 0;
2730
2731 for (i = 0; i < 30; i += 2) {
2732 *uniname = GET16_A(ep->unicode_0_14 + i);
2733 if (*uniname == 0x0)
2734 return len;
2735 uniname++;
2736 len++;
2737 }
2738
2739 *uniname = 0x0;
2740 return len;
2741 }
2742
2743 s32 fat_generate_dos_name(struct super_block *sb, struct chain_t *p_dir,
2744 struct dos_name_t *p_dosname)
2745 {
2746 int i, j, count = 0;
2747 bool count_begin = false;
2748 s32 dentries_per_clu;
2749 u32 type;
2750 u8 bmap[128];
2751 struct chain_t clu;
2752 struct dos_dentry_t *ep;
2753 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
2754
2755 memset(bmap, 0, sizeof(bmap));
2756 exfat_bitmap_set(bmap, 0);
2757
2758 if (p_dir->dir == CLUSTER_32(0))
2759 dentries_per_clu = p_fs->dentries_in_root;
2760 else
2761 dentries_per_clu = p_fs->dentries_per_clu;
2762
2763 clu.dir = p_dir->dir;
2764 clu.flags = p_dir->flags;
2765
2766 while (clu.dir != CLUSTER_32(~0)) {
2767 if (p_fs->dev_ejected)
2768 break;
2769
2770 for (i = 0; i < dentries_per_clu; i++) {
2771 ep = (struct dos_dentry_t *)get_entry_in_dir(sb, &clu,
2772 i, NULL);
2773 if (!ep)
2774 return FFS_MEDIAERR;
2775
2776 type = p_fs->fs_func->get_entry_type((struct dentry_t *)
2777 ep);
2778
2779 if (type == TYPE_UNUSED)
2780 break;
2781 if ((type != TYPE_FILE) && (type != TYPE_DIR))
2782 continue;
2783
2784 count = 0;
2785 count_begin = false;
2786
2787 for (j = 0; j < 8; j++) {
2788 if (ep->name[j] == ' ')
2789 break;
2790
2791 if (ep->name[j] == '~') {
2792 count_begin = true;
2793 } else if (count_begin) {
2794 if ((ep->name[j] >= '0') &&
2795 (ep->name[j] <= '9')) {
2796 count = count * 10 +
2797 (ep->name[j] - '0');
2798 } else {
2799 count = 0;
2800 count_begin = false;
2801 }
2802 }
2803 }
2804
2805 if ((count > 0) && (count < 1024))
2806 exfat_bitmap_set(bmap, count);
2807 }
2808
2809 if (p_dir->dir == CLUSTER_32(0))
2810 break;
2811
2812 if (FAT_read(sb, clu.dir, &clu.dir) != 0)
2813 return FFS_MEDIAERR;
2814 }
2815
2816 count = 0;
2817 for (i = 0; i < 128; i++) {
2818 if (bmap[i] != 0xFF) {
2819 for (j = 0; j < 8; j++) {
2820 if (exfat_bitmap_test(&bmap[i], j) == 0) {
2821 count = (i << 3) + j;
2822 break;
2823 }
2824 }
2825 if (count != 0)
2826 break;
2827 }
2828 }
2829
2830 if ((count == 0) || (count >= 1024))
2831 return FFS_FILEEXIST;
2832 fat_attach_count_to_dos_name(p_dosname->name, count);
2833
2834
2835 return FFS_SUCCESS;
2836 }
2837
2838 void fat_attach_count_to_dos_name(u8 *dosname, s32 count)
2839 {
2840 int i, j, length;
2841 char str_count[6];
2842
2843 snprintf(str_count, sizeof(str_count), "~%d", count);
2844 length = strlen(str_count);
2845
2846 i = 0;
2847 j = 0;
2848 while (j <= (8 - length)) {
2849 i = j;
2850 if (dosname[j] == ' ')
2851 break;
2852 if (dosname[j] & 0x80)
2853 j += 2;
2854 else
2855 j++;
2856 }
2857
2858 for (j = 0; j < length; i++, j++)
2859 dosname[i] = (u8)str_count[j];
2860
2861 if (i == 7)
2862 dosname[7] = ' ';
2863 }
2864
2865 s32 fat_calc_num_entries(struct uni_name_t *p_uniname)
2866 {
2867 s32 len;
2868
2869 len = p_uniname->name_len;
2870 if (len == 0)
2871 return 0;
2872
2873
2874 return (len - 1) / 13 + 2;
2875 }
2876
2877 s32 exfat_calc_num_entries(struct uni_name_t *p_uniname)
2878 {
2879 s32 len;
2880
2881 len = p_uniname->name_len;
2882 if (len == 0)
2883 return 0;
2884
2885
2886 return (len - 1) / 15 + 3;
2887 }
2888
2889 u8 calc_checksum_1byte(void *data, s32 len, u8 chksum)
2890 {
2891 int i;
2892 u8 *c = (u8 *)data;
2893
2894 for (i = 0; i < len; i++, c++)
2895 chksum = (((chksum & 1) << 7) | ((chksum & 0xFE) >> 1)) + *c;
2896
2897 return chksum;
2898 }
2899
2900 u16 calc_checksum_2byte(void *data, s32 len, u16 chksum, s32 type)
2901 {
2902 int i;
2903 u8 *c = (u8 *)data;
2904
2905 switch (type) {
2906 case CS_DIR_ENTRY:
2907 for (i = 0; i < len; i++, c++) {
2908 if ((i == 2) || (i == 3))
2909 continue;
2910 chksum = (((chksum & 1) << 15) |
2911 ((chksum & 0xFFFE) >> 1)) + (u16)*c;
2912 }
2913 break;
2914 default
2915 :
2916 for (i = 0; i < len; i++, c++)
2917 chksum = (((chksum & 1) << 15) |
2918 ((chksum & 0xFFFE) >> 1)) + (u16)*c;
2919 }
2920
2921 return chksum;
2922 }
2923
2924 u32 calc_checksum_4byte(void *data, s32 len, u32 chksum, s32 type)
2925 {
2926 int i;
2927 u8 *c = (u8 *)data;
2928
2929 switch (type) {
2930 case CS_PBR_SECTOR:
2931 for (i = 0; i < len; i++, c++) {
2932 if ((i == 106) || (i == 107) || (i == 112))
2933 continue;
2934 chksum = (((chksum & 1) << 31) |
2935 ((chksum & 0xFFFFFFFE) >> 1)) + (u32)*c;
2936 }
2937 break;
2938 default
2939 :
2940 for (i = 0; i < len; i++, c++)
2941 chksum = (((chksum & 1) << 31) |
2942 ((chksum & 0xFFFFFFFE) >> 1)) + (u32)*c;
2943 }
2944
2945 return chksum;
2946 }
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956 s32 resolve_path(struct inode *inode, char *path, struct chain_t *p_dir,
2957 struct uni_name_t *p_uniname)
2958 {
2959 bool lossy = false;
2960 struct super_block *sb = inode->i_sb;
2961 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
2962 struct file_id_t *fid = &(EXFAT_I(inode)->fid);
2963
2964 if (strscpy(name_buf, path, sizeof(name_buf)) < 0)
2965 return FFS_INVALIDPATH;
2966
2967 nls_cstring_to_uniname(sb, p_uniname, name_buf, &lossy);
2968 if (lossy)
2969 return FFS_INVALIDPATH;
2970
2971 fid->size = i_size_read(inode);
2972
2973 p_dir->dir = fid->start_clu;
2974 p_dir->size = (s32)(fid->size >> p_fs->cluster_size_bits);
2975 p_dir->flags = fid->flags;
2976
2977 return FFS_SUCCESS;
2978 }
2979
2980
2981
2982
2983 static struct fs_func fat_fs_func = {
2984 .alloc_cluster = fat_alloc_cluster,
2985 .free_cluster = fat_free_cluster,
2986 .count_used_clusters = fat_count_used_clusters,
2987
2988 .init_dir_entry = fat_init_dir_entry,
2989 .init_ext_entry = fat_init_ext_entry,
2990 .find_dir_entry = fat_find_dir_entry,
2991 .delete_dir_entry = fat_delete_dir_entry,
2992 .get_uni_name_from_ext_entry = fat_get_uni_name_from_ext_entry,
2993 .count_ext_entries = fat_count_ext_entries,
2994 .calc_num_entries = fat_calc_num_entries,
2995
2996 .get_entry_type = fat_get_entry_type,
2997 .set_entry_type = fat_set_entry_type,
2998 .get_entry_attr = fat_get_entry_attr,
2999 .set_entry_attr = fat_set_entry_attr,
3000 .get_entry_flag = fat_get_entry_flag,
3001 .set_entry_flag = fat_set_entry_flag,
3002 .get_entry_clu0 = fat_get_entry_clu0,
3003 .set_entry_clu0 = fat_set_entry_clu0,
3004 .get_entry_size = fat_get_entry_size,
3005 .set_entry_size = fat_set_entry_size,
3006 .get_entry_time = fat_get_entry_time,
3007 .set_entry_time = fat_set_entry_time,
3008 };
3009
3010 s32 fat16_mount(struct super_block *sb, struct pbr_sector_t *p_pbr)
3011 {
3012 s32 num_reserved, num_root_sectors;
3013 struct bpb16_t *p_bpb = (struct bpb16_t *)p_pbr->bpb;
3014 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
3015 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
3016
3017 if (p_bpb->num_fats == 0)
3018 return FFS_FORMATERR;
3019
3020 num_root_sectors = GET16(p_bpb->num_root_entries) << DENTRY_SIZE_BITS;
3021 num_root_sectors = ((num_root_sectors - 1) >>
3022 p_bd->sector_size_bits) + 1;
3023
3024 p_fs->sectors_per_clu = p_bpb->sectors_per_clu;
3025 p_fs->sectors_per_clu_bits = ilog2(p_bpb->sectors_per_clu);
3026 p_fs->cluster_size_bits = p_fs->sectors_per_clu_bits +
3027 p_bd->sector_size_bits;
3028 p_fs->cluster_size = 1 << p_fs->cluster_size_bits;
3029
3030 p_fs->num_FAT_sectors = GET16(p_bpb->num_fat_sectors);
3031
3032 p_fs->FAT1_start_sector = p_fs->PBR_sector + GET16(p_bpb->num_reserved);
3033 if (p_bpb->num_fats == 1)
3034 p_fs->FAT2_start_sector = p_fs->FAT1_start_sector;
3035 else
3036 p_fs->FAT2_start_sector = p_fs->FAT1_start_sector +
3037 p_fs->num_FAT_sectors;
3038
3039 p_fs->root_start_sector = p_fs->FAT2_start_sector +
3040 p_fs->num_FAT_sectors;
3041 p_fs->data_start_sector = p_fs->root_start_sector + num_root_sectors;
3042
3043 p_fs->num_sectors = GET16(p_bpb->num_sectors);
3044 if (p_fs->num_sectors == 0)
3045 p_fs->num_sectors = GET32(p_bpb->num_huge_sectors);
3046
3047 num_reserved = p_fs->data_start_sector - p_fs->PBR_sector;
3048 p_fs->num_clusters = ((p_fs->num_sectors - num_reserved) >>
3049 p_fs->sectors_per_clu_bits) + 2;
3050
3051
3052 if (p_fs->num_clusters < FAT12_THRESHOLD)
3053 p_fs->vol_type = FAT12;
3054 else
3055 p_fs->vol_type = FAT16;
3056 p_fs->vol_id = GET32(p_bpb->vol_serial);
3057
3058 p_fs->root_dir = 0;
3059 p_fs->dentries_in_root = GET16(p_bpb->num_root_entries);
3060 p_fs->dentries_per_clu = 1 << (p_fs->cluster_size_bits -
3061 DENTRY_SIZE_BITS);
3062
3063 p_fs->vol_flag = VOL_CLEAN;
3064 p_fs->clu_srch_ptr = 2;
3065 p_fs->used_clusters = UINT_MAX;
3066
3067 p_fs->fs_func = &fat_fs_func;
3068
3069 return FFS_SUCCESS;
3070 }
3071
3072 s32 fat32_mount(struct super_block *sb, struct pbr_sector_t *p_pbr)
3073 {
3074 s32 num_reserved;
3075 struct bpb32_t *p_bpb = (struct bpb32_t *)p_pbr->bpb;
3076 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
3077 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
3078
3079 if (p_bpb->num_fats == 0)
3080 return FFS_FORMATERR;
3081
3082 p_fs->sectors_per_clu = p_bpb->sectors_per_clu;
3083 p_fs->sectors_per_clu_bits = ilog2(p_bpb->sectors_per_clu);
3084 p_fs->cluster_size_bits = p_fs->sectors_per_clu_bits +
3085 p_bd->sector_size_bits;
3086 p_fs->cluster_size = 1 << p_fs->cluster_size_bits;
3087
3088 p_fs->num_FAT_sectors = GET32(p_bpb->num_fat32_sectors);
3089
3090 p_fs->FAT1_start_sector = p_fs->PBR_sector + GET16(p_bpb->num_reserved);
3091 if (p_bpb->num_fats == 1)
3092 p_fs->FAT2_start_sector = p_fs->FAT1_start_sector;
3093 else
3094 p_fs->FAT2_start_sector = p_fs->FAT1_start_sector +
3095 p_fs->num_FAT_sectors;
3096
3097 p_fs->root_start_sector = p_fs->FAT2_start_sector +
3098 p_fs->num_FAT_sectors;
3099 p_fs->data_start_sector = p_fs->root_start_sector;
3100
3101 p_fs->num_sectors = GET32(p_bpb->num_huge_sectors);
3102 num_reserved = p_fs->data_start_sector - p_fs->PBR_sector;
3103
3104 p_fs->num_clusters = ((p_fs->num_sectors - num_reserved) >>
3105 p_fs->sectors_per_clu_bits) + 2;
3106
3107
3108 p_fs->vol_type = FAT32;
3109 p_fs->vol_id = GET32(p_bpb->vol_serial);
3110
3111 p_fs->root_dir = GET32(p_bpb->root_cluster);
3112 p_fs->dentries_in_root = 0;
3113 p_fs->dentries_per_clu = 1 << (p_fs->cluster_size_bits -
3114 DENTRY_SIZE_BITS);
3115
3116 p_fs->vol_flag = VOL_CLEAN;
3117 p_fs->clu_srch_ptr = 2;
3118 p_fs->used_clusters = UINT_MAX;
3119
3120 p_fs->fs_func = &fat_fs_func;
3121
3122 return FFS_SUCCESS;
3123 }
3124
3125 static struct fs_func exfat_fs_func = {
3126 .alloc_cluster = exfat_alloc_cluster,
3127 .free_cluster = exfat_free_cluster,
3128 .count_used_clusters = exfat_count_used_clusters,
3129
3130 .init_dir_entry = exfat_init_dir_entry,
3131 .init_ext_entry = exfat_init_ext_entry,
3132 .find_dir_entry = exfat_find_dir_entry,
3133 .delete_dir_entry = exfat_delete_dir_entry,
3134 .get_uni_name_from_ext_entry = exfat_get_uni_name_from_ext_entry,
3135 .count_ext_entries = exfat_count_ext_entries,
3136 .calc_num_entries = exfat_calc_num_entries,
3137
3138 .get_entry_type = exfat_get_entry_type,
3139 .set_entry_type = exfat_set_entry_type,
3140 .get_entry_attr = exfat_get_entry_attr,
3141 .set_entry_attr = exfat_set_entry_attr,
3142 .get_entry_flag = exfat_get_entry_flag,
3143 .set_entry_flag = exfat_set_entry_flag,
3144 .get_entry_clu0 = exfat_get_entry_clu0,
3145 .set_entry_clu0 = exfat_set_entry_clu0,
3146 .get_entry_size = exfat_get_entry_size,
3147 .set_entry_size = exfat_set_entry_size,
3148 .get_entry_time = exfat_get_entry_time,
3149 .set_entry_time = exfat_set_entry_time,
3150 };
3151
3152 s32 exfat_mount(struct super_block *sb, struct pbr_sector_t *p_pbr)
3153 {
3154 struct bpbex_t *p_bpb = (struct bpbex_t *)p_pbr->bpb;
3155 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
3156 struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info);
3157
3158 if (p_bpb->num_fats == 0)
3159 return FFS_FORMATERR;
3160
3161 p_fs->sectors_per_clu = 1 << p_bpb->sectors_per_clu_bits;
3162 p_fs->sectors_per_clu_bits = p_bpb->sectors_per_clu_bits;
3163 p_fs->cluster_size_bits = p_fs->sectors_per_clu_bits +
3164 p_bd->sector_size_bits;
3165 p_fs->cluster_size = 1 << p_fs->cluster_size_bits;
3166
3167 p_fs->num_FAT_sectors = GET32(p_bpb->fat_length);
3168
3169 p_fs->FAT1_start_sector = p_fs->PBR_sector + GET32(p_bpb->fat_offset);
3170 if (p_bpb->num_fats == 1)
3171 p_fs->FAT2_start_sector = p_fs->FAT1_start_sector;
3172 else
3173 p_fs->FAT2_start_sector = p_fs->FAT1_start_sector +
3174 p_fs->num_FAT_sectors;
3175
3176 p_fs->root_start_sector = p_fs->PBR_sector + GET32(p_bpb->clu_offset);
3177 p_fs->data_start_sector = p_fs->root_start_sector;
3178
3179 p_fs->num_sectors = GET64(p_bpb->vol_length);
3180 p_fs->num_clusters = GET32(p_bpb->clu_count) + 2;
3181
3182
3183 p_fs->vol_type = EXFAT;
3184 p_fs->vol_id = GET32(p_bpb->vol_serial);
3185
3186 p_fs->root_dir = GET32(p_bpb->root_cluster);
3187 p_fs->dentries_in_root = 0;
3188 p_fs->dentries_per_clu = 1 << (p_fs->cluster_size_bits -
3189 DENTRY_SIZE_BITS);
3190
3191 p_fs->vol_flag = (u32)GET16(p_bpb->vol_flags);
3192 p_fs->clu_srch_ptr = 2;
3193 p_fs->used_clusters = UINT_MAX;
3194
3195 p_fs->fs_func = &exfat_fs_func;
3196
3197 return FFS_SUCCESS;
3198 }
3199
3200 s32 create_dir(struct inode *inode, struct chain_t *p_dir,
3201 struct uni_name_t *p_uniname, struct file_id_t *fid)
3202 {
3203 s32 ret, dentry, num_entries;
3204 u64 size;
3205 struct chain_t clu;
3206 struct dos_name_t dos_name, dot_name;
3207 struct super_block *sb = inode->i_sb;
3208 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
3209 struct fs_func *fs_func = p_fs->fs_func;
3210
3211 ret = get_num_entries_and_dos_name(sb, p_dir, p_uniname, &num_entries,
3212 &dos_name);
3213 if (ret)
3214 return ret;
3215
3216
3217 dentry = find_empty_entry(inode, p_dir, num_entries);
3218 if (dentry < 0)
3219 return FFS_FULL;
3220
3221 clu.dir = CLUSTER_32(~0);
3222 clu.size = 0;
3223 clu.flags = (p_fs->vol_type == EXFAT) ? 0x03 : 0x01;
3224
3225
3226 ret = fs_func->alloc_cluster(sb, 1, &clu);
3227 if (ret < 0)
3228 return FFS_MEDIAERR;
3229 else if (ret == 0)
3230 return FFS_FULL;
3231
3232 ret = clear_cluster(sb, clu.dir);
3233 if (ret != FFS_SUCCESS)
3234 return ret;
3235
3236 if (p_fs->vol_type == EXFAT) {
3237 size = p_fs->cluster_size;
3238 } else {
3239 size = 0;
3240
3241
3242
3243
3244
3245
3246 dot_name.name_case = 0x0;
3247 memcpy(dot_name.name, DOS_CUR_DIR_NAME, DOS_NAME_LENGTH);
3248
3249 ret = fs_func->init_dir_entry(sb, &clu, 0, TYPE_DIR, clu.dir,
3250 0);
3251 if (ret != FFS_SUCCESS)
3252 return ret;
3253
3254 ret = fs_func->init_ext_entry(sb, &clu, 0, 1, NULL, &dot_name);
3255 if (ret != FFS_SUCCESS)
3256 return ret;
3257
3258 memcpy(dot_name.name, DOS_PAR_DIR_NAME, DOS_NAME_LENGTH);
3259
3260 if (p_dir->dir == p_fs->root_dir)
3261 ret = fs_func->init_dir_entry(sb, &clu, 1, TYPE_DIR,
3262 CLUSTER_32(0), 0);
3263 else
3264 ret = fs_func->init_dir_entry(sb, &clu, 1, TYPE_DIR,
3265 p_dir->dir, 0);
3266
3267 if (ret != FFS_SUCCESS)
3268 return ret;
3269
3270 ret = p_fs->fs_func->init_ext_entry(sb, &clu, 1, 1, NULL,
3271 &dot_name);
3272 if (ret != FFS_SUCCESS)
3273 return ret;
3274 }
3275
3276
3277
3278 ret = fs_func->init_dir_entry(sb, p_dir, dentry, TYPE_DIR, clu.dir,
3279 size);
3280 if (ret != FFS_SUCCESS)
3281 return ret;
3282
3283 ret = fs_func->init_ext_entry(sb, p_dir, dentry, num_entries, p_uniname,
3284 &dos_name);
3285 if (ret != FFS_SUCCESS)
3286 return ret;
3287
3288 fid->dir.dir = p_dir->dir;
3289 fid->dir.size = p_dir->size;
3290 fid->dir.flags = p_dir->flags;
3291 fid->entry = dentry;
3292
3293 fid->attr = ATTR_SUBDIR;
3294 fid->flags = (p_fs->vol_type == EXFAT) ? 0x03 : 0x01;
3295 fid->size = size;
3296 fid->start_clu = clu.dir;
3297
3298 fid->type = TYPE_DIR;
3299 fid->rwoffset = 0;
3300 fid->hint_last_off = -1;
3301
3302 return FFS_SUCCESS;
3303 }
3304
3305 s32 create_file(struct inode *inode, struct chain_t *p_dir,
3306 struct uni_name_t *p_uniname, u8 mode, struct file_id_t *fid)
3307 {
3308 s32 ret, dentry, num_entries;
3309 struct dos_name_t dos_name;
3310 struct super_block *sb = inode->i_sb;
3311 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
3312 struct fs_func *fs_func = p_fs->fs_func;
3313
3314 ret = get_num_entries_and_dos_name(sb, p_dir, p_uniname, &num_entries,
3315 &dos_name);
3316 if (ret)
3317 return ret;
3318
3319
3320 dentry = find_empty_entry(inode, p_dir, num_entries);
3321 if (dentry < 0)
3322 return FFS_FULL;
3323
3324
3325
3326
3327
3328 ret = fs_func->init_dir_entry(sb, p_dir, dentry, TYPE_FILE | mode,
3329 CLUSTER_32(0), 0);
3330 if (ret != FFS_SUCCESS)
3331 return ret;
3332
3333 ret = fs_func->init_ext_entry(sb, p_dir, dentry, num_entries, p_uniname,
3334 &dos_name);
3335 if (ret != FFS_SUCCESS)
3336 return ret;
3337
3338 fid->dir.dir = p_dir->dir;
3339 fid->dir.size = p_dir->size;
3340 fid->dir.flags = p_dir->flags;
3341 fid->entry = dentry;
3342
3343 fid->attr = ATTR_ARCHIVE | mode;
3344 fid->flags = (p_fs->vol_type == EXFAT) ? 0x03 : 0x01;
3345 fid->size = 0;
3346 fid->start_clu = CLUSTER_32(~0);
3347
3348 fid->type = TYPE_FILE;
3349 fid->rwoffset = 0;
3350 fid->hint_last_off = -1;
3351
3352 return FFS_SUCCESS;
3353 }
3354
3355 void remove_file(struct inode *inode, struct chain_t *p_dir, s32 entry)
3356 {
3357 s32 num_entries;
3358 sector_t sector;
3359 struct dentry_t *ep;
3360 struct super_block *sb = inode->i_sb;
3361 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
3362 struct fs_func *fs_func = p_fs->fs_func;
3363
3364 ep = get_entry_in_dir(sb, p_dir, entry, §or);
3365 if (!ep)
3366 return;
3367
3368 buf_lock(sb, sector);
3369
3370
3371 num_entries = fs_func->count_ext_entries(sb, p_dir, entry, ep);
3372 if (num_entries < 0) {
3373 buf_unlock(sb, sector);
3374 return;
3375 }
3376 num_entries++;
3377
3378 buf_unlock(sb, sector);
3379
3380
3381 fs_func->delete_dir_entry(sb, p_dir, entry, 0, num_entries);
3382 }
3383
3384 s32 exfat_rename_file(struct inode *inode, struct chain_t *p_dir, s32 oldentry,
3385 struct uni_name_t *p_uniname, struct file_id_t *fid)
3386 {
3387 s32 ret, newentry = -1, num_old_entries, num_new_entries;
3388 sector_t sector_old, sector_new;
3389 struct dos_name_t dos_name;
3390 struct dentry_t *epold, *epnew;
3391 struct super_block *sb = inode->i_sb;
3392 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
3393 struct fs_func *fs_func = p_fs->fs_func;
3394
3395 epold = get_entry_in_dir(sb, p_dir, oldentry, §or_old);
3396 if (!epold)
3397 return FFS_MEDIAERR;
3398
3399 buf_lock(sb, sector_old);
3400
3401
3402 num_old_entries = fs_func->count_ext_entries(sb, p_dir, oldentry,
3403 epold);
3404 if (num_old_entries < 0) {
3405 buf_unlock(sb, sector_old);
3406 return FFS_MEDIAERR;
3407 }
3408 num_old_entries++;
3409
3410 ret = get_num_entries_and_dos_name(sb, p_dir, p_uniname,
3411 &num_new_entries, &dos_name);
3412 if (ret) {
3413 buf_unlock(sb, sector_old);
3414 return ret;
3415 }
3416
3417 if (num_old_entries < num_new_entries) {
3418 newentry = find_empty_entry(inode, p_dir, num_new_entries);
3419 if (newentry < 0) {
3420 buf_unlock(sb, sector_old);
3421 return FFS_FULL;
3422 }
3423
3424 epnew = get_entry_in_dir(sb, p_dir, newentry, §or_new);
3425 if (!epnew) {
3426 buf_unlock(sb, sector_old);
3427 return FFS_MEDIAERR;
3428 }
3429
3430 memcpy((void *)epnew, (void *)epold, DENTRY_SIZE);
3431 if (fs_func->get_entry_type(epnew) == TYPE_FILE) {
3432 fs_func->set_entry_attr(epnew,
3433 fs_func->get_entry_attr(epnew) |
3434 ATTR_ARCHIVE);
3435 fid->attr |= ATTR_ARCHIVE;
3436 }
3437 buf_modify(sb, sector_new);
3438 buf_unlock(sb, sector_old);
3439
3440 if (p_fs->vol_type == EXFAT) {
3441 epold = get_entry_in_dir(sb, p_dir, oldentry + 1,
3442 §or_old);
3443 buf_lock(sb, sector_old);
3444 epnew = get_entry_in_dir(sb, p_dir, newentry + 1,
3445 §or_new);
3446
3447 if (!epold || !epnew) {
3448 buf_unlock(sb, sector_old);
3449 return FFS_MEDIAERR;
3450 }
3451
3452 memcpy((void *)epnew, (void *)epold, DENTRY_SIZE);
3453 buf_modify(sb, sector_new);
3454 buf_unlock(sb, sector_old);
3455 }
3456
3457 ret = fs_func->init_ext_entry(sb, p_dir, newentry,
3458 num_new_entries, p_uniname,
3459 &dos_name);
3460 if (ret != FFS_SUCCESS)
3461 return ret;
3462
3463 fs_func->delete_dir_entry(sb, p_dir, oldentry, 0,
3464 num_old_entries);
3465 fid->entry = newentry;
3466 } else {
3467 if (fs_func->get_entry_type(epold) == TYPE_FILE) {
3468 fs_func->set_entry_attr(epold,
3469 fs_func->get_entry_attr(epold) |
3470 ATTR_ARCHIVE);
3471 fid->attr |= ATTR_ARCHIVE;
3472 }
3473 buf_modify(sb, sector_old);
3474 buf_unlock(sb, sector_old);
3475
3476 ret = fs_func->init_ext_entry(sb, p_dir, oldentry,
3477 num_new_entries, p_uniname,
3478 &dos_name);
3479 if (ret != FFS_SUCCESS)
3480 return ret;
3481
3482 fs_func->delete_dir_entry(sb, p_dir, oldentry, num_new_entries,
3483 num_old_entries);
3484 }
3485
3486 return FFS_SUCCESS;
3487 }
3488
3489 s32 move_file(struct inode *inode, struct chain_t *p_olddir, s32 oldentry,
3490 struct chain_t *p_newdir, struct uni_name_t *p_uniname,
3491 struct file_id_t *fid)
3492 {
3493 s32 ret, newentry, num_new_entries, num_old_entries;
3494 sector_t sector_mov, sector_new;
3495 struct chain_t clu;
3496 struct dos_name_t dos_name;
3497 struct dentry_t *epmov, *epnew;
3498 struct super_block *sb = inode->i_sb;
3499 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
3500 struct fs_func *fs_func = p_fs->fs_func;
3501
3502 epmov = get_entry_in_dir(sb, p_olddir, oldentry, §or_mov);
3503 if (!epmov)
3504 return FFS_MEDIAERR;
3505
3506
3507 if (fs_func->get_entry_type(epmov) == TYPE_DIR &&
3508 fs_func->get_entry_clu0(epmov) == p_newdir->dir)
3509 return FFS_INVALIDPATH;
3510
3511 buf_lock(sb, sector_mov);
3512
3513
3514 num_old_entries = fs_func->count_ext_entries(sb, p_olddir, oldentry,
3515 epmov);
3516 if (num_old_entries < 0) {
3517 buf_unlock(sb, sector_mov);
3518 return FFS_MEDIAERR;
3519 }
3520 num_old_entries++;
3521
3522 ret = get_num_entries_and_dos_name(sb, p_newdir, p_uniname,
3523 &num_new_entries, &dos_name);
3524 if (ret) {
3525 buf_unlock(sb, sector_mov);
3526 return ret;
3527 }
3528
3529 newentry = find_empty_entry(inode, p_newdir, num_new_entries);
3530 if (newentry < 0) {
3531 buf_unlock(sb, sector_mov);
3532 return FFS_FULL;
3533 }
3534
3535 epnew = get_entry_in_dir(sb, p_newdir, newentry, §or_new);
3536 if (!epnew) {
3537 buf_unlock(sb, sector_mov);
3538 return FFS_MEDIAERR;
3539 }
3540
3541 memcpy((void *)epnew, (void *)epmov, DENTRY_SIZE);
3542 if (fs_func->get_entry_type(epnew) == TYPE_FILE) {
3543 fs_func->set_entry_attr(epnew, fs_func->get_entry_attr(epnew) |
3544 ATTR_ARCHIVE);
3545 fid->attr |= ATTR_ARCHIVE;
3546 }
3547 buf_modify(sb, sector_new);
3548 buf_unlock(sb, sector_mov);
3549
3550 if (p_fs->vol_type == EXFAT) {
3551 epmov = get_entry_in_dir(sb, p_olddir, oldentry + 1,
3552 §or_mov);
3553 buf_lock(sb, sector_mov);
3554 epnew = get_entry_in_dir(sb, p_newdir, newentry + 1,
3555 §or_new);
3556 if (!epmov || !epnew) {
3557 buf_unlock(sb, sector_mov);
3558 return FFS_MEDIAERR;
3559 }
3560
3561 memcpy((void *)epnew, (void *)epmov, DENTRY_SIZE);
3562 buf_modify(sb, sector_new);
3563 buf_unlock(sb, sector_mov);
3564 } else if (fs_func->get_entry_type(epnew) == TYPE_DIR) {
3565
3566 clu.dir = fs_func->get_entry_clu0(epnew);
3567 clu.flags = 0x01;
3568
3569 epnew = get_entry_in_dir(sb, &clu, 1, §or_new);
3570 if (!epnew)
3571 return FFS_MEDIAERR;
3572
3573 if (p_newdir->dir == p_fs->root_dir)
3574 fs_func->set_entry_clu0(epnew, CLUSTER_32(0));
3575 else
3576 fs_func->set_entry_clu0(epnew, p_newdir->dir);
3577 buf_modify(sb, sector_new);
3578 }
3579
3580 ret = fs_func->init_ext_entry(sb, p_newdir, newentry, num_new_entries,
3581 p_uniname, &dos_name);
3582 if (ret != FFS_SUCCESS)
3583 return ret;
3584
3585 fs_func->delete_dir_entry(sb, p_olddir, oldentry, 0, num_old_entries);
3586
3587 fid->dir.dir = p_newdir->dir;
3588 fid->dir.size = p_newdir->size;
3589 fid->dir.flags = p_newdir->flags;
3590
3591 fid->entry = newentry;
3592
3593 return FFS_SUCCESS;
3594 }
3595
3596
3597
3598
3599
3600 int sector_read(struct super_block *sb, sector_t sec, struct buffer_head **bh,
3601 bool read)
3602 {
3603 s32 ret = FFS_MEDIAERR;
3604 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
3605
3606 if ((sec >= (p_fs->PBR_sector + p_fs->num_sectors)) &&
3607 (p_fs->num_sectors > 0)) {
3608 pr_err("[EXFAT] %s: out of range error! (sec = %llu)\n",
3609 __func__, (unsigned long long)sec);
3610 fs_error(sb);
3611 return ret;
3612 }
3613
3614 if (!p_fs->dev_ejected) {
3615 ret = bdev_read(sb, sec, bh, 1, read);
3616 if (ret != FFS_SUCCESS)
3617 p_fs->dev_ejected = 1;
3618 }
3619
3620 return ret;
3621 }
3622
3623 int sector_write(struct super_block *sb, sector_t sec, struct buffer_head *bh,
3624 bool sync)
3625 {
3626 s32 ret = FFS_MEDIAERR;
3627 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
3628
3629 if (sec >= (p_fs->PBR_sector + p_fs->num_sectors) &&
3630 (p_fs->num_sectors > 0)) {
3631 pr_err("[EXFAT] %s: out of range error! (sec = %llu)\n",
3632 __func__, (unsigned long long)sec);
3633 fs_error(sb);
3634 return ret;
3635 }
3636
3637 if (!bh) {
3638 pr_err("[EXFAT] %s: bh is NULL!\n", __func__);
3639 fs_error(sb);
3640 return ret;
3641 }
3642
3643 if (!p_fs->dev_ejected) {
3644 ret = bdev_write(sb, sec, bh, 1, sync);
3645 if (ret != FFS_SUCCESS)
3646 p_fs->dev_ejected = 1;
3647 }
3648
3649 return ret;
3650 }
3651
3652 int multi_sector_read(struct super_block *sb, sector_t sec,
3653 struct buffer_head **bh, s32 num_secs, bool read)
3654 {
3655 s32 ret = FFS_MEDIAERR;
3656 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
3657
3658 if (((sec + num_secs) > (p_fs->PBR_sector + p_fs->num_sectors)) &&
3659 (p_fs->num_sectors > 0)) {
3660 pr_err("[EXFAT] %s: out of range error! (sec = %llu, num_secs = %d)\n",
3661 __func__, (unsigned long long)sec, num_secs);
3662 fs_error(sb);
3663 return ret;
3664 }
3665
3666 if (!p_fs->dev_ejected) {
3667 ret = bdev_read(sb, sec, bh, num_secs, read);
3668 if (ret != FFS_SUCCESS)
3669 p_fs->dev_ejected = 1;
3670 }
3671
3672 return ret;
3673 }
3674
3675 int multi_sector_write(struct super_block *sb, sector_t sec,
3676 struct buffer_head *bh, s32 num_secs, bool sync)
3677 {
3678 s32 ret = FFS_MEDIAERR;
3679 struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
3680
3681 if ((sec + num_secs) > (p_fs->PBR_sector + p_fs->num_sectors) &&
3682 (p_fs->num_sectors > 0)) {
3683 pr_err("[EXFAT] %s: out of range error! (sec = %llu, num_secs = %d)\n",
3684 __func__, (unsigned long long)sec, num_secs);
3685 fs_error(sb);
3686 return ret;
3687 }
3688 if (!bh) {
3689 pr_err("[EXFAT] %s: bh is NULL!\n", __func__);
3690 fs_error(sb);
3691 return ret;
3692 }
3693
3694 if (!p_fs->dev_ejected) {
3695 ret = bdev_write(sb, sec, bh, num_secs, sync);
3696 if (ret != FFS_SUCCESS)
3697 p_fs->dev_ejected = 1;
3698 }
3699
3700 return ret;
3701 }