From 7a9afe3827d6f9ef47e3024c9c3cd7bfcc15858a Mon Sep 17 00:00:00 2001 From: Yuezhang Mo Date: Thu, 17 Oct 2024 09:48:40 +0800 Subject: [PATCH v2] exfat: use sync_inode_metadata() to writeback inode Signed-off-by: Yuezhang Mo --- fs/exfat/exfat_fs.h | 3 +-- fs/exfat/file.c | 32 +++++--------------------------- fs/exfat/inode.c | 4 +--- 3 files changed, 7 insertions(+), 32 deletions(-) diff --git a/fs/exfat/exfat_fs.h b/fs/exfat/exfat_fs.h index 7b5f962f074d..fd111ecb3f50 100644 --- a/fs/exfat/exfat_fs.h +++ b/fs/exfat/exfat_fs.h @@ -459,8 +459,7 @@ int exfat_trim_fs(struct inode *inode, struct fstrim_range *range); /* file.c */ extern const struct file_operations exfat_file_operations; -int __exfat_truncate(struct inode *inode); -void exfat_truncate(struct inode *inode); +int exfat_truncate(struct inode *inode); int exfat_setattr(struct mnt_idmap *idmap, struct dentry *dentry, struct iattr *attr); int exfat_getattr(struct mnt_idmap *idmap, const struct path *path, diff --git a/fs/exfat/file.c b/fs/exfat/file.c index a25d7eb789f4..f71ed7cc47e1 100644 --- a/fs/exfat/file.c +++ b/fs/exfat/file.c @@ -141,7 +141,7 @@ static int exfat_sanitize_mode(const struct exfat_sb_info *sbi, } /* resize the file length */ -int __exfat_truncate(struct inode *inode) +int exfat_truncate(struct inode *inode) { unsigned int num_clusters_new, num_clusters_phys; unsigned int last_clu = EXFAT_FREE_CLUSTER; @@ -208,7 +208,8 @@ int __exfat_truncate(struct inode *inode) * __exfat_write_inode() is called for directory entry, bitmap * and FAT to be written in a same writeback. */ - if (__exfat_write_inode(inode, inode_needs_sync(inode))) + mark_inode_dirty(inode); + if (sync_inode_metadata(inode, inode_needs_sync(inode))) return -EIO; /* cut off from the FAT chain */ @@ -235,32 +236,9 @@ int __exfat_truncate(struct inode *inode) if (exfat_free_cluster(inode, &clu)) return -EIO; - return 0; -} - -void exfat_truncate(struct inode *inode) -{ - struct super_block *sb = inode->i_sb; - struct exfat_sb_info *sbi = EXFAT_SB(sb); - struct exfat_inode_info *ei = EXFAT_I(inode); - int err; - - mutex_lock(&sbi->s_lock); - if (ei->start_clu == 0) { - /* - * Empty start_clu != ~0 (not allocated) - */ - exfat_fs_error(sb, "tried to truncate zeroed cluster."); - goto write_size; - } - - err = __exfat_truncate(inode); - if (err) - goto write_size; - inode->i_blocks = round_up(i_size_read(inode), sbi->cluster_size) >> 9; -write_size: - mutex_unlock(&sbi->s_lock); + + return 0; } int exfat_getattr(struct mnt_idmap *idmap, const struct path *path, diff --git a/fs/exfat/inode.c b/fs/exfat/inode.c index d338a59c27f7..2a0a87430cbc 100644 --- a/fs/exfat/inode.c +++ b/fs/exfat/inode.c @@ -679,9 +679,7 @@ void exfat_evict_inode(struct inode *inode) if (!inode->i_nlink) { i_size_write(inode, 0); - mutex_lock(&EXFAT_SB(inode->i_sb)->s_lock); - __exfat_truncate(inode); - mutex_unlock(&EXFAT_SB(inode->i_sb)->s_lock); + exfat_truncate(inode); } invalidate_inode_buffers(inode); -- 2.34.1