Merge tag 'mm-nonmm-stable-2022-05-26' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / fs / fat / inode.c
index 69b4d4a..a38238d 100644 (file)
@@ -567,12 +567,13 @@ int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de)
                           & ~((loff_t)sbi->cluster_size - 1)) >> 9;
 
        fat_time_fat2unix(sbi, &inode->i_mtime, de->time, de->date, 0);
+       inode->i_ctime = inode->i_mtime;
        if (sbi->options.isvfat) {
-               fat_time_fat2unix(sbi, &inode->i_ctime, de->ctime,
-                                 de->cdate, de->ctime_cs);
                fat_time_fat2unix(sbi, &inode->i_atime, 0, de->adate, 0);
+               fat_time_fat2unix(sbi, &MSDOS_I(inode)->i_crtime, de->ctime,
+                                 de->cdate, de->ctime_cs);
        } else
-               fat_truncate_time(inode, &inode->i_mtime, S_ATIME|S_CTIME);
+               inode->i_atime = fat_truncate_atime(sbi, &inode->i_mtime);
 
        return 0;
 }
@@ -757,6 +758,8 @@ static struct inode *fat_alloc_inode(struct super_block *sb)
        ei->i_logstart = 0;
        ei->i_attrs = 0;
        ei->i_pos = 0;
+       ei->i_crtime.tv_sec = 0;
+       ei->i_crtime.tv_nsec = 0;
 
        return &ei->vfs_inode;
 }
@@ -888,10 +891,10 @@ retry:
                          &raw_entry->date, NULL);
        if (sbi->options.isvfat) {
                __le16 atime;
-               fat_time_unix2fat(sbi, &inode->i_ctime, &raw_entry->ctime,
-                                 &raw_entry->cdate, &raw_entry->ctime_cs);
                fat_time_unix2fat(sbi, &inode->i_atime, &atime,
                                  &raw_entry->adate, NULL);
+               fat_time_unix2fat(sbi, &MSDOS_I(inode)->i_crtime, &raw_entry->ctime,
+                                 &raw_entry->cdate, &raw_entry->ctime_cs);
        }
        spin_unlock(&sbi->inode_hash_lock);
        mark_buffer_dirty(bh);
@@ -1885,10 +1888,8 @@ out_invalid:
                fat_msg(sb, KERN_INFO, "Can't find a valid FAT filesystem");
 
 out_fail:
-       if (fsinfo_inode)
-               iput(fsinfo_inode);
-       if (fat_inode)
-               iput(fat_inode);
+       iput(fsinfo_inode);
+       iput(fat_inode);
        unload_nls(sbi->nls_io);
        unload_nls(sbi->nls_disk);
        fat_reset_iocharset(&sbi->options);