mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
fs: don't take the i_lock in inode_inc_iversion
The rationale for taking the i_lock when incrementing this value is lost in antiquity. The readers of the field don't take it (at least not universally), so my assumption is that it was only done here to serialize incrementors. If that is indeed the case, then we can drop the i_lock from this codepath and treat it as a atomic64_t for the purposes of incrementing it. This allows us to use inode_inc_iversion without any danger of lock inversion. Note that the read side is not fetched atomically with this change. The assumption here is that that is not a critical issue since the i_version is not fully synchronized with anything else anyway. Signed-off-by: Jeff Layton <jlayton@redhat.com> Reviewed-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
ae5e165d85
commit
7594c46116
1 changed files with 4 additions and 3 deletions
|
@ -110,12 +110,13 @@ inode_set_iversion_queried(struct inode *inode, u64 new)
|
||||||
static inline bool
|
static inline bool
|
||||||
inode_maybe_inc_iversion(struct inode *inode, bool force)
|
inode_maybe_inc_iversion(struct inode *inode, bool force)
|
||||||
{
|
{
|
||||||
spin_lock(&inode->i_lock);
|
atomic64_t *ivp = (atomic64_t *)&inode->i_version;
|
||||||
inode->i_version++;
|
|
||||||
spin_unlock(&inode->i_lock);
|
atomic64_inc(ivp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* inode_inc_iversion - forcibly increment i_version
|
* inode_inc_iversion - forcibly increment i_version
|
||||||
* @inode: inode that needs to be updated
|
* @inode: inode that needs to be updated
|
||||||
|
|
Loading…
Reference in a new issue