Commit a4614dba authored by Ingo Molnar's avatar Ingo Molnar Committed by Linus Torvalds

[PATCH] open writecount scalability cleanup

This is an obvious scalability improvement for write()s.  We used a
global lock to protect the inode writecount (updated on every open for
writing) - this just makes it use the existing inode->i_lock instead.

Compiles & boots fine on x86 SMP.
parent 6704e405
......@@ -237,30 +237,34 @@ int permission(struct inode * inode,int mask, struct nameidata *nd)
* except for the cases where we don't hold i_writecount yet. Then we need to
* use {get,deny}_write_access() - these functions check the sign and refuse
* to do the change if sign is wrong. Exclusion between them is provided by
* spinlock (arbitration_lock) and I'll rip the second arsehole to the first
* who will try to move it in struct inode - just leave it here.
* the inode->i_lock spinlock.
*/
static spinlock_t arbitration_lock = SPIN_LOCK_UNLOCKED;
int get_write_access(struct inode * inode)
{
spin_lock(&arbitration_lock);
spin_lock(&inode->i_lock);
if (atomic_read(&inode->i_writecount) < 0) {
spin_unlock(&arbitration_lock);
spin_unlock(&inode->i_lock);
return -ETXTBSY;
}
atomic_inc(&inode->i_writecount);
spin_unlock(&arbitration_lock);
spin_unlock(&inode->i_lock);
return 0;
}
int deny_write_access(struct file * file)
{
spin_lock(&arbitration_lock);
if (atomic_read(&file->f_dentry->d_inode->i_writecount) > 0) {
spin_unlock(&arbitration_lock);
struct inode *inode = file->f_dentry->d_inode;
spin_lock(&inode->i_lock);
if (atomic_read(&inode->i_writecount) > 0) {
spin_unlock(&inode->i_lock);
return -ETXTBSY;
}
atomic_dec(&file->f_dentry->d_inode->i_writecount);
spin_unlock(&arbitration_lock);
atomic_dec(&inode->i_writecount);
spin_unlock(&inode->i_lock);
return 0;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment