When setting inode size we directly writeout inode in udf_setsize(). This misses proper writeout of other inode related metadata. Use sync_inode_metadata() instead and move the flushing to udf_setattr() to avoid it for udf_evict_inode() where it would be pointless. Signed-off-by: Jan Kara --- fs/udf/file.c | 2 ++ fs/udf/inode.c | 5 +---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/fs/udf/file.c b/fs/udf/file.c index 0748cc965117..57d11606a2a7 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c @@ -246,6 +246,8 @@ static int udf_setattr(struct mnt_idmap *idmap, struct dentry *dentry, setattr_copy(&nop_mnt_idmap, inode, attr); mark_inode_dirty(inode); + if (IS_SYNC(inode)) + sync_inode_metadata(inode, 1); return 0; } diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 05e61a65478c..600705f5edf9 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c @@ -1328,10 +1328,7 @@ int udf_setsize(struct inode *inode, loff_t newsize) } update_time: inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); - if (IS_SYNC(inode)) - udf_sync_inode(inode); - else - mark_inode_dirty(inode); + mark_inode_dirty(inode); return err; } -- 2.51.0