.. | .. |
---|
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; |
---|