>From 98f02e76b90e278e9688b4311a8889cec7095601 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 21 Nov 2012 01:46:51 +0100 Subject: [PATCH] ext4: Reduce i_mutex usage in ext4_file_sync() ext4_file_sync() needs i_mutex only to avoid livelocks of ext4_flush_unwritten_io() all other code doesn't need it. In particular syncing of inode & metadata in non-journal case is safe (writeback doesn't hold i_mutex either) and forcing of transaction commits doesn't need i_mutex either (there's nothing inode specific in that code apart from grabbing transaction ids from the inode). So shorten the span where i_mutex is held. Signed-off-by: Jan Kara --- fs/ext4/fsync.c | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c index be1d89f..2268114 100644 --- a/fs/ext4/fsync.c +++ b/fs/ext4/fsync.c @@ -113,8 +113,6 @@ static int __sync_inode(struct inode *inode, int datasync) * * What we do is just kick off a commit and wait on it. This will snapshot the * inode to disk. - * - * i_mutex lock is held when entering and exiting this function */ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync) @@ -133,12 +131,13 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync) ret = filemap_write_and_wait_range(inode->i_mapping, start, end); if (ret) return ret; - mutex_lock(&inode->i_mutex); if (inode->i_sb->s_flags & MS_RDONLY) goto out; + mutex_lock(&inode->i_mutex); ret = ext4_flush_unwritten_io(inode); + mutex_unlock(&inode->i_mutex); if (ret < 0) goto out; @@ -180,7 +179,6 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync) ret = err; } out: - mutex_unlock(&inode->i_mutex); trace_ext4_sync_file_exit(inode, ret); return ret; } -- 1.7.1