1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd.
6 #include <linux/iversion.h>
7 #include <linux/namei.h>
8 #include <linux/slab.h>
9 #include <linux/buffer_head.h>
10 #include <linux/nls.h>
12 #include "exfat_raw.h"
15 static inline unsigned long exfat_d_version(struct dentry
*dentry
)
17 return (unsigned long) dentry
->d_fsdata
;
20 static inline void exfat_d_version_set(struct dentry
*dentry
,
21 unsigned long version
)
23 dentry
->d_fsdata
= (void *) version
;
27 * If new entry was created in the parent, it could create the 8.3 alias (the
28 * shortname of logname). So, the parent may have the negative-dentry which
29 * matches the created 8.3 alias.
31 * If it happened, the negative dentry isn't actually negative anymore. So,
34 static int exfat_d_revalidate(struct dentry
*dentry
, unsigned int flags
)
38 if (flags
& LOOKUP_RCU
)
42 * This is not negative dentry. Always valid.
44 * Note, rename() to existing directory entry will have ->d_inode, and
45 * will use existing name which isn't specified name by user.
47 * We may be able to drop this positive dentry here. But dropping
48 * positive dentry isn't good idea. So it's unsupported like
49 * rename("filename", "FILENAME") for now.
51 if (d_really_is_positive(dentry
))
55 * Drop the negative dentry, in order to make sure to use the case
56 * sensitive name which is specified by user if this is for creation.
58 if (flags
& (LOOKUP_CREATE
| LOOKUP_RENAME_TARGET
))
61 spin_lock(&dentry
->d_lock
);
62 ret
= inode_eq_iversion(d_inode(dentry
->d_parent
),
63 exfat_d_version(dentry
));
64 spin_unlock(&dentry
->d_lock
);
68 /* returns the length of a struct qstr, ignoring trailing dots if necessary */
69 static unsigned int exfat_striptail_len(unsigned int len
, const char *name
,
72 if (!keep_last_dots
) {
73 while (len
&& name
[len
- 1] == '.')
80 * Compute the hash for the exfat name corresponding to the dentry. If the name
81 * is invalid, we leave the hash code unchanged so that the existing dentry can
82 * be used. The exfat fs routines will return ENOENT or EINVAL as appropriate.
84 static int exfat_d_hash(const struct dentry
*dentry
, struct qstr
*qstr
)
86 struct super_block
*sb
= dentry
->d_sb
;
87 struct nls_table
*t
= EXFAT_SB(sb
)->nls_io
;
88 const unsigned char *name
= qstr
->name
;
89 unsigned int len
= exfat_striptail_len(qstr
->len
, qstr
->name
,
90 EXFAT_SB(sb
)->options
.keep_last_dots
);
91 unsigned long hash
= init_name_hash(dentry
);
95 for (i
= 0; i
< len
; i
+= charlen
) {
96 charlen
= t
->char2uni(&name
[i
], len
- i
, &c
);
99 hash
= partial_name_hash(exfat_toupper(sb
, c
), hash
);
102 qstr
->hash
= end_name_hash(hash
);
106 static int exfat_d_cmp(const struct dentry
*dentry
, unsigned int len
,
107 const char *str
, const struct qstr
*name
)
109 struct super_block
*sb
= dentry
->d_sb
;
110 struct nls_table
*t
= EXFAT_SB(sb
)->nls_io
;
111 unsigned int alen
= exfat_striptail_len(name
->len
, name
->name
,
112 EXFAT_SB(sb
)->options
.keep_last_dots
);
113 unsigned int blen
= exfat_striptail_len(len
, str
,
114 EXFAT_SB(sb
)->options
.keep_last_dots
);
121 for (i
= 0; i
< len
; i
+= charlen
) {
122 charlen
= t
->char2uni(&name
->name
[i
], alen
- i
, &c1
);
125 if (charlen
!= t
->char2uni(&str
[i
], blen
- i
, &c2
))
128 if (exfat_toupper(sb
, c1
) != exfat_toupper(sb
, c2
))
135 const struct dentry_operations exfat_dentry_ops
= {
136 .d_revalidate
= exfat_d_revalidate
,
137 .d_hash
= exfat_d_hash
,
138 .d_compare
= exfat_d_cmp
,
141 static int exfat_utf8_d_hash(const struct dentry
*dentry
, struct qstr
*qstr
)
143 struct super_block
*sb
= dentry
->d_sb
;
144 const unsigned char *name
= qstr
->name
;
145 unsigned int len
= exfat_striptail_len(qstr
->len
, qstr
->name
,
146 EXFAT_SB(sb
)->options
.keep_last_dots
);
147 unsigned long hash
= init_name_hash(dentry
);
151 for (i
= 0; i
< len
; i
+= charlen
) {
152 charlen
= utf8_to_utf32(&name
[i
], len
- i
, &u
);
157 * exfat_toupper() works only for code points up to the U+FFFF.
159 hash
= partial_name_hash(u
<= 0xFFFF ? exfat_toupper(sb
, u
) : u
,
163 qstr
->hash
= end_name_hash(hash
);
167 static int exfat_utf8_d_cmp(const struct dentry
*dentry
, unsigned int len
,
168 const char *str
, const struct qstr
*name
)
170 struct super_block
*sb
= dentry
->d_sb
;
171 unsigned int alen
= exfat_striptail_len(name
->len
, name
->name
,
172 EXFAT_SB(sb
)->options
.keep_last_dots
);
173 unsigned int blen
= exfat_striptail_len(len
, str
,
174 EXFAT_SB(sb
)->options
.keep_last_dots
);
182 for (i
= 0; i
< alen
; i
+= charlen
) {
183 charlen
= utf8_to_utf32(&name
->name
[i
], alen
- i
, &u_a
);
186 if (charlen
!= utf8_to_utf32(&str
[i
], blen
- i
, &u_b
))
189 if (u_a
<= 0xFFFF && u_b
<= 0xFFFF) {
190 if (exfat_toupper(sb
, u_a
) != exfat_toupper(sb
, u_b
))
201 const struct dentry_operations exfat_utf8_dentry_ops
= {
202 .d_revalidate
= exfat_d_revalidate
,
203 .d_hash
= exfat_utf8_d_hash
,
204 .d_compare
= exfat_utf8_d_cmp
,
207 /* used only in search empty_slot() */
208 #define CNT_UNUSED_NOHIT (-1)
209 #define CNT_UNUSED_HIT (-2)
210 /* search EMPTY CONTINUOUS "num_entries" entries */
211 static int exfat_search_empty_slot(struct super_block
*sb
,
212 struct exfat_hint_femp
*hint_femp
, struct exfat_chain
*p_dir
,
215 int i
, dentry
, num_empty
= 0;
216 int dentries_per_clu
;
218 struct exfat_chain clu
;
219 struct exfat_dentry
*ep
;
220 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
221 struct buffer_head
*bh
;
223 dentries_per_clu
= sbi
->dentries_per_clu
;
225 if (hint_femp
->eidx
!= EXFAT_HINT_NONE
) {
226 dentry
= hint_femp
->eidx
;
227 if (num_entries
<= hint_femp
->count
) {
228 hint_femp
->eidx
= EXFAT_HINT_NONE
;
232 exfat_chain_dup(&clu
, &hint_femp
->cur
);
234 exfat_chain_dup(&clu
, p_dir
);
238 while (clu
.dir
!= EXFAT_EOF_CLUSTER
) {
239 i
= dentry
& (dentries_per_clu
- 1);
241 for (; i
< dentries_per_clu
; i
++, dentry
++) {
242 ep
= exfat_get_dentry(sb
, &clu
, i
, &bh
);
245 type
= exfat_get_entry_type(ep
);
248 if (type
== TYPE_UNUSED
|| type
== TYPE_DELETED
) {
250 if (hint_femp
->eidx
== EXFAT_HINT_NONE
) {
251 hint_femp
->eidx
= dentry
;
252 hint_femp
->count
= CNT_UNUSED_NOHIT
;
253 exfat_chain_set(&hint_femp
->cur
,
254 clu
.dir
, clu
.size
, clu
.flags
);
257 if (type
== TYPE_UNUSED
&&
258 hint_femp
->count
!= CNT_UNUSED_HIT
)
259 hint_femp
->count
= CNT_UNUSED_HIT
;
261 if (hint_femp
->eidx
!= EXFAT_HINT_NONE
&&
262 hint_femp
->count
== CNT_UNUSED_HIT
) {
263 /* unused empty group means
264 * an empty group which includes
268 "found bogus dentry(%d) beyond unused empty group(%d) (start_clu : %u, cur_clu : %u)",
269 dentry
, hint_femp
->eidx
,
270 p_dir
->dir
, clu
.dir
);
275 hint_femp
->eidx
= EXFAT_HINT_NONE
;
278 if (num_empty
>= num_entries
) {
279 /* found and invalidate hint_femp */
280 hint_femp
->eidx
= EXFAT_HINT_NONE
;
281 return (dentry
- (num_entries
- 1));
285 if (clu
.flags
== ALLOC_NO_FAT_CHAIN
) {
289 clu
.dir
= EXFAT_EOF_CLUSTER
;
291 if (exfat_get_next_cluster(sb
, &clu
.dir
))
299 static int exfat_check_max_dentries(struct inode
*inode
)
301 if (EXFAT_B_TO_DEN(i_size_read(inode
)) >= MAX_EXFAT_DENTRIES
) {
303 * exFAT spec allows a dir to grow up to 8388608(256MB)
311 /* find empty directory entry.
312 * if there isn't any empty slot, expand cluster chain.
314 static int exfat_find_empty_entry(struct inode
*inode
,
315 struct exfat_chain
*p_dir
, int num_entries
)
318 unsigned int ret
, last_clu
;
320 struct exfat_chain clu
;
321 struct super_block
*sb
= inode
->i_sb
;
322 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
323 struct exfat_inode_info
*ei
= EXFAT_I(inode
);
324 struct exfat_hint_femp hint_femp
;
326 hint_femp
.eidx
= EXFAT_HINT_NONE
;
328 if (ei
->hint_femp
.eidx
!= EXFAT_HINT_NONE
) {
329 hint_femp
= ei
->hint_femp
;
330 ei
->hint_femp
.eidx
= EXFAT_HINT_NONE
;
333 while ((dentry
= exfat_search_empty_slot(sb
, &hint_femp
, p_dir
,
338 if (exfat_check_max_dentries(inode
))
341 /* we trust p_dir->size regardless of FAT type */
342 if (exfat_find_last_cluster(sb
, p_dir
, &last_clu
))
346 * Allocate new cluster to this directory
348 exfat_chain_set(&clu
, last_clu
+ 1, 0, p_dir
->flags
);
350 /* allocate a cluster */
351 ret
= exfat_alloc_cluster(inode
, 1, &clu
, IS_DIRSYNC(inode
));
355 if (exfat_zeroed_cluster(inode
, clu
.dir
))
358 /* append to the FAT chain */
359 if (clu
.flags
!= p_dir
->flags
) {
360 /* no-fat-chain bit is disabled,
361 * so fat-chain should be synced with alloc-bitmap
363 exfat_chain_cont_cluster(sb
, p_dir
->dir
, p_dir
->size
);
364 p_dir
->flags
= ALLOC_FAT_CHAIN
;
365 hint_femp
.cur
.flags
= ALLOC_FAT_CHAIN
;
368 if (clu
.flags
== ALLOC_FAT_CHAIN
)
369 if (exfat_ent_set(sb
, last_clu
, clu
.dir
))
372 if (hint_femp
.eidx
== EXFAT_HINT_NONE
) {
373 /* the special case that new dentry
374 * should be allocated from the start of new cluster
376 hint_femp
.eidx
= EXFAT_B_TO_DEN_IDX(p_dir
->size
, sbi
);
377 hint_femp
.count
= sbi
->dentries_per_clu
;
379 exfat_chain_set(&hint_femp
.cur
, clu
.dir
, 0, clu
.flags
);
381 hint_femp
.cur
.size
++;
383 size
= EXFAT_CLU_TO_B(p_dir
->size
, sbi
);
385 /* directory inode should be updated in here */
386 i_size_write(inode
, size
);
387 ei
->i_size_ondisk
+= sbi
->cluster_size
;
388 ei
->i_size_aligned
+= sbi
->cluster_size
;
389 ei
->flags
= p_dir
->flags
;
390 inode
->i_blocks
+= 1 << sbi
->sect_per_clus_bits
;
397 * Name Resolution Functions :
398 * Zero if it was successful; otherwise nonzero.
400 static int __exfat_resolve_path(struct inode
*inode
, const unsigned char *path
,
401 struct exfat_chain
*p_dir
, struct exfat_uni_name
*p_uniname
,
405 int lossy
= NLS_NAME_NO_LOSSY
;
406 struct super_block
*sb
= inode
->i_sb
;
407 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
408 struct exfat_inode_info
*ei
= EXFAT_I(inode
);
409 int pathlen
= strlen(path
);
412 * get the length of the pathname excluding
413 * trailing periods, if any.
415 namelen
= exfat_striptail_len(pathlen
, path
, false);
416 if (EXFAT_SB(sb
)->options
.keep_last_dots
) {
418 * Do not allow the creation of files with names
419 * ending with period(s).
421 if (!lookup
&& (namelen
< pathlen
))
427 if (pathlen
> (MAX_NAME_LENGTH
* MAX_CHARSET_SIZE
))
428 return -ENAMETOOLONG
;
431 * strip all leading spaces :
432 * "MS windows 7" supports leading spaces.
433 * So we should skip this preprocessing for compatibility.
436 /* file name conversion :
437 * If lookup case, we allow bad-name for compatibility.
439 namelen
= exfat_nls_to_utf16(sb
, path
, namelen
, p_uniname
,
442 return namelen
; /* return error value */
444 if ((lossy
&& !lookup
) || !namelen
)
445 return (lossy
& NLS_NAME_OVERLEN
) ? -ENAMETOOLONG
: -EINVAL
;
447 exfat_chain_set(p_dir
, ei
->start_clu
,
448 EXFAT_B_TO_CLU(i_size_read(inode
), sbi
), ei
->flags
);
453 static inline int exfat_resolve_path(struct inode
*inode
,
454 const unsigned char *path
, struct exfat_chain
*dir
,
455 struct exfat_uni_name
*uni
)
457 return __exfat_resolve_path(inode
, path
, dir
, uni
, 0);
460 static inline int exfat_resolve_path_for_lookup(struct inode
*inode
,
461 const unsigned char *path
, struct exfat_chain
*dir
,
462 struct exfat_uni_name
*uni
)
464 return __exfat_resolve_path(inode
, path
, dir
, uni
, 1);
467 static inline loff_t
exfat_make_i_pos(struct exfat_dir_entry
*info
)
469 return ((loff_t
) info
->dir
.dir
<< 32) | (info
->entry
& 0xffffffff);
472 static int exfat_add_entry(struct inode
*inode
, const char *path
,
473 struct exfat_chain
*p_dir
, unsigned int type
,
474 struct exfat_dir_entry
*info
)
476 int ret
, dentry
, num_entries
;
477 struct super_block
*sb
= inode
->i_sb
;
478 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
479 struct exfat_uni_name uniname
;
480 struct exfat_chain clu
;
482 unsigned int start_clu
= EXFAT_FREE_CLUSTER
;
484 ret
= exfat_resolve_path(inode
, path
, p_dir
, &uniname
);
488 num_entries
= exfat_calc_num_entries(&uniname
);
489 if (num_entries
< 0) {
494 /* exfat_find_empty_entry must be called before alloc_cluster() */
495 dentry
= exfat_find_empty_entry(inode
, p_dir
, num_entries
);
497 ret
= dentry
; /* -EIO or -ENOSPC */
501 if (type
== TYPE_DIR
) {
502 ret
= exfat_alloc_new_dir(inode
, &clu
);
506 clu_size
= sbi
->cluster_size
;
509 /* update the directory entry */
510 /* fill the dos name directory entry information of the created file.
511 * the first cluster is not determined yet. (0)
513 ret
= exfat_init_dir_entry(inode
, p_dir
, dentry
, type
,
514 start_clu
, clu_size
);
518 ret
= exfat_init_ext_entry(inode
, p_dir
, dentry
, num_entries
, &uniname
);
523 info
->entry
= dentry
;
524 info
->flags
= ALLOC_NO_FAT_CHAIN
;
527 if (type
== TYPE_FILE
) {
528 info
->attr
= ATTR_ARCHIVE
;
529 info
->start_clu
= EXFAT_EOF_CLUSTER
;
531 info
->num_subdirs
= 0;
533 info
->attr
= ATTR_SUBDIR
;
534 info
->start_clu
= start_clu
;
535 info
->size
= clu_size
;
536 info
->num_subdirs
= EXFAT_MIN_SUBDIR
;
538 memset(&info
->crtime
, 0, sizeof(info
->crtime
));
539 memset(&info
->mtime
, 0, sizeof(info
->mtime
));
540 memset(&info
->atime
, 0, sizeof(info
->atime
));
545 static int exfat_create(struct user_namespace
*mnt_userns
, struct inode
*dir
,
546 struct dentry
*dentry
, umode_t mode
, bool excl
)
548 struct super_block
*sb
= dir
->i_sb
;
550 struct exfat_chain cdir
;
551 struct exfat_dir_entry info
;
555 mutex_lock(&EXFAT_SB(sb
)->s_lock
);
556 exfat_set_volume_dirty(sb
);
557 err
= exfat_add_entry(dir
, dentry
->d_name
.name
, &cdir
, TYPE_FILE
,
562 inode_inc_iversion(dir
);
563 dir
->i_ctime
= dir
->i_mtime
= current_time(dir
);
565 exfat_sync_inode(dir
);
567 mark_inode_dirty(dir
);
569 i_pos
= exfat_make_i_pos(&info
);
570 inode
= exfat_build_inode(sb
, &info
, i_pos
);
571 err
= PTR_ERR_OR_ZERO(inode
);
575 inode_inc_iversion(inode
);
576 inode
->i_mtime
= inode
->i_atime
= inode
->i_ctime
=
577 EXFAT_I(inode
)->i_crtime
= current_time(inode
);
578 exfat_truncate_atime(&inode
->i_atime
);
579 /* timestamp is already written, so mark_inode_dirty() is unneeded. */
581 d_instantiate(dentry
, inode
);
583 mutex_unlock(&EXFAT_SB(sb
)->s_lock
);
588 static int exfat_find(struct inode
*dir
, struct qstr
*qname
,
589 struct exfat_dir_entry
*info
)
591 int ret
, dentry
, num_entries
, count
;
592 struct exfat_chain cdir
;
593 struct exfat_uni_name uni_name
;
594 struct super_block
*sb
= dir
->i_sb
;
595 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
596 struct exfat_inode_info
*ei
= EXFAT_I(dir
);
597 struct exfat_dentry
*ep
, *ep2
;
598 struct exfat_entry_set_cache
*es
;
599 /* for optimized dir & entry to prevent long traverse of cluster chain */
600 struct exfat_hint hint_opt
;
605 /* check the validity of directory name in the given pathname */
606 ret
= exfat_resolve_path_for_lookup(dir
, qname
->name
, &cdir
, &uni_name
);
610 num_entries
= exfat_calc_num_entries(&uni_name
);
614 /* check the validation of hint_stat and initialize it if required */
615 if (ei
->version
!= (inode_peek_iversion_raw(dir
) & 0xffffffff)) {
616 ei
->hint_stat
.clu
= cdir
.dir
;
617 ei
->hint_stat
.eidx
= 0;
618 ei
->version
= (inode_peek_iversion_raw(dir
) & 0xffffffff);
619 ei
->hint_femp
.eidx
= EXFAT_HINT_NONE
;
622 /* search the file name for directories */
623 dentry
= exfat_find_dir_entry(sb
, ei
, &cdir
, &uni_name
,
624 num_entries
, TYPE_ALL
, &hint_opt
);
627 return dentry
; /* -error value */
630 info
->entry
= dentry
;
631 info
->num_subdirs
= 0;
633 /* adjust cdir to the optimized value */
634 cdir
.dir
= hint_opt
.clu
;
635 if (cdir
.flags
& ALLOC_NO_FAT_CHAIN
)
636 cdir
.size
-= dentry
/ sbi
->dentries_per_clu
;
637 dentry
= hint_opt
.eidx
;
638 es
= exfat_get_dentry_set(sb
, &cdir
, dentry
, ES_2_ENTRIES
);
641 ep
= exfat_get_dentry_cached(es
, 0);
642 ep2
= exfat_get_dentry_cached(es
, 1);
644 info
->type
= exfat_get_entry_type(ep
);
645 info
->attr
= le16_to_cpu(ep
->dentry
.file
.attr
);
646 info
->size
= le64_to_cpu(ep2
->dentry
.stream
.valid_size
);
647 if ((info
->type
== TYPE_FILE
) && (info
->size
== 0)) {
648 info
->flags
= ALLOC_NO_FAT_CHAIN
;
649 info
->start_clu
= EXFAT_EOF_CLUSTER
;
651 info
->flags
= ep2
->dentry
.stream
.flags
;
653 le32_to_cpu(ep2
->dentry
.stream
.start_clu
);
656 exfat_get_entry_time(sbi
, &info
->crtime
,
657 ep
->dentry
.file
.create_tz
,
658 ep
->dentry
.file
.create_time
,
659 ep
->dentry
.file
.create_date
,
660 ep
->dentry
.file
.create_time_cs
);
661 exfat_get_entry_time(sbi
, &info
->mtime
,
662 ep
->dentry
.file
.modify_tz
,
663 ep
->dentry
.file
.modify_time
,
664 ep
->dentry
.file
.modify_date
,
665 ep
->dentry
.file
.modify_time_cs
);
666 exfat_get_entry_time(sbi
, &info
->atime
,
667 ep
->dentry
.file
.access_tz
,
668 ep
->dentry
.file
.access_time
,
669 ep
->dentry
.file
.access_date
,
671 exfat_free_dentry_set(es
, false);
673 if (ei
->start_clu
== EXFAT_FREE_CLUSTER
) {
675 "non-zero size file starts with zero cluster (size : %llu, p_dir : %u, entry : 0x%08x)",
676 i_size_read(dir
), ei
->dir
.dir
, ei
->entry
);
680 if (info
->type
== TYPE_DIR
) {
681 exfat_chain_set(&cdir
, info
->start_clu
,
682 EXFAT_B_TO_CLU(info
->size
, sbi
), info
->flags
);
683 count
= exfat_count_dir_entries(sb
, &cdir
);
687 info
->num_subdirs
= count
+ EXFAT_MIN_SUBDIR
;
692 static int exfat_d_anon_disconn(struct dentry
*dentry
)
694 return IS_ROOT(dentry
) && (dentry
->d_flags
& DCACHE_DISCONNECTED
);
697 static struct dentry
*exfat_lookup(struct inode
*dir
, struct dentry
*dentry
,
700 struct super_block
*sb
= dir
->i_sb
;
702 struct dentry
*alias
;
703 struct exfat_dir_entry info
;
708 mutex_lock(&EXFAT_SB(sb
)->s_lock
);
709 err
= exfat_find(dir
, &dentry
->d_name
, &info
);
711 if (err
== -ENOENT
) {
718 i_pos
= exfat_make_i_pos(&info
);
719 inode
= exfat_build_inode(sb
, &info
, i_pos
);
720 err
= PTR_ERR_OR_ZERO(inode
);
724 i_mode
= inode
->i_mode
;
725 alias
= d_find_alias(inode
);
728 * Checking "alias->d_parent == dentry->d_parent" to make sure
729 * FS is not corrupted (especially double linked dir).
731 if (alias
&& alias
->d_parent
== dentry
->d_parent
&&
732 !exfat_d_anon_disconn(alias
)) {
735 * Unhashed alias is able to exist because of revalidate()
736 * called by lookup_fast. You can easily make this status
737 * by calling create and lookup concurrently
738 * In such case, we reuse an alias instead of new dentry
740 if (d_unhashed(alias
)) {
741 WARN_ON(alias
->d_name
.hash_len
!=
742 dentry
->d_name
.hash_len
);
743 exfat_info(sb
, "rehashed a dentry(%p) in read lookup",
747 } else if (!S_ISDIR(i_mode
)) {
749 * This inode has non anonymous-DCACHE_DISCONNECTED
750 * dentry. This means, the user did ->lookup() by an
751 * another name (longname vs 8.3 alias of it) in past.
753 * Switch to new one for reason of locality if possible.
755 d_move(alias
, dentry
);
758 mutex_unlock(&EXFAT_SB(sb
)->s_lock
);
763 mutex_unlock(&EXFAT_SB(sb
)->s_lock
);
765 exfat_d_version_set(dentry
, inode_query_iversion(dir
));
767 return d_splice_alias(inode
, dentry
);
769 mutex_unlock(&EXFAT_SB(sb
)->s_lock
);
773 /* remove an entry, BUT don't truncate */
774 static int exfat_unlink(struct inode
*dir
, struct dentry
*dentry
)
776 struct exfat_chain cdir
;
777 struct exfat_dentry
*ep
;
778 struct super_block
*sb
= dir
->i_sb
;
779 struct inode
*inode
= dentry
->d_inode
;
780 struct exfat_inode_info
*ei
= EXFAT_I(inode
);
781 struct buffer_head
*bh
;
782 int num_entries
, entry
, err
= 0;
784 mutex_lock(&EXFAT_SB(sb
)->s_lock
);
785 exfat_chain_dup(&cdir
, &ei
->dir
);
787 if (ei
->dir
.dir
== DIR_DELETED
) {
788 exfat_err(sb
, "abnormal access to deleted dentry");
793 ep
= exfat_get_dentry(sb
, &cdir
, entry
, &bh
);
798 num_entries
= exfat_count_ext_entries(sb
, &cdir
, entry
, ep
);
799 if (num_entries
< 0) {
807 exfat_set_volume_dirty(sb
);
808 /* update the directory entry */
809 if (exfat_remove_entries(dir
, &cdir
, entry
, 0, num_entries
)) {
814 /* This doesn't modify ei */
815 ei
->dir
.dir
= DIR_DELETED
;
817 inode_inc_iversion(dir
);
818 dir
->i_mtime
= dir
->i_atime
= current_time(dir
);
819 exfat_truncate_atime(&dir
->i_atime
);
821 exfat_sync_inode(dir
);
823 mark_inode_dirty(dir
);
826 inode
->i_mtime
= inode
->i_atime
= current_time(inode
);
827 exfat_truncate_atime(&inode
->i_atime
);
828 exfat_unhash_inode(inode
);
829 exfat_d_version_set(dentry
, inode_query_iversion(dir
));
831 mutex_unlock(&EXFAT_SB(sb
)->s_lock
);
835 static int exfat_mkdir(struct user_namespace
*mnt_userns
, struct inode
*dir
,
836 struct dentry
*dentry
, umode_t mode
)
838 struct super_block
*sb
= dir
->i_sb
;
840 struct exfat_dir_entry info
;
841 struct exfat_chain cdir
;
845 mutex_lock(&EXFAT_SB(sb
)->s_lock
);
846 exfat_set_volume_dirty(sb
);
847 err
= exfat_add_entry(dir
, dentry
->d_name
.name
, &cdir
, TYPE_DIR
,
852 inode_inc_iversion(dir
);
853 dir
->i_ctime
= dir
->i_mtime
= current_time(dir
);
855 exfat_sync_inode(dir
);
857 mark_inode_dirty(dir
);
860 i_pos
= exfat_make_i_pos(&info
);
861 inode
= exfat_build_inode(sb
, &info
, i_pos
);
862 err
= PTR_ERR_OR_ZERO(inode
);
866 inode_inc_iversion(inode
);
867 inode
->i_mtime
= inode
->i_atime
= inode
->i_ctime
=
868 EXFAT_I(inode
)->i_crtime
= current_time(inode
);
869 exfat_truncate_atime(&inode
->i_atime
);
870 /* timestamp is already written, so mark_inode_dirty() is unneeded. */
872 d_instantiate(dentry
, inode
);
875 mutex_unlock(&EXFAT_SB(sb
)->s_lock
);
879 static int exfat_check_dir_empty(struct super_block
*sb
,
880 struct exfat_chain
*p_dir
)
882 int i
, dentries_per_clu
;
884 struct exfat_chain clu
;
885 struct exfat_dentry
*ep
;
886 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
887 struct buffer_head
*bh
;
889 dentries_per_clu
= sbi
->dentries_per_clu
;
891 exfat_chain_dup(&clu
, p_dir
);
893 while (clu
.dir
!= EXFAT_EOF_CLUSTER
) {
894 for (i
= 0; i
< dentries_per_clu
; i
++) {
895 ep
= exfat_get_dentry(sb
, &clu
, i
, &bh
);
898 type
= exfat_get_entry_type(ep
);
900 if (type
== TYPE_UNUSED
)
903 if (type
!= TYPE_FILE
&& type
!= TYPE_DIR
)
909 if (clu
.flags
== ALLOC_NO_FAT_CHAIN
) {
913 clu
.dir
= EXFAT_EOF_CLUSTER
;
915 if (exfat_get_next_cluster(sb
, &(clu
.dir
)))
923 static int exfat_rmdir(struct inode
*dir
, struct dentry
*dentry
)
925 struct inode
*inode
= dentry
->d_inode
;
926 struct exfat_dentry
*ep
;
927 struct exfat_chain cdir
, clu_to_free
;
928 struct super_block
*sb
= inode
->i_sb
;
929 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
930 struct exfat_inode_info
*ei
= EXFAT_I(inode
);
931 struct buffer_head
*bh
;
932 int num_entries
, entry
, err
;
934 mutex_lock(&EXFAT_SB(inode
->i_sb
)->s_lock
);
936 exfat_chain_dup(&cdir
, &ei
->dir
);
939 if (ei
->dir
.dir
== DIR_DELETED
) {
940 exfat_err(sb
, "abnormal access to deleted dentry");
945 exfat_chain_set(&clu_to_free
, ei
->start_clu
,
946 EXFAT_B_TO_CLU_ROUND_UP(i_size_read(inode
), sbi
), ei
->flags
);
948 err
= exfat_check_dir_empty(sb
, &clu_to_free
);
951 exfat_err(sb
, "failed to exfat_check_dir_empty : err(%d)",
956 ep
= exfat_get_dentry(sb
, &cdir
, entry
, &bh
);
962 num_entries
= exfat_count_ext_entries(sb
, &cdir
, entry
, ep
);
963 if (num_entries
< 0) {
971 exfat_set_volume_dirty(sb
);
972 err
= exfat_remove_entries(dir
, &cdir
, entry
, 0, num_entries
);
974 exfat_err(sb
, "failed to exfat_remove_entries : err(%d)", err
);
977 ei
->dir
.dir
= DIR_DELETED
;
979 inode_inc_iversion(dir
);
980 dir
->i_mtime
= dir
->i_atime
= current_time(dir
);
981 exfat_truncate_atime(&dir
->i_atime
);
983 exfat_sync_inode(dir
);
985 mark_inode_dirty(dir
);
989 inode
->i_mtime
= inode
->i_atime
= current_time(inode
);
990 exfat_truncate_atime(&inode
->i_atime
);
991 exfat_unhash_inode(inode
);
992 exfat_d_version_set(dentry
, inode_query_iversion(dir
));
994 mutex_unlock(&EXFAT_SB(inode
->i_sb
)->s_lock
);
998 static int exfat_rename_file(struct inode
*inode
, struct exfat_chain
*p_dir
,
999 int oldentry
, struct exfat_uni_name
*p_uniname
,
1000 struct exfat_inode_info
*ei
)
1002 int ret
, num_old_entries
, num_new_entries
;
1003 struct exfat_dentry
*epold
, *epnew
;
1004 struct super_block
*sb
= inode
->i_sb
;
1005 struct buffer_head
*new_bh
, *old_bh
;
1006 int sync
= IS_DIRSYNC(inode
);
1008 epold
= exfat_get_dentry(sb
, p_dir
, oldentry
, &old_bh
);
1012 num_old_entries
= exfat_count_ext_entries(sb
, p_dir
, oldentry
, epold
);
1013 if (num_old_entries
< 0)
1017 num_new_entries
= exfat_calc_num_entries(p_uniname
);
1018 if (num_new_entries
< 0)
1019 return num_new_entries
;
1021 if (num_old_entries
< num_new_entries
) {
1025 exfat_find_empty_entry(inode
, p_dir
, num_new_entries
);
1027 return newentry
; /* -EIO or -ENOSPC */
1029 epnew
= exfat_get_dentry(sb
, p_dir
, newentry
, &new_bh
);
1034 if (exfat_get_entry_type(epnew
) == TYPE_FILE
) {
1035 epnew
->dentry
.file
.attr
|= cpu_to_le16(ATTR_ARCHIVE
);
1036 ei
->attr
|= ATTR_ARCHIVE
;
1038 exfat_update_bh(new_bh
, sync
);
1042 epold
= exfat_get_dentry(sb
, p_dir
, oldentry
+ 1, &old_bh
);
1045 epnew
= exfat_get_dentry(sb
, p_dir
, newentry
+ 1, &new_bh
);
1052 exfat_update_bh(new_bh
, sync
);
1056 ret
= exfat_init_ext_entry(inode
, p_dir
, newentry
,
1057 num_new_entries
, p_uniname
);
1061 exfat_remove_entries(inode
, p_dir
, oldentry
, 0,
1064 ei
->entry
= newentry
;
1066 if (exfat_get_entry_type(epold
) == TYPE_FILE
) {
1067 epold
->dentry
.file
.attr
|= cpu_to_le16(ATTR_ARCHIVE
);
1068 ei
->attr
|= ATTR_ARCHIVE
;
1070 exfat_update_bh(old_bh
, sync
);
1072 ret
= exfat_init_ext_entry(inode
, p_dir
, oldentry
,
1073 num_new_entries
, p_uniname
);
1077 exfat_remove_entries(inode
, p_dir
, oldentry
, num_new_entries
,
1083 static int exfat_move_file(struct inode
*inode
, struct exfat_chain
*p_olddir
,
1084 int oldentry
, struct exfat_chain
*p_newdir
,
1085 struct exfat_uni_name
*p_uniname
, struct exfat_inode_info
*ei
)
1087 int ret
, newentry
, num_new_entries
, num_old_entries
;
1088 struct exfat_dentry
*epmov
, *epnew
;
1089 struct super_block
*sb
= inode
->i_sb
;
1090 struct buffer_head
*mov_bh
, *new_bh
;
1092 epmov
= exfat_get_dentry(sb
, p_olddir
, oldentry
, &mov_bh
);
1096 num_old_entries
= exfat_count_ext_entries(sb
, p_olddir
, oldentry
,
1098 if (num_old_entries
< 0)
1102 num_new_entries
= exfat_calc_num_entries(p_uniname
);
1103 if (num_new_entries
< 0)
1104 return num_new_entries
;
1106 newentry
= exfat_find_empty_entry(inode
, p_newdir
, num_new_entries
);
1108 return newentry
; /* -EIO or -ENOSPC */
1110 epnew
= exfat_get_dentry(sb
, p_newdir
, newentry
, &new_bh
);
1115 if (exfat_get_entry_type(epnew
) == TYPE_FILE
) {
1116 epnew
->dentry
.file
.attr
|= cpu_to_le16(ATTR_ARCHIVE
);
1117 ei
->attr
|= ATTR_ARCHIVE
;
1119 exfat_update_bh(new_bh
, IS_DIRSYNC(inode
));
1123 epmov
= exfat_get_dentry(sb
, p_olddir
, oldentry
+ 1, &mov_bh
);
1126 epnew
= exfat_get_dentry(sb
, p_newdir
, newentry
+ 1, &new_bh
);
1133 exfat_update_bh(new_bh
, IS_DIRSYNC(inode
));
1137 ret
= exfat_init_ext_entry(inode
, p_newdir
, newentry
, num_new_entries
,
1142 exfat_remove_entries(inode
, p_olddir
, oldentry
, 0, num_old_entries
);
1144 exfat_chain_set(&ei
->dir
, p_newdir
->dir
, p_newdir
->size
,
1147 ei
->entry
= newentry
;
1151 /* rename or move a old file into a new file */
1152 static int __exfat_rename(struct inode
*old_parent_inode
,
1153 struct exfat_inode_info
*ei
, struct inode
*new_parent_inode
,
1154 struct dentry
*new_dentry
)
1158 struct exfat_chain olddir
, newdir
;
1159 struct exfat_chain
*p_dir
= NULL
;
1160 struct exfat_uni_name uni_name
;
1161 struct exfat_dentry
*ep
;
1162 struct super_block
*sb
= old_parent_inode
->i_sb
;
1163 struct exfat_sb_info
*sbi
= EXFAT_SB(sb
);
1164 const unsigned char *new_path
= new_dentry
->d_name
.name
;
1165 struct inode
*new_inode
= new_dentry
->d_inode
;
1167 struct exfat_inode_info
*new_ei
= NULL
;
1168 unsigned int new_entry_type
= TYPE_UNUSED
;
1170 struct buffer_head
*old_bh
, *new_bh
= NULL
;
1172 /* check the validity of pointer parameters */
1173 if (new_path
== NULL
|| strlen(new_path
) == 0)
1176 if (ei
->dir
.dir
== DIR_DELETED
) {
1177 exfat_err(sb
, "abnormal access to deleted source dentry");
1181 exfat_chain_set(&olddir
, EXFAT_I(old_parent_inode
)->start_clu
,
1182 EXFAT_B_TO_CLU_ROUND_UP(i_size_read(old_parent_inode
), sbi
),
1183 EXFAT_I(old_parent_inode
)->flags
);
1186 ep
= exfat_get_dentry(sb
, &olddir
, dentry
, &old_bh
);
1193 /* check whether new dir is existing directory and empty */
1196 new_ei
= EXFAT_I(new_inode
);
1198 if (new_ei
->dir
.dir
== DIR_DELETED
) {
1199 exfat_err(sb
, "abnormal access to deleted target dentry");
1203 p_dir
= &(new_ei
->dir
);
1204 new_entry
= new_ei
->entry
;
1205 ep
= exfat_get_dentry(sb
, p_dir
, new_entry
, &new_bh
);
1209 new_entry_type
= exfat_get_entry_type(ep
);
1212 /* if new_inode exists, update ei */
1213 if (new_entry_type
== TYPE_DIR
) {
1214 struct exfat_chain new_clu
;
1216 new_clu
.dir
= new_ei
->start_clu
;
1218 EXFAT_B_TO_CLU_ROUND_UP(i_size_read(new_inode
),
1220 new_clu
.flags
= new_ei
->flags
;
1222 ret
= exfat_check_dir_empty(sb
, &new_clu
);
1228 /* check the validity of directory name in the given new pathname */
1229 ret
= exfat_resolve_path(new_parent_inode
, new_path
, &newdir
,
1234 exfat_set_volume_dirty(sb
);
1236 if (olddir
.dir
== newdir
.dir
)
1237 ret
= exfat_rename_file(new_parent_inode
, &olddir
, dentry
,
1240 ret
= exfat_move_file(new_parent_inode
, &olddir
, dentry
,
1241 &newdir
, &uni_name
, ei
);
1243 if (!ret
&& new_inode
) {
1244 /* delete entries of new_dir */
1245 ep
= exfat_get_dentry(sb
, p_dir
, new_entry
, &new_bh
);
1251 num_entries
= exfat_count_ext_entries(sb
, p_dir
, new_entry
, ep
);
1252 if (num_entries
< 0) {
1258 if (exfat_remove_entries(new_inode
, p_dir
, new_entry
, 0,
1264 /* Free the clusters if new_inode is a dir(as if exfat_rmdir) */
1265 if (new_entry_type
== TYPE_DIR
) {
1266 /* new_ei, new_clu_to_free */
1267 struct exfat_chain new_clu_to_free
;
1269 exfat_chain_set(&new_clu_to_free
, new_ei
->start_clu
,
1270 EXFAT_B_TO_CLU_ROUND_UP(i_size_read(new_inode
),
1271 sbi
), new_ei
->flags
);
1273 if (exfat_free_cluster(new_inode
, &new_clu_to_free
)) {
1274 /* just set I/O error only */
1278 i_size_write(new_inode
, 0);
1279 new_ei
->start_clu
= EXFAT_EOF_CLUSTER
;
1280 new_ei
->flags
= ALLOC_NO_FAT_CHAIN
;
1283 /* Update new_inode ei
1284 * Prevent syncing removed new_inode
1285 * (new_ei is already initialized above code ("if (new_inode)")
1287 new_ei
->dir
.dir
= DIR_DELETED
;
1293 static int exfat_rename(struct user_namespace
*mnt_userns
,
1294 struct inode
*old_dir
, struct dentry
*old_dentry
,
1295 struct inode
*new_dir
, struct dentry
*new_dentry
,
1298 struct inode
*old_inode
, *new_inode
;
1299 struct super_block
*sb
= old_dir
->i_sb
;
1304 * The VFS already checks for existence, so for local filesystems
1305 * the RENAME_NOREPLACE implementation is equivalent to plain rename.
1306 * Don't support any other flags
1308 if (flags
& ~RENAME_NOREPLACE
)
1311 mutex_lock(&EXFAT_SB(sb
)->s_lock
);
1312 old_inode
= old_dentry
->d_inode
;
1313 new_inode
= new_dentry
->d_inode
;
1315 err
= __exfat_rename(old_dir
, EXFAT_I(old_inode
), new_dir
, new_dentry
);
1319 inode_inc_iversion(new_dir
);
1320 new_dir
->i_ctime
= new_dir
->i_mtime
= new_dir
->i_atime
=
1321 EXFAT_I(new_dir
)->i_crtime
= current_time(new_dir
);
1322 exfat_truncate_atime(&new_dir
->i_atime
);
1323 if (IS_DIRSYNC(new_dir
))
1324 exfat_sync_inode(new_dir
);
1326 mark_inode_dirty(new_dir
);
1328 i_pos
= ((loff_t
)EXFAT_I(old_inode
)->dir
.dir
<< 32) |
1329 (EXFAT_I(old_inode
)->entry
& 0xffffffff);
1330 exfat_unhash_inode(old_inode
);
1331 exfat_hash_inode(old_inode
, i_pos
);
1332 if (IS_DIRSYNC(new_dir
))
1333 exfat_sync_inode(old_inode
);
1335 mark_inode_dirty(old_inode
);
1337 if (S_ISDIR(old_inode
->i_mode
) && old_dir
!= new_dir
) {
1338 drop_nlink(old_dir
);
1343 inode_inc_iversion(old_dir
);
1344 old_dir
->i_ctime
= old_dir
->i_mtime
= current_time(old_dir
);
1345 if (IS_DIRSYNC(old_dir
))
1346 exfat_sync_inode(old_dir
);
1348 mark_inode_dirty(old_dir
);
1351 exfat_unhash_inode(new_inode
);
1353 /* skip drop_nlink if new_inode already has been dropped */
1354 if (new_inode
->i_nlink
) {
1355 drop_nlink(new_inode
);
1356 if (S_ISDIR(new_inode
->i_mode
))
1357 drop_nlink(new_inode
);
1359 exfat_warn(sb
, "abnormal access to an inode dropped");
1360 WARN_ON(new_inode
->i_nlink
== 0);
1362 new_inode
->i_ctime
= EXFAT_I(new_inode
)->i_crtime
=
1363 current_time(new_inode
);
1367 mutex_unlock(&EXFAT_SB(sb
)->s_lock
);
1371 const struct inode_operations exfat_dir_inode_operations
= {
1372 .create
= exfat_create
,
1373 .lookup
= exfat_lookup
,
1374 .unlink
= exfat_unlink
,
1375 .mkdir
= exfat_mkdir
,
1376 .rmdir
= exfat_rmdir
,
1377 .rename
= exfat_rename
,
1378 .setattr
= exfat_setattr
,
1379 .getattr
= exfat_getattr
,