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) ...@@ -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 * 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 * 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 * 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 * the inode->i_lock spinlock.
* who will try to move it in struct inode - just leave it here.
*/ */
static spinlock_t arbitration_lock = SPIN_LOCK_UNLOCKED;
int get_write_access(struct inode * inode) int get_write_access(struct inode * inode)
{ {
spin_lock(&arbitration_lock); spin_lock(&inode->i_lock);
if (atomic_read(&inode->i_writecount) < 0) { if (atomic_read(&inode->i_writecount) < 0) {
spin_unlock(&arbitration_lock); spin_unlock(&inode->i_lock);
return -ETXTBSY; return -ETXTBSY;
} }
atomic_inc(&inode->i_writecount); atomic_inc(&inode->i_writecount);
spin_unlock(&arbitration_lock); spin_unlock(&inode->i_lock);
return 0; return 0;
} }
int deny_write_access(struct file * file) int deny_write_access(struct file * file)
{ {
spin_lock(&arbitration_lock); struct inode *inode = file->f_dentry->d_inode;
if (atomic_read(&file->f_dentry->d_inode->i_writecount) > 0) {
spin_unlock(&arbitration_lock); spin_lock(&inode->i_lock);
if (atomic_read(&inode->i_writecount) > 0) {
spin_unlock(&inode->i_lock);
return -ETXTBSY; return -ETXTBSY;
} }
atomic_dec(&file->f_dentry->d_inode->i_writecount); atomic_dec(&inode->i_writecount);
spin_unlock(&arbitration_lock); spin_unlock(&inode->i_lock);
return 0; 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