| .. | .. |
|---|
| 398 | 398 | ei->i_size_ondisk += sbi->cluster_size; |
|---|
| 399 | 399 | ei->i_size_aligned += sbi->cluster_size; |
|---|
| 400 | 400 | ei->flags = p_dir->flags; |
|---|
| 401 | | - inode->i_blocks += 1 << sbi->sect_per_clus_bits; |
|---|
| 401 | + inode->i_blocks += sbi->cluster_size >> 9; |
|---|
| 402 | 402 | } |
|---|
| 403 | 403 | |
|---|
| 404 | 404 | return dentry; |
|---|
| .. | .. |
|---|
| 596 | 596 | struct exfat_inode_info *ei = EXFAT_I(dir); |
|---|
| 597 | 597 | struct exfat_dentry *ep, *ep2; |
|---|
| 598 | 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; |
|---|
| 599 | 601 | |
|---|
| 600 | 602 | if (qname->len == 0) |
|---|
| 601 | 603 | return -ENOENT; |
|---|
| .. | .. |
|---|
| 619 | 621 | |
|---|
| 620 | 622 | /* search the file name for directories */ |
|---|
| 621 | 623 | dentry = exfat_find_dir_entry(sb, ei, &cdir, &uni_name, |
|---|
| 622 | | - num_entries, TYPE_ALL); |
|---|
| 624 | + num_entries, TYPE_ALL, &hint_opt); |
|---|
| 623 | 625 | |
|---|
| 624 | 626 | if (dentry < 0) |
|---|
| 625 | 627 | return dentry; /* -error value */ |
|---|
| .. | .. |
|---|
| 628 | 630 | info->entry = dentry; |
|---|
| 629 | 631 | info->num_subdirs = 0; |
|---|
| 630 | 632 | |
|---|
| 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; |
|---|
| 631 | 638 | es = exfat_get_dentry_set(sb, &cdir, dentry, ES_2_ENTRIES); |
|---|
| 632 | 639 | if (!es) |
|---|
| 633 | 640 | return -EIO; |
|---|