1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd.
6 #include <linux/slab.h>
7 #include <linux/compat.h>
9 #include <linux/buffer_head.h>
11 #include "exfat_raw.h"
14 static int exfat_extract_uni_name(struct exfat_dentry
*ep
,
15 unsigned short *uniname
)
19 for (i
= 0; i
< EXFAT_FILE_NAME_LEN
; i
++) {
20 *uniname
= le16_to_cpu(ep
->dentry
.name
.unicode_0_14
[i
]);
32 static int exfat_get_uniname_from_ext_entry(struct super_block
*sb
,
33 struct exfat_chain
*p_dir
, int entry
, unsigned short *uniname
)
36 struct exfat_entry_set_cache es
;
37 unsigned int uni_len
= 0, len
;
39 err
= exfat_get_dentry_set(&es
, sb
, p_dir
, entry
, ES_ALL_ENTRIES
);
44 * First entry : file entry
45 * Second entry : stream-extension entry
46 * Third entry : first file-name entry
47 * So, the index of first file-name dentry should start from 2.
49 for (i
= ES_IDX_FIRST_FILENAME
; i
< es
.num_entries
; i
++) {
50 struct exfat_dentry
*ep
= exfat_get_dentry_cached(&es
, i
);
52 /* end of name entry */
53 if (exfat_get_entry_type(ep
) != TYPE_EXTEND
)
56 len
= exfat_extract_uni_name(ep
, uniname
);
58 if (len
!= EXFAT_FILE_NAME_LEN
|| uni_len
>= MAX_NAME_LENGTH
)
60 uniname
+= EXFAT_FILE_NAME_LEN
;
63 exfat_put_dentry_set(&es
, false);
67 /* read a directory entry from the opened directory */
68 static int exfat_readdir(struct inode
*inode
, loff_t
*cpos
, struct exfat_dir_entry
*dir_entry
)
70 int i
, dentries_per_clu
, num_ext
, err
;
71 unsigned int type
, clu_offset
, max_dentries
;
72 struct exfat_chain dir
, clu
;
73 struct exfat_uni_name uni_name
;
74 struct exfat_dentry
*ep
;
75 struct super_block
*sb
= inode
->i_sb
;
76 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
77 struct exfat_inode_info
*ei
= EXFAT_I(inode
);
78 unsigned int dentry
= EXFAT_B_TO_DEN(*cpos
) & 0xFFFFFFFF;
79 struct buffer_head
*bh
;
81 /* check if the given file ID is opened */
82 if (ei
->type
!= TYPE_DIR
)
86 exfat_chain_set(&dir
, sbi
->root_dir
, 0, ALLOC_FAT_CHAIN
);
88 exfat_chain_set(&dir
, ei
->start_clu
,
89 EXFAT_B_TO_CLU(i_size_read(inode
), sbi
), ei
->flags
);
91 dentries_per_clu
= sbi
->dentries_per_clu
;
92 max_dentries
= (unsigned int)min_t(u64
, MAX_EXFAT_DENTRIES
,
93 (u64
)EXFAT_CLU_TO_DEN(sbi
->num_clusters
, sbi
));
95 clu_offset
= EXFAT_DEN_TO_CLU(dentry
, sbi
);
96 exfat_chain_dup(&clu
, &dir
);
98 if (clu
.flags
== ALLOC_NO_FAT_CHAIN
) {
99 clu
.dir
+= clu_offset
;
100 clu
.size
-= clu_offset
;
102 /* hint_information */
103 if (clu_offset
> 0 && ei
->hint_bmap
.off
!= EXFAT_EOF_CLUSTER
&&
104 ei
->hint_bmap
.off
> 0 && clu_offset
>= ei
->hint_bmap
.off
) {
105 clu_offset
-= ei
->hint_bmap
.off
;
106 clu
.dir
= ei
->hint_bmap
.clu
;
109 while (clu_offset
> 0 && clu
.dir
!= EXFAT_EOF_CLUSTER
) {
110 if (exfat_get_next_cluster(sb
, &(clu
.dir
)))
117 while (clu
.dir
!= EXFAT_EOF_CLUSTER
&& dentry
< max_dentries
) {
118 i
= dentry
& (dentries_per_clu
- 1);
120 for ( ; i
< dentries_per_clu
; i
++, dentry
++) {
121 ep
= exfat_get_dentry(sb
, &clu
, i
, &bh
);
125 type
= exfat_get_entry_type(ep
);
126 if (type
== TYPE_UNUSED
) {
131 if (type
!= TYPE_FILE
&& type
!= TYPE_DIR
) {
136 num_ext
= ep
->dentry
.file
.num_ext
;
137 dir_entry
->attr
= le16_to_cpu(ep
->dentry
.file
.attr
);
138 exfat_get_entry_time(sbi
, &dir_entry
->crtime
,
139 ep
->dentry
.file
.create_tz
,
140 ep
->dentry
.file
.create_time
,
141 ep
->dentry
.file
.create_date
,
142 ep
->dentry
.file
.create_time_cs
);
143 exfat_get_entry_time(sbi
, &dir_entry
->mtime
,
144 ep
->dentry
.file
.modify_tz
,
145 ep
->dentry
.file
.modify_time
,
146 ep
->dentry
.file
.modify_date
,
147 ep
->dentry
.file
.modify_time_cs
);
148 exfat_get_entry_time(sbi
, &dir_entry
->atime
,
149 ep
->dentry
.file
.access_tz
,
150 ep
->dentry
.file
.access_time
,
151 ep
->dentry
.file
.access_date
,
154 *uni_name
.name
= 0x0;
155 err
= exfat_get_uniname_from_ext_entry(sb
, &clu
, i
,
161 exfat_utf16_to_nls(sb
, &uni_name
,
162 dir_entry
->namebuf
.lfn
,
163 dir_entry
->namebuf
.lfnbuf_len
);
166 ep
= exfat_get_dentry(sb
, &clu
, i
+ 1, &bh
);
170 le64_to_cpu(ep
->dentry
.stream
.valid_size
);
171 dir_entry
->entry
= dentry
;
174 ei
->hint_bmap
.off
= EXFAT_DEN_TO_CLU(dentry
, sbi
);
175 ei
->hint_bmap
.clu
= clu
.dir
;
177 *cpos
= EXFAT_DEN_TO_B(dentry
+ 1 + num_ext
);
181 if (clu
.flags
== ALLOC_NO_FAT_CHAIN
) {
185 clu
.dir
= EXFAT_EOF_CLUSTER
;
187 if (exfat_get_next_cluster(sb
, &(clu
.dir
)))
192 dir_entry
->namebuf
.lfn
[0] = '\0';
193 *cpos
= EXFAT_DEN_TO_B(dentry
);
197 static void exfat_init_namebuf(struct exfat_dentry_namebuf
*nb
)
203 static int exfat_alloc_namebuf(struct exfat_dentry_namebuf
*nb
)
205 nb
->lfn
= __getname();
208 nb
->lfnbuf_len
= MAX_VFSNAME_BUF_SIZE
;
212 static void exfat_free_namebuf(struct exfat_dentry_namebuf
*nb
)
218 exfat_init_namebuf(nb
);
222 * Before calling dir_emit*(), sbi->s_lock should be released
223 * because page fault can occur in dir_emit*().
225 #define ITER_POS_FILLED_DOTS (2)
226 static int exfat_iterate(struct file
*file
, struct dir_context
*ctx
)
228 struct inode
*inode
= file_inode(file
);
229 struct super_block
*sb
= inode
->i_sb
;
231 struct exfat_dir_entry de
;
232 struct exfat_dentry_namebuf
*nb
= &(de
.namebuf
);
233 struct exfat_inode_info
*ei
= EXFAT_I(inode
);
236 int err
= 0, fake_offset
= 0;
238 exfat_init_namebuf(nb
);
241 if (!dir_emit_dots(file
, ctx
))
244 if (ctx
->pos
== ITER_POS_FILLED_DOTS
) {
249 cpos
= round_up(cpos
, DENTRY_SIZE
);
251 /* name buffer should be allocated before use */
252 err
= exfat_alloc_namebuf(nb
);
256 mutex_lock(&EXFAT_SB(sb
)->s_lock
);
258 if (ei
->flags
== ALLOC_NO_FAT_CHAIN
&& cpos
>= i_size_read(inode
))
261 err
= exfat_readdir(inode
, &cpos
, &de
);
264 * At least we tried to read a sector.
265 * Move cpos to next sector position (should be aligned).
268 cpos
+= 1 << (sb
->s_blocksize_bits
);
269 cpos
&= ~(sb
->s_blocksize
- 1);
279 i_pos
= ((loff_t
)ei
->start_clu
<< 32) | (de
.entry
& 0xffffffff);
280 tmp
= exfat_iget(sb
, i_pos
);
285 inum
= iunique(sb
, EXFAT_ROOT_INO
);
288 mutex_unlock(&EXFAT_SB(sb
)->s_lock
);
289 if (!dir_emit(ctx
, nb
->lfn
, strlen(nb
->lfn
), inum
,
290 (de
.attr
& EXFAT_ATTR_SUBDIR
) ? DT_DIR
: DT_REG
))
296 if (!cpos
&& fake_offset
)
297 cpos
= ITER_POS_FILLED_DOTS
;
299 mutex_unlock(&EXFAT_SB(sb
)->s_lock
);
302 * To improve performance, free namebuf after unlock sb_lock.
303 * If namebuf is not allocated, this function do nothing
305 exfat_free_namebuf(nb
);
309 WRAP_DIR_ITER(exfat_iterate
) // FIXME!
310 const struct file_operations exfat_dir_operations
= {
311 .llseek
= generic_file_llseek
,
312 .read
= generic_read_dir
,
313 .iterate_shared
= shared_exfat_iterate
,
314 .unlocked_ioctl
= exfat_ioctl
,
316 .compat_ioctl
= exfat_compat_ioctl
,
318 .fsync
= exfat_file_fsync
,
321 int exfat_alloc_new_dir(struct inode
*inode
, struct exfat_chain
*clu
)
325 exfat_chain_set(clu
, EXFAT_EOF_CLUSTER
, 0, ALLOC_NO_FAT_CHAIN
);
327 ret
= exfat_alloc_cluster(inode
, 1, clu
, IS_DIRSYNC(inode
));
331 return exfat_zeroed_cluster(inode
, clu
->dir
);
334 int exfat_calc_num_entries(struct exfat_uni_name
*p_uniname
)
338 len
= p_uniname
->name_len
;
342 /* 1 file entry + 1 stream entry + name entries */
343 return ES_ENTRY_NUM(len
);
346 unsigned int exfat_get_entry_type(struct exfat_dentry
*ep
)
348 if (ep
->type
== EXFAT_UNUSED
)
350 if (IS_EXFAT_DELETED(ep
->type
))
352 if (ep
->type
== EXFAT_INVAL
)
354 if (IS_EXFAT_CRITICAL_PRI(ep
->type
)) {
355 if (ep
->type
== EXFAT_BITMAP
)
357 if (ep
->type
== EXFAT_UPCASE
)
359 if (ep
->type
== EXFAT_VOLUME
)
361 if (ep
->type
== EXFAT_FILE
) {
362 if (le16_to_cpu(ep
->dentry
.file
.attr
) & EXFAT_ATTR_SUBDIR
)
366 return TYPE_CRITICAL_PRI
;
368 if (IS_EXFAT_BENIGN_PRI(ep
->type
)) {
369 if (ep
->type
== EXFAT_GUID
)
371 if (ep
->type
== EXFAT_PADDING
)
373 if (ep
->type
== EXFAT_ACLTAB
)
375 return TYPE_BENIGN_PRI
;
377 if (IS_EXFAT_CRITICAL_SEC(ep
->type
)) {
378 if (ep
->type
== EXFAT_STREAM
)
380 if (ep
->type
== EXFAT_NAME
)
382 if (ep
->type
== EXFAT_ACL
)
384 return TYPE_CRITICAL_SEC
;
387 if (ep
->type
== EXFAT_VENDOR_EXT
)
388 return TYPE_VENDOR_EXT
;
389 if (ep
->type
== EXFAT_VENDOR_ALLOC
)
390 return TYPE_VENDOR_ALLOC
;
392 return TYPE_BENIGN_SEC
;
395 static void exfat_set_entry_type(struct exfat_dentry
*ep
, unsigned int type
)
397 if (type
== TYPE_UNUSED
) {
398 ep
->type
= EXFAT_UNUSED
;
399 } else if (type
== TYPE_DELETED
) {
400 ep
->type
&= EXFAT_DELETE
;
401 } else if (type
== TYPE_STREAM
) {
402 ep
->type
= EXFAT_STREAM
;
403 } else if (type
== TYPE_EXTEND
) {
404 ep
->type
= EXFAT_NAME
;
405 } else if (type
== TYPE_BITMAP
) {
406 ep
->type
= EXFAT_BITMAP
;
407 } else if (type
== TYPE_UPCASE
) {
408 ep
->type
= EXFAT_UPCASE
;
409 } else if (type
== TYPE_VOLUME
) {
410 ep
->type
= EXFAT_VOLUME
;
411 } else if (type
== TYPE_DIR
) {
412 ep
->type
= EXFAT_FILE
;
413 ep
->dentry
.file
.attr
= cpu_to_le16(EXFAT_ATTR_SUBDIR
);
414 } else if (type
== TYPE_FILE
) {
415 ep
->type
= EXFAT_FILE
;
416 ep
->dentry
.file
.attr
= cpu_to_le16(EXFAT_ATTR_ARCHIVE
);
420 static void exfat_init_stream_entry(struct exfat_dentry
*ep
,
421 unsigned int start_clu
, unsigned long long size
)
423 memset(ep
, 0, sizeof(*ep
));
424 exfat_set_entry_type(ep
, TYPE_STREAM
);
426 ep
->dentry
.stream
.flags
= ALLOC_FAT_CHAIN
;
428 ep
->dentry
.stream
.flags
= ALLOC_NO_FAT_CHAIN
;
429 ep
->dentry
.stream
.start_clu
= cpu_to_le32(start_clu
);
430 ep
->dentry
.stream
.valid_size
= cpu_to_le64(size
);
431 ep
->dentry
.stream
.size
= cpu_to_le64(size
);
434 static void exfat_init_name_entry(struct exfat_dentry
*ep
,
435 unsigned short *uniname
)
439 exfat_set_entry_type(ep
, TYPE_EXTEND
);
440 ep
->dentry
.name
.flags
= 0x0;
442 for (i
= 0; i
< EXFAT_FILE_NAME_LEN
; i
++) {
443 if (*uniname
!= 0x0) {
444 ep
->dentry
.name
.unicode_0_14
[i
] = cpu_to_le16(*uniname
);
447 ep
->dentry
.name
.unicode_0_14
[i
] = 0x0;
452 void exfat_init_dir_entry(struct exfat_entry_set_cache
*es
,
453 unsigned int type
, unsigned int start_clu
,
454 unsigned long long size
, struct timespec64
*ts
)
456 struct super_block
*sb
= es
->sb
;
457 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
458 struct exfat_dentry
*ep
;
460 ep
= exfat_get_dentry_cached(es
, ES_IDX_FILE
);
461 memset(ep
, 0, sizeof(*ep
));
462 exfat_set_entry_type(ep
, type
);
463 exfat_set_entry_time(sbi
, ts
,
464 &ep
->dentry
.file
.create_tz
,
465 &ep
->dentry
.file
.create_time
,
466 &ep
->dentry
.file
.create_date
,
467 &ep
->dentry
.file
.create_time_cs
);
468 exfat_set_entry_time(sbi
, ts
,
469 &ep
->dentry
.file
.modify_tz
,
470 &ep
->dentry
.file
.modify_time
,
471 &ep
->dentry
.file
.modify_date
,
472 &ep
->dentry
.file
.modify_time_cs
);
473 exfat_set_entry_time(sbi
, ts
,
474 &ep
->dentry
.file
.access_tz
,
475 &ep
->dentry
.file
.access_time
,
476 &ep
->dentry
.file
.access_date
,
479 ep
= exfat_get_dentry_cached(es
, ES_IDX_STREAM
);
480 exfat_init_stream_entry(ep
, start_clu
, size
);
483 static void exfat_free_benign_secondary_clusters(struct inode
*inode
,
484 struct exfat_dentry
*ep
)
486 struct super_block
*sb
= inode
->i_sb
;
487 struct exfat_chain dir
;
488 unsigned int start_clu
=
489 le32_to_cpu(ep
->dentry
.generic_secondary
.start_clu
);
490 u64 size
= le64_to_cpu(ep
->dentry
.generic_secondary
.size
);
491 unsigned char flags
= ep
->dentry
.generic_secondary
.flags
;
493 if (!(flags
& ALLOC_POSSIBLE
) || !start_clu
|| !size
)
496 exfat_chain_set(&dir
, start_clu
,
497 EXFAT_B_TO_CLU_ROUND_UP(size
, EXFAT_SB(sb
)),
499 exfat_free_cluster(inode
, &dir
);
502 void exfat_init_ext_entry(struct exfat_entry_set_cache
*es
, int num_entries
,
503 struct exfat_uni_name
*p_uniname
)
506 unsigned short *uniname
= p_uniname
->name
;
507 struct exfat_dentry
*ep
;
509 ep
= exfat_get_dentry_cached(es
, ES_IDX_FILE
);
510 ep
->dentry
.file
.num_ext
= (unsigned char)(num_entries
- 1);
512 ep
= exfat_get_dentry_cached(es
, ES_IDX_STREAM
);
513 ep
->dentry
.stream
.name_len
= p_uniname
->name_len
;
514 ep
->dentry
.stream
.name_hash
= cpu_to_le16(p_uniname
->name_hash
);
516 for (i
= ES_IDX_FIRST_FILENAME
; i
< num_entries
; i
++) {
517 ep
= exfat_get_dentry_cached(es
, i
);
518 exfat_init_name_entry(ep
, uniname
);
519 uniname
+= EXFAT_FILE_NAME_LEN
;
522 exfat_update_dir_chksum(es
);
525 void exfat_remove_entries(struct inode
*inode
, struct exfat_entry_set_cache
*es
,
529 struct exfat_dentry
*ep
;
531 for (i
= order
; i
< es
->num_entries
; i
++) {
532 ep
= exfat_get_dentry_cached(es
, i
);
534 if (exfat_get_entry_type(ep
) & TYPE_BENIGN_SEC
)
535 exfat_free_benign_secondary_clusters(inode
, ep
);
537 exfat_set_entry_type(ep
, TYPE_DELETED
);
540 if (order
< es
->num_entries
)
544 void exfat_update_dir_chksum(struct exfat_entry_set_cache
*es
)
546 int chksum_type
= CS_DIR_ENTRY
, i
;
547 unsigned short chksum
= 0;
548 struct exfat_dentry
*ep
;
550 for (i
= ES_IDX_FILE
; i
< es
->num_entries
; i
++) {
551 ep
= exfat_get_dentry_cached(es
, i
);
552 chksum
= exfat_calc_chksum16(ep
, DENTRY_SIZE
, chksum
,
554 chksum_type
= CS_DEFAULT
;
556 ep
= exfat_get_dentry_cached(es
, ES_IDX_FILE
);
557 ep
->dentry
.file
.checksum
= cpu_to_le16(chksum
);
561 int exfat_put_dentry_set(struct exfat_entry_set_cache
*es
, int sync
)
566 err
= exfat_update_bhs(es
->bh
, es
->num_bh
, sync
);
568 for (i
= 0; i
< es
->num_bh
; i
++)
574 if (IS_DYNAMIC_ES(es
))
580 static int exfat_walk_fat_chain(struct super_block
*sb
,
581 struct exfat_chain
*p_dir
, unsigned int byte_offset
,
584 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
585 unsigned int clu_offset
;
586 unsigned int cur_clu
;
588 clu_offset
= EXFAT_B_TO_CLU(byte_offset
, sbi
);
589 cur_clu
= p_dir
->dir
;
591 if (p_dir
->flags
== ALLOC_NO_FAT_CHAIN
) {
592 cur_clu
+= clu_offset
;
594 while (clu_offset
> 0) {
595 if (exfat_get_next_cluster(sb
, &cur_clu
))
597 if (cur_clu
== EXFAT_EOF_CLUSTER
) {
599 "invalid dentry access beyond EOF (clu : %u, eidx : %d)",
601 EXFAT_B_TO_DEN(byte_offset
));
612 static int exfat_find_location(struct super_block
*sb
, struct exfat_chain
*p_dir
,
613 int entry
, sector_t
*sector
, int *offset
)
616 unsigned int off
, clu
= 0;
617 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
619 off
= EXFAT_DEN_TO_B(entry
);
621 ret
= exfat_walk_fat_chain(sb
, p_dir
, off
, &clu
);
625 /* byte offset in cluster */
626 off
= EXFAT_CLU_OFFSET(off
, sbi
);
628 /* byte offset in sector */
629 *offset
= EXFAT_BLK_OFFSET(off
, sb
);
631 /* sector offset in cluster */
632 *sector
= EXFAT_B_TO_BLK(off
, sb
);
633 *sector
+= exfat_cluster_to_sector(sbi
, clu
);
637 #define EXFAT_MAX_RA_SIZE (128*1024)
638 static int exfat_dir_readahead(struct super_block
*sb
, sector_t sec
)
640 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
641 struct buffer_head
*bh
;
642 unsigned int max_ra_count
= EXFAT_MAX_RA_SIZE
>> sb
->s_blocksize_bits
;
643 unsigned int page_ra_count
= PAGE_SIZE
>> sb
->s_blocksize_bits
;
644 unsigned int adj_ra_count
= max(sbi
->sect_per_clus
, page_ra_count
);
645 unsigned int ra_count
= min(adj_ra_count
, max_ra_count
);
647 /* Read-ahead is not required */
648 if (sbi
->sect_per_clus
== 1)
651 if (sec
< sbi
->data_start_sector
) {
652 exfat_err(sb
, "requested sector is invalid(sect:%llu, root:%llu)",
653 (unsigned long long)sec
, sbi
->data_start_sector
);
657 /* Not sector aligned with ra_count, resize ra_count to page size */
658 if ((sec
- sbi
->data_start_sector
) & (ra_count
- 1))
659 ra_count
= page_ra_count
;
661 bh
= sb_find_get_block(sb
, sec
);
662 if (!bh
|| !buffer_uptodate(bh
)) {
665 for (i
= 0; i
< ra_count
; i
++)
666 sb_breadahead(sb
, (sector_t
)(sec
+ i
));
672 struct exfat_dentry
*exfat_get_dentry(struct super_block
*sb
,
673 struct exfat_chain
*p_dir
, int entry
, struct buffer_head
**bh
)
675 unsigned int dentries_per_page
= EXFAT_B_TO_DEN(PAGE_SIZE
);
679 if (p_dir
->dir
== DIR_DELETED
) {
680 exfat_err(sb
, "abnormal access to deleted dentry");
684 if (exfat_find_location(sb
, p_dir
, entry
, &sec
, &off
))
687 if (p_dir
->dir
!= EXFAT_FREE_CLUSTER
&&
688 !(entry
& (dentries_per_page
- 1)))
689 exfat_dir_readahead(sb
, sec
);
691 *bh
= sb_bread(sb
, sec
);
695 return (struct exfat_dentry
*)((*bh
)->b_data
+ off
);
698 enum exfat_validate_dentry_mode
{
699 ES_MODE_GET_FILE_ENTRY
,
700 ES_MODE_GET_STRM_ENTRY
,
701 ES_MODE_GET_NAME_ENTRY
,
702 ES_MODE_GET_CRITICAL_SEC_ENTRY
,
703 ES_MODE_GET_BENIGN_SEC_ENTRY
,
706 static bool exfat_validate_entry(unsigned int type
,
707 enum exfat_validate_dentry_mode
*mode
)
709 if (type
== TYPE_UNUSED
|| type
== TYPE_DELETED
)
713 case ES_MODE_GET_FILE_ENTRY
:
714 if (type
!= TYPE_STREAM
)
716 *mode
= ES_MODE_GET_STRM_ENTRY
;
718 case ES_MODE_GET_STRM_ENTRY
:
719 if (type
!= TYPE_EXTEND
)
721 *mode
= ES_MODE_GET_NAME_ENTRY
;
723 case ES_MODE_GET_NAME_ENTRY
:
724 if (type
& TYPE_BENIGN_SEC
)
725 *mode
= ES_MODE_GET_BENIGN_SEC_ENTRY
;
726 else if (type
!= TYPE_EXTEND
)
729 case ES_MODE_GET_BENIGN_SEC_ENTRY
:
730 /* Assume unreconized benign secondary entry */
731 if (!(type
& TYPE_BENIGN_SEC
))
741 struct exfat_dentry
*exfat_get_dentry_cached(
742 struct exfat_entry_set_cache
*es
, int num
)
744 int off
= es
->start_off
+ num
* DENTRY_SIZE
;
745 struct buffer_head
*bh
= es
->bh
[EXFAT_B_TO_BLK(off
, es
->sb
)];
746 char *p
= bh
->b_data
+ EXFAT_BLK_OFFSET(off
, es
->sb
);
748 return (struct exfat_dentry
*)p
;
752 * Returns a set of dentries.
754 * Note It provides a direct pointer to bh->data via exfat_get_dentry_cached().
755 * User should call exfat_get_dentry_set() after setting 'modified' to apply
756 * changes made in this entry set to the real device.
759 * sb+p_dir+entry: indicates a file/dir
760 * num_entries: specifies how many dentries should be included.
761 * It will be set to es->num_entries if it is not 0.
762 * If num_entries is 0, es->num_entries will be obtained
763 * from the first dentry.
765 * es: pointer of entry set on success.
768 * -error code on failure
770 static int __exfat_get_dentry_set(struct exfat_entry_set_cache
*es
,
771 struct super_block
*sb
, struct exfat_chain
*p_dir
, int entry
,
772 unsigned int num_entries
)
777 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
778 struct buffer_head
*bh
;
780 if (p_dir
->dir
== DIR_DELETED
) {
781 exfat_err(sb
, "access to deleted dentry");
785 ret
= exfat_find_location(sb
, p_dir
, entry
, &sec
, &off
);
789 memset(es
, 0, sizeof(*es
));
791 es
->modified
= false;
795 bh
= sb_bread(sb
, sec
);
798 es
->bh
[es
->num_bh
++] = bh
;
800 if (num_entries
== ES_ALL_ENTRIES
) {
801 struct exfat_dentry
*ep
;
803 ep
= exfat_get_dentry_cached(es
, ES_IDX_FILE
);
804 if (ep
->type
!= EXFAT_FILE
) {
809 num_entries
= ep
->dentry
.file
.num_ext
+ 1;
812 es
->num_entries
= num_entries
;
814 num_bh
= EXFAT_B_TO_BLK_ROUND_UP(off
+ num_entries
* DENTRY_SIZE
, sb
);
815 if (num_bh
> ARRAY_SIZE(es
->__bh
)) {
816 es
->bh
= kmalloc_array(num_bh
, sizeof(*es
->bh
), GFP_NOFS
);
824 for (i
= 1; i
< num_bh
; i
++) {
825 /* get the next sector */
826 if (exfat_is_last_sector_in_cluster(sbi
, sec
)) {
827 unsigned int clu
= exfat_sector_to_cluster(sbi
, sec
);
829 if (p_dir
->flags
== ALLOC_NO_FAT_CHAIN
)
831 else if (exfat_get_next_cluster(sb
, &clu
))
833 sec
= exfat_cluster_to_sector(sbi
, clu
);
838 bh
= sb_bread(sb
, sec
);
841 es
->bh
[es
->num_bh
++] = bh
;
847 exfat_put_dentry_set(es
, false);
851 int exfat_get_dentry_set(struct exfat_entry_set_cache
*es
,
852 struct super_block
*sb
, struct exfat_chain
*p_dir
,
853 int entry
, unsigned int num_entries
)
856 struct exfat_dentry
*ep
;
857 enum exfat_validate_dentry_mode mode
= ES_MODE_GET_FILE_ENTRY
;
859 ret
= __exfat_get_dentry_set(es
, sb
, p_dir
, entry
, num_entries
);
863 /* validate cached dentries */
864 for (i
= ES_IDX_STREAM
; i
< es
->num_entries
; i
++) {
865 ep
= exfat_get_dentry_cached(es
, i
);
866 if (!exfat_validate_entry(exfat_get_entry_type(ep
), &mode
))
872 exfat_put_dentry_set(es
, false);
876 static int exfat_validate_empty_dentry_set(struct exfat_entry_set_cache
*es
)
878 struct exfat_dentry
*ep
;
879 struct buffer_head
*bh
;
881 bool unused_hit
= false;
884 * ONLY UNUSED OR DELETED DENTRIES ARE ALLOWED:
885 * Although it violates the specification for a deleted entry to
886 * follow an unused entry, some exFAT implementations could work
887 * like this. Therefore, to improve compatibility, let's allow it.
889 for (i
= 0; i
< es
->num_entries
; i
++) {
890 ep
= exfat_get_dentry_cached(es
, i
);
891 if (ep
->type
== EXFAT_UNUSED
) {
893 } else if (!IS_EXFAT_DELETED(ep
->type
)) {
895 goto err_used_follow_unused
;
897 goto count_skip_entries
;
903 err_used_follow_unused
:
904 off
= es
->start_off
+ (i
<< DENTRY_SIZE_BITS
);
905 bh
= es
->bh
[EXFAT_B_TO_BLK(off
, es
->sb
)];
907 exfat_fs_error(es
->sb
,
908 "in sector %lld, dentry %d should be unused, but 0x%x",
909 bh
->b_blocknr
, off
>> DENTRY_SIZE_BITS
, ep
->type
);
914 es
->num_entries
= EXFAT_B_TO_DEN(EXFAT_BLK_TO_B(es
->num_bh
, es
->sb
) - es
->start_off
);
915 for (; i
< es
->num_entries
; i
++) {
916 ep
= exfat_get_dentry_cached(es
, i
);
917 if (IS_EXFAT_DELETED(ep
->type
))
925 * Get an empty dentry set.
928 * sb+p_dir+entry: indicates the empty dentry location
929 * num_entries: specifies how many empty dentries should be included.
931 * es: pointer of empty dentry set on success.
934 * >0 : the dentries are not empty, the return value is the number of
935 * dentries to be skipped for the next lookup.
938 int exfat_get_empty_dentry_set(struct exfat_entry_set_cache
*es
,
939 struct super_block
*sb
, struct exfat_chain
*p_dir
,
940 int entry
, unsigned int num_entries
)
944 ret
= __exfat_get_dentry_set(es
, sb
, p_dir
, entry
, num_entries
);
948 ret
= exfat_validate_empty_dentry_set(es
);
950 exfat_put_dentry_set(es
, false);
955 static inline void exfat_reset_empty_hint(struct exfat_hint_femp
*hint_femp
)
957 hint_femp
->eidx
= EXFAT_HINT_NONE
;
958 hint_femp
->count
= 0;
961 static inline void exfat_set_empty_hint(struct exfat_inode_info
*ei
,
962 struct exfat_hint_femp
*candi_empty
, struct exfat_chain
*clu
,
963 int dentry
, int num_entries
, int entry_type
)
965 if (ei
->hint_femp
.eidx
== EXFAT_HINT_NONE
||
966 ei
->hint_femp
.eidx
> dentry
) {
967 int total_entries
= EXFAT_B_TO_DEN(i_size_read(&ei
->vfs_inode
));
969 if (candi_empty
->count
== 0) {
970 candi_empty
->cur
= *clu
;
971 candi_empty
->eidx
= dentry
;
974 if (entry_type
== TYPE_UNUSED
)
975 candi_empty
->count
+= total_entries
- dentry
;
977 candi_empty
->count
++;
979 if (candi_empty
->count
== num_entries
||
980 candi_empty
->count
+ candi_empty
->eidx
== total_entries
)
981 ei
->hint_femp
= *candi_empty
;
993 * @ei: inode info of parent directory
994 * @p_dir: directory structure of parent directory
995 * @num_entries:entry size of p_uniname
996 * @hint_opt: If p_uniname is found, filled with optimized dir/entry
997 * for traversing cluster chain.
999 * >= 0: file directory entry position where the name exists
1000 * -ENOENT: entry with the name does not exist
1003 int exfat_find_dir_entry(struct super_block
*sb
, struct exfat_inode_info
*ei
,
1004 struct exfat_chain
*p_dir
, struct exfat_uni_name
*p_uniname
,
1005 struct exfat_hint
*hint_opt
)
1007 int i
, rewind
= 0, dentry
= 0, end_eidx
= 0, num_ext
= 0, len
;
1008 int order
, step
, name_len
= 0;
1009 int dentries_per_clu
;
1010 unsigned int entry_type
;
1011 unsigned short *uniname
= NULL
;
1012 struct exfat_chain clu
;
1013 struct exfat_hint
*hint_stat
= &ei
->hint_stat
;
1014 struct exfat_hint_femp candi_empty
;
1015 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
1016 int num_entries
= exfat_calc_num_entries(p_uniname
);
1018 if (num_entries
< 0)
1021 dentries_per_clu
= sbi
->dentries_per_clu
;
1023 exfat_chain_dup(&clu
, p_dir
);
1025 if (hint_stat
->eidx
) {
1026 clu
.dir
= hint_stat
->clu
;
1027 dentry
= hint_stat
->eidx
;
1031 exfat_reset_empty_hint(&ei
->hint_femp
);
1035 step
= DIRENT_STEP_FILE
;
1036 exfat_reset_empty_hint(&candi_empty
);
1038 while (clu
.dir
!= EXFAT_EOF_CLUSTER
) {
1039 i
= dentry
& (dentries_per_clu
- 1);
1040 for (; i
< dentries_per_clu
; i
++, dentry
++) {
1041 struct exfat_dentry
*ep
;
1042 struct buffer_head
*bh
;
1044 if (rewind
&& dentry
== end_eidx
)
1047 ep
= exfat_get_dentry(sb
, &clu
, i
, &bh
);
1051 entry_type
= exfat_get_entry_type(ep
);
1053 if (entry_type
== TYPE_UNUSED
||
1054 entry_type
== TYPE_DELETED
) {
1055 step
= DIRENT_STEP_FILE
;
1057 exfat_set_empty_hint(ei
, &candi_empty
, &clu
,
1058 dentry
, num_entries
,
1062 if (entry_type
== TYPE_UNUSED
)
1067 exfat_reset_empty_hint(&candi_empty
);
1069 if (entry_type
== TYPE_FILE
|| entry_type
== TYPE_DIR
) {
1070 step
= DIRENT_STEP_FILE
;
1071 hint_opt
->clu
= clu
.dir
;
1073 num_ext
= ep
->dentry
.file
.num_ext
;
1074 step
= DIRENT_STEP_STRM
;
1079 if (entry_type
== TYPE_STREAM
) {
1082 if (step
!= DIRENT_STEP_STRM
) {
1083 step
= DIRENT_STEP_FILE
;
1087 step
= DIRENT_STEP_FILE
;
1088 name_hash
= le16_to_cpu(
1089 ep
->dentry
.stream
.name_hash
);
1090 if (p_uniname
->name_hash
== name_hash
&&
1091 p_uniname
->name_len
==
1092 ep
->dentry
.stream
.name_len
) {
1093 step
= DIRENT_STEP_NAME
;
1102 if (entry_type
== TYPE_EXTEND
) {
1103 unsigned short entry_uniname
[16], unichar
;
1105 if (step
!= DIRENT_STEP_NAME
||
1106 name_len
>= MAX_NAME_LENGTH
) {
1107 step
= DIRENT_STEP_FILE
;
1112 uniname
= p_uniname
->name
;
1114 uniname
+= EXFAT_FILE_NAME_LEN
;
1116 len
= exfat_extract_uni_name(ep
, entry_uniname
);
1119 unichar
= *(uniname
+len
);
1120 *(uniname
+len
) = 0x0;
1122 if (exfat_uniname_ncmp(sb
, uniname
,
1123 entry_uniname
, len
)) {
1124 step
= DIRENT_STEP_FILE
;
1125 } else if (p_uniname
->name_len
== name_len
) {
1126 if (order
== num_ext
)
1128 step
= DIRENT_STEP_SECD
;
1131 *(uniname
+len
) = unichar
;
1136 (TYPE_CRITICAL_SEC
| TYPE_BENIGN_SEC
)) {
1137 if (step
== DIRENT_STEP_SECD
) {
1138 if (++order
== num_ext
)
1143 step
= DIRENT_STEP_FILE
;
1146 if (clu
.flags
== ALLOC_NO_FAT_CHAIN
) {
1150 clu
.dir
= EXFAT_EOF_CLUSTER
;
1152 if (exfat_get_next_cluster(sb
, &clu
.dir
))
1159 * We started at not 0 index,so we should try to find target
1160 * from 0 index to the index we started at.
1162 if (!rewind
&& end_eidx
) {
1165 clu
.dir
= p_dir
->dir
;
1170 * set the EXFAT_EOF_CLUSTER flag to avoid search
1171 * from the beginning again when allocated a new cluster
1173 if (ei
->hint_femp
.eidx
== EXFAT_HINT_NONE
) {
1174 ei
->hint_femp
.cur
.dir
= EXFAT_EOF_CLUSTER
;
1175 ei
->hint_femp
.eidx
= p_dir
->size
* dentries_per_clu
;
1176 ei
->hint_femp
.count
= 0;
1179 /* initialized hint_stat */
1180 hint_stat
->clu
= p_dir
->dir
;
1181 hint_stat
->eidx
= 0;
1185 /* next dentry we'll find is out of this cluster */
1186 if (!((dentry
+ 1) & (dentries_per_clu
- 1))) {
1189 if (clu
.flags
== ALLOC_NO_FAT_CHAIN
) {
1193 clu
.dir
= EXFAT_EOF_CLUSTER
;
1195 ret
= exfat_get_next_cluster(sb
, &clu
.dir
);
1198 if (ret
|| clu
.dir
== EXFAT_EOF_CLUSTER
) {
1199 /* just initialized hint_stat */
1200 hint_stat
->clu
= p_dir
->dir
;
1201 hint_stat
->eidx
= 0;
1202 return (dentry
- num_ext
);
1206 hint_stat
->clu
= clu
.dir
;
1207 hint_stat
->eidx
= dentry
+ 1;
1208 return dentry
- num_ext
;
1211 int exfat_count_dir_entries(struct super_block
*sb
, struct exfat_chain
*p_dir
)
1214 int dentries_per_clu
;
1215 unsigned int entry_type
;
1216 struct exfat_chain clu
;
1217 struct exfat_dentry
*ep
;
1218 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
1219 struct buffer_head
*bh
;
1221 dentries_per_clu
= sbi
->dentries_per_clu
;
1223 exfat_chain_dup(&clu
, p_dir
);
1225 while (clu
.dir
!= EXFAT_EOF_CLUSTER
) {
1226 for (i
= 0; i
< dentries_per_clu
; i
++) {
1227 ep
= exfat_get_dentry(sb
, &clu
, i
, &bh
);
1230 entry_type
= exfat_get_entry_type(ep
);
1233 if (entry_type
== TYPE_UNUSED
)
1235 if (entry_type
!= TYPE_DIR
)
1240 if (clu
.flags
== ALLOC_NO_FAT_CHAIN
) {
1244 clu
.dir
= EXFAT_EOF_CLUSTER
;
1246 if (exfat_get_next_cluster(sb
, &(clu
.dir
)))