Merge tag 'exfat-for-5.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/linkin...
[linux-2.6-microblaze.git] / fs / exfat / inode.c
index 785ead3..cf9ca6c 100644 (file)
@@ -19,7 +19,6 @@
 
 static int __exfat_write_inode(struct inode *inode, int sync)
 {
-       int ret = -EIO;
        unsigned long long on_disk_size;
        struct exfat_dentry *ep, *ep2;
        struct exfat_entry_set_cache *es = NULL;
@@ -43,11 +42,11 @@ static int __exfat_write_inode(struct inode *inode, int sync)
        exfat_set_vol_flags(sb, VOL_DIRTY);
 
        /* get the directory entry of given file or directory */
-       es = exfat_get_dentry_set(sb, &(ei->dir), ei->entry, ES_ALL_ENTRIES,
-               &ep);
+       es = exfat_get_dentry_set(sb, &(ei->dir), ei->entry, ES_ALL_ENTRIES);
        if (!es)
                return -EIO;
-       ep2 = ep + 1;
+       ep = exfat_get_dentry_cached(es, 0);
+       ep2 = exfat_get_dentry_cached(es, 1);
 
        ep->dentry.file.attr = cpu_to_le16(exfat_make_attr(inode));
 
@@ -56,12 +55,12 @@ static int __exfat_write_inode(struct inode *inode, int sync)
                        &ep->dentry.file.create_tz,
                        &ep->dentry.file.create_time,
                        &ep->dentry.file.create_date,
-                       &ep->dentry.file.create_time_ms);
+                       &ep->dentry.file.create_time_cs);
        exfat_set_entry_time(sbi, &inode->i_mtime,
                        &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);
        exfat_set_entry_time(sbi, &inode->i_atime,
                        &ep->dentry.file.access_tz,
                        &ep->dentry.file.access_time,
@@ -77,9 +76,9 @@ static int __exfat_write_inode(struct inode *inode, int sync)
        ep2->dentry.stream.valid_size = cpu_to_le64(on_disk_size);
        ep2->dentry.stream.size = ep2->dentry.stream.valid_size;
 
-       ret = exfat_update_dir_chksum_with_entry_set(sb, es, sync);
-       kfree(es);
-       return ret;
+       exfat_update_dir_chksum_with_entry_set(es);
+       exfat_free_dentry_set(es, sync);
+       return 0;
 }
 
 int exfat_write_inode(struct inode *inode, struct writeback_control *wbc)
@@ -110,8 +109,6 @@ static int exfat_map_cluster(struct inode *inode, unsigned int clu_offset,
        int ret, modified = false;
        unsigned int last_clu;
        struct exfat_chain new_clu;
-       struct exfat_dentry *ep;
-       struct exfat_entry_set_cache *es = NULL;
        struct super_block *sb = inode->i_sb;
        struct exfat_sb_info *sbi = EXFAT_SB(sb);
        struct exfat_inode_info *ei = EXFAT_I(inode);
@@ -222,34 +219,28 @@ static int exfat_map_cluster(struct inode *inode, unsigned int clu_offset,
                num_clusters += num_to_be_allocated;
                *clu = new_clu.dir;
 
-               if (ei->dir.dir != DIR_DELETED) {
+               if (ei->dir.dir != DIR_DELETED && modified) {
+                       struct exfat_dentry *ep;
+                       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;
                        /* get stream entry */
-                       ep++;
+                       ep = exfat_get_dentry_cached(es, 1);
 
                        /* update directory entry */
-                       if (modified) {
-                               if (ep->dentry.stream.flags != ei->flags)
-                                       ep->dentry.stream.flags = ei->flags;
-
-                               if (le32_to_cpu(ep->dentry.stream.start_clu) !=
-                                               ei->start_clu)
-                                       ep->dentry.stream.start_clu =
-                                               cpu_to_le32(ei->start_clu);
-
-                               ep->dentry.stream.valid_size =
-                                       cpu_to_le64(i_size_read(inode));
-                               ep->dentry.stream.size =
-                                       ep->dentry.stream.valid_size;
-                       }
-
-                       if (exfat_update_dir_chksum_with_entry_set(sb, es,
-                           inode_needs_sync(inode)))
-                               return -EIO;
-                       kfree(es);
+                       ep->dentry.stream.flags = ei->flags;
+                       ep->dentry.stream.start_clu =
+                               cpu_to_le32(ei->start_clu);
+                       ep->dentry.stream.valid_size =
+                               cpu_to_le64(i_size_read(inode));
+                       ep->dentry.stream.size =
+                               ep->dentry.stream.valid_size;
+
+                       exfat_update_dir_chksum_with_entry_set(es);
+                       exfat_free_dentry_set(es, inode_needs_sync(inode));
 
                } /* end of if != DIR_DELETED */