exfat: optimize dir-cache
[linux-2.6-microblaze.git] / fs / exfat / file.c
index 4f76764..8e3f0ee 100644 (file)
@@ -96,11 +96,9 @@ int __exfat_truncate(struct inode *inode, loff_t new_size)
        unsigned int num_clusters_new, num_clusters_phys;
        unsigned int last_clu = EXFAT_FREE_CLUSTER;
        struct exfat_chain clu;
-       struct exfat_dentry *ep, *ep2;
        struct super_block *sb = inode->i_sb;
        struct exfat_sb_info *sbi = EXFAT_SB(sb);
        struct exfat_inode_info *ei = EXFAT_I(inode);
-       struct exfat_entry_set_cache *es = NULL;
        int evict = (ei->dir.dir == DIR_DELETED) ? 1 : 0;
 
        /* check if the given file ID is opened */
@@ -153,19 +151,22 @@ int __exfat_truncate(struct inode *inode, loff_t new_size)
        /* update the directory entry */
        if (!evict) {
                struct timespec64 ts;
+               struct exfat_dentry *ep, *ep2;
+               struct exfat_entry_set_cache *es;
 
                es = exfat_get_dentry_set(sb, &(ei->dir), ei->entry,
-                               ES_ALL_ENTRIES, &ep);
+                               ES_ALL_ENTRIES);
                if (!es)
                        return -EIO;
-               ep2 = ep + 1;
+               ep = exfat_get_dentry_cached(es, 0);
+               ep2 = exfat_get_dentry_cached(es, 1);
 
                ts = current_time(inode);
                exfat_set_entry_time(sbi, &ts,
                                &ep->dentry.file.modify_tz,
                                &ep->dentry.file.modify_time,
                                &ep->dentry.file.modify_date,
-                               &ep->dentry.file.modify_time_ms);
+                               &ep->dentry.file.modify_time_cs);
                ep->dentry.file.attr = cpu_to_le16(ei->attr);
 
                /* File size should be zero if there is no cluster allocated */
@@ -185,10 +186,8 @@ int __exfat_truncate(struct inode *inode, loff_t new_size)
                        ep2->dentry.stream.start_clu = EXFAT_FREE_CLUSTER;
                }
 
-               if (exfat_update_dir_chksum_with_entry_set(sb, es,
-                   inode_needs_sync(inode)))
-                       return -EIO;
-               kfree(es);
+               exfat_update_dir_chksum_with_entry_set(es);
+               exfat_free_dentry_set(es, inode_needs_sync(inode));
        }
 
        /* cut off from the FAT chain */
@@ -348,12 +347,13 @@ out:
 }
 
 const struct file_operations exfat_file_operations = {
-       .llseek      = generic_file_llseek,
-       .read_iter   = generic_file_read_iter,
-       .write_iter  = generic_file_write_iter,
-       .mmap        = generic_file_mmap,
-       .fsync       = generic_file_fsync,
-       .splice_read = generic_file_splice_read,
+       .llseek         = generic_file_llseek,
+       .read_iter      = generic_file_read_iter,
+       .write_iter     = generic_file_write_iter,
+       .mmap           = generic_file_mmap,
+       .fsync          = generic_file_fsync,
+       .splice_read    = generic_file_splice_read,
+       .splice_write   = iter_file_splice_write,
 };
 
 const struct inode_operations exfat_file_inode_operations = {