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 void 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
;
38 es
= exfat_get_dentry_set(sb
, p_dir
, entry
, ES_ALL_ENTRIES
);
43 * First entry : file entry
44 * Second entry : stream-extension entry
45 * Third entry : first file-name entry
46 * So, the index of first file-name dentry should start from 2.
48 for (i
= 2; i
< es
->num_entries
; i
++) {
49 struct exfat_dentry
*ep
= exfat_get_dentry_cached(es
, i
);
51 /* end of name entry */
52 if (exfat_get_entry_type(ep
) != TYPE_EXTEND
)
55 exfat_extract_uni_name(ep
, uniname
);
56 uniname
+= EXFAT_FILE_NAME_LEN
;
59 exfat_free_dentry_set(es
, false);
62 /* read a directory entry from the opened directory */
63 static int exfat_readdir(struct inode
*inode
, loff_t
*cpos
, struct exfat_dir_entry
*dir_entry
)
65 int i
, dentries_per_clu
, dentries_per_clu_bits
= 0, num_ext
;
66 unsigned int type
, clu_offset
, max_dentries
;
68 struct exfat_chain dir
, clu
;
69 struct exfat_uni_name uni_name
;
70 struct exfat_dentry
*ep
;
71 struct super_block
*sb
= inode
->i_sb
;
72 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
73 struct exfat_inode_info
*ei
= EXFAT_I(inode
);
74 unsigned int dentry
= EXFAT_B_TO_DEN(*cpos
) & 0xFFFFFFFF;
75 struct buffer_head
*bh
;
77 /* check if the given file ID is opened */
78 if (ei
->type
!= TYPE_DIR
)
82 exfat_chain_set(&dir
, sbi
->root_dir
, 0, ALLOC_FAT_CHAIN
);
84 exfat_chain_set(&dir
, ei
->start_clu
,
85 EXFAT_B_TO_CLU(i_size_read(inode
), sbi
), ei
->flags
);
87 dentries_per_clu
= sbi
->dentries_per_clu
;
88 dentries_per_clu_bits
= ilog2(dentries_per_clu
);
89 max_dentries
= (unsigned int)min_t(u64
, MAX_EXFAT_DENTRIES
,
90 (u64
)sbi
->num_clusters
<< dentries_per_clu_bits
);
92 clu_offset
= dentry
>> dentries_per_clu_bits
;
93 exfat_chain_dup(&clu
, &dir
);
95 if (clu
.flags
== ALLOC_NO_FAT_CHAIN
) {
96 clu
.dir
+= clu_offset
;
97 clu
.size
-= clu_offset
;
99 /* hint_information */
100 if (clu_offset
> 0 && ei
->hint_bmap
.off
!= EXFAT_EOF_CLUSTER
&&
101 ei
->hint_bmap
.off
> 0 && clu_offset
>= ei
->hint_bmap
.off
) {
102 clu_offset
-= ei
->hint_bmap
.off
;
103 clu
.dir
= ei
->hint_bmap
.clu
;
106 while (clu_offset
> 0) {
107 if (exfat_get_next_cluster(sb
, &(clu
.dir
)))
114 while (clu
.dir
!= EXFAT_EOF_CLUSTER
&& dentry
< max_dentries
) {
115 i
= dentry
& (dentries_per_clu
- 1);
117 for ( ; i
< dentries_per_clu
; i
++, dentry
++) {
118 ep
= exfat_get_dentry(sb
, &clu
, i
, &bh
, §or
);
122 type
= exfat_get_entry_type(ep
);
123 if (type
== TYPE_UNUSED
) {
128 if (type
!= TYPE_FILE
&& type
!= TYPE_DIR
) {
133 num_ext
= ep
->dentry
.file
.num_ext
;
134 dir_entry
->attr
= le16_to_cpu(ep
->dentry
.file
.attr
);
135 exfat_get_entry_time(sbi
, &dir_entry
->crtime
,
136 ep
->dentry
.file
.create_tz
,
137 ep
->dentry
.file
.create_time
,
138 ep
->dentry
.file
.create_date
,
139 ep
->dentry
.file
.create_time_cs
);
140 exfat_get_entry_time(sbi
, &dir_entry
->mtime
,
141 ep
->dentry
.file
.modify_tz
,
142 ep
->dentry
.file
.modify_time
,
143 ep
->dentry
.file
.modify_date
,
144 ep
->dentry
.file
.modify_time_cs
);
145 exfat_get_entry_time(sbi
, &dir_entry
->atime
,
146 ep
->dentry
.file
.access_tz
,
147 ep
->dentry
.file
.access_time
,
148 ep
->dentry
.file
.access_date
,
151 *uni_name
.name
= 0x0;
152 exfat_get_uniname_from_ext_entry(sb
, &clu
, i
,
154 exfat_utf16_to_nls(sb
, &uni_name
,
155 dir_entry
->namebuf
.lfn
,
156 dir_entry
->namebuf
.lfnbuf_len
);
159 ep
= exfat_get_dentry(sb
, &clu
, i
+ 1, &bh
, NULL
);
163 le64_to_cpu(ep
->dentry
.stream
.valid_size
);
164 dir_entry
->entry
= dentry
;
167 ei
->hint_bmap
.off
= dentry
>> dentries_per_clu_bits
;
168 ei
->hint_bmap
.clu
= clu
.dir
;
170 *cpos
= EXFAT_DEN_TO_B(dentry
+ 1 + num_ext
);
174 if (clu
.flags
== ALLOC_NO_FAT_CHAIN
) {
178 clu
.dir
= EXFAT_EOF_CLUSTER
;
180 if (exfat_get_next_cluster(sb
, &(clu
.dir
)))
185 dir_entry
->namebuf
.lfn
[0] = '\0';
186 *cpos
= EXFAT_DEN_TO_B(dentry
);
190 static void exfat_init_namebuf(struct exfat_dentry_namebuf
*nb
)
196 static int exfat_alloc_namebuf(struct exfat_dentry_namebuf
*nb
)
198 nb
->lfn
= __getname();
201 nb
->lfnbuf_len
= MAX_VFSNAME_BUF_SIZE
;
205 static void exfat_free_namebuf(struct exfat_dentry_namebuf
*nb
)
211 exfat_init_namebuf(nb
);
214 /* skip iterating emit_dots when dir is empty */
215 #define ITER_POS_FILLED_DOTS (2)
216 static int exfat_iterate(struct file
*filp
, struct dir_context
*ctx
)
218 struct inode
*inode
= filp
->f_path
.dentry
->d_inode
;
219 struct super_block
*sb
= inode
->i_sb
;
221 struct exfat_dir_entry de
;
222 struct exfat_dentry_namebuf
*nb
= &(de
.namebuf
);
223 struct exfat_inode_info
*ei
= EXFAT_I(inode
);
226 int err
= 0, fake_offset
= 0;
228 exfat_init_namebuf(nb
);
229 mutex_lock(&EXFAT_SB(sb
)->s_lock
);
232 if (!dir_emit_dots(filp
, ctx
))
235 if (ctx
->pos
== ITER_POS_FILLED_DOTS
) {
240 if (cpos
& (DENTRY_SIZE
- 1)) {
245 /* name buffer should be allocated before use */
246 err
= exfat_alloc_namebuf(nb
);
250 if (ei
->flags
== ALLOC_NO_FAT_CHAIN
&& cpos
>= i_size_read(inode
))
253 err
= exfat_readdir(inode
, &cpos
, &de
);
256 * At least we tried to read a sector. Move cpos to next sector
257 * position (should be aligned).
260 cpos
+= 1 << (sb
->s_blocksize_bits
);
261 cpos
&= ~(sb
->s_blocksize
- 1);
271 i_pos
= ((loff_t
)ei
->start_clu
<< 32) | (de
.entry
& 0xffffffff);
272 tmp
= exfat_iget(sb
, i_pos
);
277 inum
= iunique(sb
, EXFAT_ROOT_INO
);
281 * Before calling dir_emit(), sb_lock should be released.
282 * Because page fault can occur in dir_emit() when the size
283 * of buffer given from user is larger than one page size.
285 mutex_unlock(&EXFAT_SB(sb
)->s_lock
);
286 if (!dir_emit(ctx
, nb
->lfn
, strlen(nb
->lfn
), inum
,
287 (de
.attr
& ATTR_SUBDIR
) ? DT_DIR
: DT_REG
))
289 mutex_lock(&EXFAT_SB(sb
)->s_lock
);
294 if (!cpos
&& fake_offset
)
295 cpos
= ITER_POS_FILLED_DOTS
;
298 mutex_unlock(&EXFAT_SB(sb
)->s_lock
);
301 * To improve performance, free namebuf after unlock sb_lock.
302 * If namebuf is not allocated, this function do nothing
304 exfat_free_namebuf(nb
);
308 const struct file_operations exfat_dir_operations
= {
309 .llseek
= generic_file_llseek
,
310 .read
= generic_read_dir
,
311 .iterate
= exfat_iterate
,
312 .unlocked_ioctl
= exfat_ioctl
,
314 .compat_ioctl
= exfat_compat_ioctl
,
316 .fsync
= exfat_file_fsync
,
319 int exfat_alloc_new_dir(struct inode
*inode
, struct exfat_chain
*clu
)
323 exfat_chain_set(clu
, EXFAT_EOF_CLUSTER
, 0, ALLOC_NO_FAT_CHAIN
);
325 ret
= exfat_alloc_cluster(inode
, 1, clu
, IS_DIRSYNC(inode
));
329 return exfat_zeroed_cluster(inode
, clu
->dir
);
332 int exfat_calc_num_entries(struct exfat_uni_name
*p_uniname
)
336 len
= p_uniname
->name_len
;
340 /* 1 file entry + 1 stream entry + name entries */
341 return ((len
- 1) / EXFAT_FILE_NAME_LEN
+ 3);
344 unsigned int exfat_get_entry_type(struct exfat_dentry
*ep
)
346 if (ep
->type
== EXFAT_UNUSED
)
348 if (IS_EXFAT_DELETED(ep
->type
))
350 if (ep
->type
== EXFAT_INVAL
)
352 if (IS_EXFAT_CRITICAL_PRI(ep
->type
)) {
353 if (ep
->type
== EXFAT_BITMAP
)
355 if (ep
->type
== EXFAT_UPCASE
)
357 if (ep
->type
== EXFAT_VOLUME
)
359 if (ep
->type
== EXFAT_FILE
) {
360 if (le16_to_cpu(ep
->dentry
.file
.attr
) & ATTR_SUBDIR
)
364 return TYPE_CRITICAL_PRI
;
366 if (IS_EXFAT_BENIGN_PRI(ep
->type
)) {
367 if (ep
->type
== EXFAT_GUID
)
369 if (ep
->type
== EXFAT_PADDING
)
371 if (ep
->type
== EXFAT_ACLTAB
)
373 return TYPE_BENIGN_PRI
;
375 if (IS_EXFAT_CRITICAL_SEC(ep
->type
)) {
376 if (ep
->type
== EXFAT_STREAM
)
378 if (ep
->type
== EXFAT_NAME
)
380 if (ep
->type
== EXFAT_ACL
)
382 return TYPE_CRITICAL_SEC
;
384 return TYPE_BENIGN_SEC
;
387 static void exfat_set_entry_type(struct exfat_dentry
*ep
, unsigned int type
)
389 if (type
== TYPE_UNUSED
) {
390 ep
->type
= EXFAT_UNUSED
;
391 } else if (type
== TYPE_DELETED
) {
392 ep
->type
&= EXFAT_DELETE
;
393 } else if (type
== TYPE_STREAM
) {
394 ep
->type
= EXFAT_STREAM
;
395 } else if (type
== TYPE_EXTEND
) {
396 ep
->type
= EXFAT_NAME
;
397 } else if (type
== TYPE_BITMAP
) {
398 ep
->type
= EXFAT_BITMAP
;
399 } else if (type
== TYPE_UPCASE
) {
400 ep
->type
= EXFAT_UPCASE
;
401 } else if (type
== TYPE_VOLUME
) {
402 ep
->type
= EXFAT_VOLUME
;
403 } else if (type
== TYPE_DIR
) {
404 ep
->type
= EXFAT_FILE
;
405 ep
->dentry
.file
.attr
= cpu_to_le16(ATTR_SUBDIR
);
406 } else if (type
== TYPE_FILE
) {
407 ep
->type
= EXFAT_FILE
;
408 ep
->dentry
.file
.attr
= cpu_to_le16(ATTR_ARCHIVE
);
412 static void exfat_init_stream_entry(struct exfat_dentry
*ep
,
413 unsigned char flags
, unsigned int start_clu
,
414 unsigned long long size
)
416 exfat_set_entry_type(ep
, TYPE_STREAM
);
417 ep
->dentry
.stream
.flags
= flags
;
418 ep
->dentry
.stream
.start_clu
= cpu_to_le32(start_clu
);
419 ep
->dentry
.stream
.valid_size
= cpu_to_le64(size
);
420 ep
->dentry
.stream
.size
= cpu_to_le64(size
);
423 static void exfat_init_name_entry(struct exfat_dentry
*ep
,
424 unsigned short *uniname
)
428 exfat_set_entry_type(ep
, TYPE_EXTEND
);
429 ep
->dentry
.name
.flags
= 0x0;
431 for (i
= 0; i
< EXFAT_FILE_NAME_LEN
; i
++) {
432 if (*uniname
!= 0x0) {
433 ep
->dentry
.name
.unicode_0_14
[i
] = cpu_to_le16(*uniname
);
436 ep
->dentry
.name
.unicode_0_14
[i
] = 0x0;
441 int exfat_init_dir_entry(struct inode
*inode
, struct exfat_chain
*p_dir
,
442 int entry
, unsigned int type
, unsigned int start_clu
,
443 unsigned long long size
)
445 struct super_block
*sb
= inode
->i_sb
;
446 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
447 struct timespec64 ts
= current_time(inode
);
449 struct exfat_dentry
*ep
;
450 struct buffer_head
*bh
;
453 * We cannot use exfat_get_dentry_set here because file ep is not
456 ep
= exfat_get_dentry(sb
, p_dir
, entry
, &bh
, §or
);
460 exfat_set_entry_type(ep
, type
);
461 exfat_set_entry_time(sbi
, &ts
,
462 &ep
->dentry
.file
.create_tz
,
463 &ep
->dentry
.file
.create_time
,
464 &ep
->dentry
.file
.create_date
,
465 &ep
->dentry
.file
.create_time_cs
);
466 exfat_set_entry_time(sbi
, &ts
,
467 &ep
->dentry
.file
.modify_tz
,
468 &ep
->dentry
.file
.modify_time
,
469 &ep
->dentry
.file
.modify_date
,
470 &ep
->dentry
.file
.modify_time_cs
);
471 exfat_set_entry_time(sbi
, &ts
,
472 &ep
->dentry
.file
.access_tz
,
473 &ep
->dentry
.file
.access_time
,
474 &ep
->dentry
.file
.access_date
,
477 exfat_update_bh(bh
, IS_DIRSYNC(inode
));
480 ep
= exfat_get_dentry(sb
, p_dir
, entry
+ 1, &bh
, §or
);
484 exfat_init_stream_entry(ep
,
485 (type
== TYPE_FILE
) ? ALLOC_FAT_CHAIN
: ALLOC_NO_FAT_CHAIN
,
487 exfat_update_bh(bh
, IS_DIRSYNC(inode
));
493 int exfat_update_dir_chksum(struct inode
*inode
, struct exfat_chain
*p_dir
,
496 struct super_block
*sb
= inode
->i_sb
;
501 struct exfat_dentry
*ep
, *fep
;
502 struct buffer_head
*fbh
, *bh
;
504 fep
= exfat_get_dentry(sb
, p_dir
, entry
, &fbh
, §or
);
508 num_entries
= fep
->dentry
.file
.num_ext
+ 1;
509 chksum
= exfat_calc_chksum16(fep
, DENTRY_SIZE
, 0, CS_DIR_ENTRY
);
511 for (i
= 1; i
< num_entries
; i
++) {
512 ep
= exfat_get_dentry(sb
, p_dir
, entry
+ i
, &bh
, NULL
);
517 chksum
= exfat_calc_chksum16(ep
, DENTRY_SIZE
, chksum
,
522 fep
->dentry
.file
.checksum
= cpu_to_le16(chksum
);
523 exfat_update_bh(fbh
, IS_DIRSYNC(inode
));
529 int exfat_init_ext_entry(struct inode
*inode
, struct exfat_chain
*p_dir
,
530 int entry
, int num_entries
, struct exfat_uni_name
*p_uniname
)
532 struct super_block
*sb
= inode
->i_sb
;
535 unsigned short *uniname
= p_uniname
->name
;
536 struct exfat_dentry
*ep
;
537 struct buffer_head
*bh
;
538 int sync
= IS_DIRSYNC(inode
);
540 ep
= exfat_get_dentry(sb
, p_dir
, entry
, &bh
, §or
);
544 ep
->dentry
.file
.num_ext
= (unsigned char)(num_entries
- 1);
545 exfat_update_bh(bh
, sync
);
548 ep
= exfat_get_dentry(sb
, p_dir
, entry
+ 1, &bh
, §or
);
552 ep
->dentry
.stream
.name_len
= p_uniname
->name_len
;
553 ep
->dentry
.stream
.name_hash
= cpu_to_le16(p_uniname
->name_hash
);
554 exfat_update_bh(bh
, sync
);
557 for (i
= EXFAT_FIRST_CLUSTER
; i
< num_entries
; i
++) {
558 ep
= exfat_get_dentry(sb
, p_dir
, entry
+ i
, &bh
, §or
);
562 exfat_init_name_entry(ep
, uniname
);
563 exfat_update_bh(bh
, sync
);
565 uniname
+= EXFAT_FILE_NAME_LEN
;
568 exfat_update_dir_chksum(inode
, p_dir
, entry
);
572 int exfat_remove_entries(struct inode
*inode
, struct exfat_chain
*p_dir
,
573 int entry
, int order
, int num_entries
)
575 struct super_block
*sb
= inode
->i_sb
;
578 struct exfat_dentry
*ep
;
579 struct buffer_head
*bh
;
581 for (i
= order
; i
< num_entries
; i
++) {
582 ep
= exfat_get_dentry(sb
, p_dir
, entry
+ i
, &bh
, §or
);
586 exfat_set_entry_type(ep
, TYPE_DELETED
);
587 exfat_update_bh(bh
, IS_DIRSYNC(inode
));
594 void exfat_update_dir_chksum_with_entry_set(struct exfat_entry_set_cache
*es
)
596 int chksum_type
= CS_DIR_ENTRY
, i
;
597 unsigned short chksum
= 0;
598 struct exfat_dentry
*ep
;
600 for (i
= 0; i
< es
->num_entries
; i
++) {
601 ep
= exfat_get_dentry_cached(es
, i
);
602 chksum
= exfat_calc_chksum16(ep
, DENTRY_SIZE
, chksum
,
604 chksum_type
= CS_DEFAULT
;
606 ep
= exfat_get_dentry_cached(es
, 0);
607 ep
->dentry
.file
.checksum
= cpu_to_le16(chksum
);
611 int exfat_free_dentry_set(struct exfat_entry_set_cache
*es
, int sync
)
616 err
= exfat_update_bhs(es
->bh
, es
->num_bh
, sync
);
618 for (i
= 0; i
< es
->num_bh
; i
++)
627 static int exfat_walk_fat_chain(struct super_block
*sb
,
628 struct exfat_chain
*p_dir
, unsigned int byte_offset
,
631 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
632 unsigned int clu_offset
;
633 unsigned int cur_clu
;
635 clu_offset
= EXFAT_B_TO_CLU(byte_offset
, sbi
);
636 cur_clu
= p_dir
->dir
;
638 if (p_dir
->flags
== ALLOC_NO_FAT_CHAIN
) {
639 cur_clu
+= clu_offset
;
641 while (clu_offset
> 0) {
642 if (exfat_get_next_cluster(sb
, &cur_clu
))
644 if (cur_clu
== EXFAT_EOF_CLUSTER
) {
646 "invalid dentry access beyond EOF (clu : %u, eidx : %d)",
648 EXFAT_B_TO_DEN(byte_offset
));
659 int exfat_find_location(struct super_block
*sb
, struct exfat_chain
*p_dir
,
660 int entry
, sector_t
*sector
, int *offset
)
663 unsigned int off
, clu
= 0;
664 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
666 off
= EXFAT_DEN_TO_B(entry
);
668 ret
= exfat_walk_fat_chain(sb
, p_dir
, off
, &clu
);
672 /* byte offset in cluster */
673 off
= EXFAT_CLU_OFFSET(off
, sbi
);
675 /* byte offset in sector */
676 *offset
= EXFAT_BLK_OFFSET(off
, sb
);
678 /* sector offset in cluster */
679 *sector
= EXFAT_B_TO_BLK(off
, sb
);
680 *sector
+= exfat_cluster_to_sector(sbi
, clu
);
684 #define EXFAT_MAX_RA_SIZE (128*1024)
685 static int exfat_dir_readahead(struct super_block
*sb
, sector_t sec
)
687 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
688 struct buffer_head
*bh
;
689 unsigned int max_ra_count
= EXFAT_MAX_RA_SIZE
>> sb
->s_blocksize_bits
;
690 unsigned int page_ra_count
= PAGE_SIZE
>> sb
->s_blocksize_bits
;
691 unsigned int adj_ra_count
= max(sbi
->sect_per_clus
, page_ra_count
);
692 unsigned int ra_count
= min(adj_ra_count
, max_ra_count
);
694 /* Read-ahead is not required */
695 if (sbi
->sect_per_clus
== 1)
698 if (sec
< sbi
->data_start_sector
) {
699 exfat_err(sb
, "requested sector is invalid(sect:%llu, root:%llu)",
700 (unsigned long long)sec
, sbi
->data_start_sector
);
704 /* Not sector aligned with ra_count, resize ra_count to page size */
705 if ((sec
- sbi
->data_start_sector
) & (ra_count
- 1))
706 ra_count
= page_ra_count
;
708 bh
= sb_find_get_block(sb
, sec
);
709 if (!bh
|| !buffer_uptodate(bh
)) {
712 for (i
= 0; i
< ra_count
; i
++)
713 sb_breadahead(sb
, (sector_t
)(sec
+ i
));
719 struct exfat_dentry
*exfat_get_dentry(struct super_block
*sb
,
720 struct exfat_chain
*p_dir
, int entry
, struct buffer_head
**bh
,
723 unsigned int dentries_per_page
= EXFAT_B_TO_DEN(PAGE_SIZE
);
727 if (p_dir
->dir
== DIR_DELETED
) {
728 exfat_err(sb
, "abnormal access to deleted dentry");
732 if (exfat_find_location(sb
, p_dir
, entry
, &sec
, &off
))
735 if (p_dir
->dir
!= EXFAT_FREE_CLUSTER
&&
736 !(entry
& (dentries_per_page
- 1)))
737 exfat_dir_readahead(sb
, sec
);
739 *bh
= sb_bread(sb
, sec
);
745 return (struct exfat_dentry
*)((*bh
)->b_data
+ off
);
748 enum exfat_validate_dentry_mode
{
750 ES_MODE_GET_FILE_ENTRY
,
751 ES_MODE_GET_STRM_ENTRY
,
752 ES_MODE_GET_NAME_ENTRY
,
753 ES_MODE_GET_CRITICAL_SEC_ENTRY
,
756 static bool exfat_validate_entry(unsigned int type
,
757 enum exfat_validate_dentry_mode
*mode
)
759 if (type
== TYPE_UNUSED
|| type
== TYPE_DELETED
)
763 case ES_MODE_STARTED
:
764 if (type
!= TYPE_FILE
&& type
!= TYPE_DIR
)
766 *mode
= ES_MODE_GET_FILE_ENTRY
;
768 case ES_MODE_GET_FILE_ENTRY
:
769 if (type
!= TYPE_STREAM
)
771 *mode
= ES_MODE_GET_STRM_ENTRY
;
773 case ES_MODE_GET_STRM_ENTRY
:
774 if (type
!= TYPE_EXTEND
)
776 *mode
= ES_MODE_GET_NAME_ENTRY
;
778 case ES_MODE_GET_NAME_ENTRY
:
779 if (type
== TYPE_STREAM
)
781 if (type
!= TYPE_EXTEND
) {
782 if (!(type
& TYPE_CRITICAL_SEC
))
784 *mode
= ES_MODE_GET_CRITICAL_SEC_ENTRY
;
787 case ES_MODE_GET_CRITICAL_SEC_ENTRY
:
788 if (type
== TYPE_EXTEND
|| type
== TYPE_STREAM
)
790 if ((type
& TYPE_CRITICAL_SEC
) != TYPE_CRITICAL_SEC
)
799 struct exfat_dentry
*exfat_get_dentry_cached(
800 struct exfat_entry_set_cache
*es
, int num
)
802 int off
= es
->start_off
+ num
* DENTRY_SIZE
;
803 struct buffer_head
*bh
= es
->bh
[EXFAT_B_TO_BLK(off
, es
->sb
)];
804 char *p
= bh
->b_data
+ EXFAT_BLK_OFFSET(off
, es
->sb
);
806 return (struct exfat_dentry
*)p
;
810 * Returns a set of dentries for a file or dir.
812 * Note It provides a direct pointer to bh->data via exfat_get_dentry_cached().
813 * User should call exfat_get_dentry_set() after setting 'modified' to apply
814 * changes made in this entry set to the real device.
817 * sb+p_dir+entry: indicates a file/dir
818 * type: specifies how many dentries should be included.
820 * pointer of entry set on success,
823 struct exfat_entry_set_cache
*exfat_get_dentry_set(struct super_block
*sb
,
824 struct exfat_chain
*p_dir
, int entry
, unsigned int type
)
827 unsigned int off
, byte_offset
, clu
= 0;
829 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
830 struct exfat_entry_set_cache
*es
;
831 struct exfat_dentry
*ep
;
833 enum exfat_validate_dentry_mode mode
= ES_MODE_STARTED
;
834 struct buffer_head
*bh
;
836 if (p_dir
->dir
== DIR_DELETED
) {
837 exfat_err(sb
, "access to deleted dentry");
841 byte_offset
= EXFAT_DEN_TO_B(entry
);
842 ret
= exfat_walk_fat_chain(sb
, p_dir
, byte_offset
, &clu
);
846 es
= kzalloc(sizeof(*es
), GFP_KERNEL
);
850 es
->modified
= false;
852 /* byte offset in cluster */
853 byte_offset
= EXFAT_CLU_OFFSET(byte_offset
, sbi
);
855 /* byte offset in sector */
856 off
= EXFAT_BLK_OFFSET(byte_offset
, sb
);
859 /* sector offset in cluster */
860 sec
= EXFAT_B_TO_BLK(byte_offset
, sb
);
861 sec
+= exfat_cluster_to_sector(sbi
, clu
);
863 bh
= sb_bread(sb
, sec
);
866 es
->bh
[es
->num_bh
++] = bh
;
868 ep
= exfat_get_dentry_cached(es
, 0);
869 if (!exfat_validate_entry(exfat_get_entry_type(ep
), &mode
))
872 num_entries
= type
== ES_ALL_ENTRIES
?
873 ep
->dentry
.file
.num_ext
+ 1 : type
;
874 es
->num_entries
= num_entries
;
876 num_bh
= EXFAT_B_TO_BLK_ROUND_UP(off
+ num_entries
* DENTRY_SIZE
, sb
);
877 for (i
= 1; i
< num_bh
; i
++) {
878 /* get the next sector */
879 if (exfat_is_last_sector_in_cluster(sbi
, sec
)) {
880 if (p_dir
->flags
== ALLOC_NO_FAT_CHAIN
)
882 else if (exfat_get_next_cluster(sb
, &clu
))
884 sec
= exfat_cluster_to_sector(sbi
, clu
);
889 bh
= sb_bread(sb
, sec
);
892 es
->bh
[es
->num_bh
++] = bh
;
895 /* validiate cached dentries */
896 for (i
= 1; i
< num_entries
; i
++) {
897 ep
= exfat_get_dentry_cached(es
, i
);
898 if (!exfat_validate_entry(exfat_get_entry_type(ep
), &mode
))
904 exfat_free_dentry_set(es
, false);
916 * @ei: inode info of parent directory
917 * @p_dir: directory structure of parent directory
918 * @num_entries:entry size of p_uniname
919 * @hint_opt: If p_uniname is found, filled with optimized dir/entry
920 * for traversing cluster chain.
922 * >= 0: file directory entry position where the name exists
923 * -ENOENT: entry with the name does not exist
926 int exfat_find_dir_entry(struct super_block
*sb
, struct exfat_inode_info
*ei
,
927 struct exfat_chain
*p_dir
, struct exfat_uni_name
*p_uniname
,
928 int num_entries
, unsigned int type
, struct exfat_hint
*hint_opt
)
930 int i
, rewind
= 0, dentry
= 0, end_eidx
= 0, num_ext
= 0, len
;
931 int order
, step
, name_len
= 0;
932 int dentries_per_clu
, num_empty
= 0;
933 unsigned int entry_type
;
934 unsigned short *uniname
= NULL
;
935 struct exfat_chain clu
;
936 struct exfat_hint
*hint_stat
= &ei
->hint_stat
;
937 struct exfat_hint_femp candi_empty
;
938 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
940 dentries_per_clu
= sbi
->dentries_per_clu
;
942 exfat_chain_dup(&clu
, p_dir
);
944 if (hint_stat
->eidx
) {
945 clu
.dir
= hint_stat
->clu
;
946 dentry
= hint_stat
->eidx
;
950 candi_empty
.eidx
= EXFAT_HINT_NONE
;
953 step
= DIRENT_STEP_FILE
;
954 while (clu
.dir
!= EXFAT_EOF_CLUSTER
) {
955 i
= dentry
& (dentries_per_clu
- 1);
956 for (; i
< dentries_per_clu
; i
++, dentry
++) {
957 struct exfat_dentry
*ep
;
958 struct buffer_head
*bh
;
960 if (rewind
&& dentry
== end_eidx
)
963 ep
= exfat_get_dentry(sb
, &clu
, i
, &bh
, NULL
);
967 entry_type
= exfat_get_entry_type(ep
);
969 if (entry_type
== TYPE_UNUSED
||
970 entry_type
== TYPE_DELETED
) {
971 step
= DIRENT_STEP_FILE
;
974 if (candi_empty
.eidx
== EXFAT_HINT_NONE
&&
976 exfat_chain_set(&candi_empty
.cur
,
977 clu
.dir
, clu
.size
, clu
.flags
);
980 if (candi_empty
.eidx
== EXFAT_HINT_NONE
&&
981 num_empty
>= num_entries
) {
983 dentry
- (num_empty
- 1);
984 WARN_ON(candi_empty
.eidx
< 0);
985 candi_empty
.count
= num_empty
;
987 if (ei
->hint_femp
.eidx
==
991 ei
->hint_femp
= candi_empty
;
995 if (entry_type
== TYPE_UNUSED
)
1001 candi_empty
.eidx
= EXFAT_HINT_NONE
;
1003 if (entry_type
== TYPE_FILE
|| entry_type
== TYPE_DIR
) {
1004 step
= DIRENT_STEP_FILE
;
1005 hint_opt
->clu
= clu
.dir
;
1007 if (type
== TYPE_ALL
|| type
== entry_type
) {
1008 num_ext
= ep
->dentry
.file
.num_ext
;
1009 step
= DIRENT_STEP_STRM
;
1015 if (entry_type
== TYPE_STREAM
) {
1018 if (step
!= DIRENT_STEP_STRM
) {
1019 step
= DIRENT_STEP_FILE
;
1023 step
= DIRENT_STEP_FILE
;
1024 name_hash
= le16_to_cpu(
1025 ep
->dentry
.stream
.name_hash
);
1026 if (p_uniname
->name_hash
== name_hash
&&
1027 p_uniname
->name_len
==
1028 ep
->dentry
.stream
.name_len
) {
1029 step
= DIRENT_STEP_NAME
;
1038 if (entry_type
== TYPE_EXTEND
) {
1039 unsigned short entry_uniname
[16], unichar
;
1041 if (step
!= DIRENT_STEP_NAME
) {
1042 step
= DIRENT_STEP_FILE
;
1047 uniname
= p_uniname
->name
;
1049 uniname
+= EXFAT_FILE_NAME_LEN
;
1051 len
= exfat_extract_uni_name(ep
, entry_uniname
);
1054 unichar
= *(uniname
+len
);
1055 *(uniname
+len
) = 0x0;
1057 if (exfat_uniname_ncmp(sb
, uniname
,
1058 entry_uniname
, len
)) {
1059 step
= DIRENT_STEP_FILE
;
1060 } else if (p_uniname
->name_len
== name_len
) {
1061 if (order
== num_ext
)
1063 step
= DIRENT_STEP_SECD
;
1066 *(uniname
+len
) = unichar
;
1071 (TYPE_CRITICAL_SEC
| TYPE_BENIGN_SEC
)) {
1072 if (step
== DIRENT_STEP_SECD
) {
1073 if (++order
== num_ext
)
1078 step
= DIRENT_STEP_FILE
;
1081 if (clu
.flags
== ALLOC_NO_FAT_CHAIN
) {
1085 clu
.dir
= EXFAT_EOF_CLUSTER
;
1087 if (exfat_get_next_cluster(sb
, &clu
.dir
))
1094 * We started at not 0 index,so we should try to find target
1095 * from 0 index to the index we started at.
1097 if (!rewind
&& end_eidx
) {
1100 clu
.dir
= p_dir
->dir
;
1101 /* reset empty hint */
1103 candi_empty
.eidx
= EXFAT_HINT_NONE
;
1107 /* initialized hint_stat */
1108 hint_stat
->clu
= p_dir
->dir
;
1109 hint_stat
->eidx
= 0;
1113 /* next dentry we'll find is out of this cluster */
1114 if (!((dentry
+ 1) & (dentries_per_clu
- 1))) {
1117 if (clu
.flags
== ALLOC_NO_FAT_CHAIN
) {
1121 clu
.dir
= EXFAT_EOF_CLUSTER
;
1123 ret
= exfat_get_next_cluster(sb
, &clu
.dir
);
1126 if (ret
|| clu
.dir
== EXFAT_EOF_CLUSTER
) {
1127 /* just initialized hint_stat */
1128 hint_stat
->clu
= p_dir
->dir
;
1129 hint_stat
->eidx
= 0;
1130 return (dentry
- num_ext
);
1134 hint_stat
->clu
= clu
.dir
;
1135 hint_stat
->eidx
= dentry
+ 1;
1136 return dentry
- num_ext
;
1139 int exfat_count_ext_entries(struct super_block
*sb
, struct exfat_chain
*p_dir
,
1140 int entry
, struct exfat_dentry
*ep
)
1144 struct exfat_dentry
*ext_ep
;
1145 struct buffer_head
*bh
;
1147 for (i
= 0, entry
++; i
< ep
->dentry
.file
.num_ext
; i
++, entry
++) {
1148 ext_ep
= exfat_get_dentry(sb
, p_dir
, entry
, &bh
, NULL
);
1152 type
= exfat_get_entry_type(ext_ep
);
1154 if (type
== TYPE_EXTEND
|| type
== TYPE_STREAM
)
1162 int exfat_count_dir_entries(struct super_block
*sb
, struct exfat_chain
*p_dir
)
1165 int dentries_per_clu
;
1166 unsigned int entry_type
;
1167 struct exfat_chain clu
;
1168 struct exfat_dentry
*ep
;
1169 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
1170 struct buffer_head
*bh
;
1172 dentries_per_clu
= sbi
->dentries_per_clu
;
1174 exfat_chain_dup(&clu
, p_dir
);
1176 while (clu
.dir
!= EXFAT_EOF_CLUSTER
) {
1177 for (i
= 0; i
< dentries_per_clu
; i
++) {
1178 ep
= exfat_get_dentry(sb
, &clu
, i
, &bh
, NULL
);
1181 entry_type
= exfat_get_entry_type(ep
);
1184 if (entry_type
== TYPE_UNUSED
)
1186 if (entry_type
!= TYPE_DIR
)
1191 if (clu
.flags
== ALLOC_NO_FAT_CHAIN
) {
1195 clu
.dir
= EXFAT_EOF_CLUSTER
;
1197 if (exfat_get_next_cluster(sb
, &(clu
.dir
)))