[PATCH] mutex subsystem, semaphore to mutex: VFS, ->i_sem
This patch converts the inode semaphore to a mutex. I have tested it on XFS and compiled as much as one can consider on an ia64. Anyway your luck with it might be different. Modified-by: Ingo Molnar <mingo@elte.hu> (finished the conversion) Signed-off-by: Jes Sorensen <jes@sgi.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:

committed by
Ingo Molnar

parent
794ee1baee
commit
1b1dcc1b57
@@ -49,7 +49,7 @@ static int reiserfs_file_release(struct inode *inode, struct file *filp)
|
||||
}
|
||||
|
||||
reiserfs_write_lock(inode->i_sb);
|
||||
down(&inode->i_sem);
|
||||
mutex_lock(&inode->i_mutex);
|
||||
/* freeing preallocation only involves relogging blocks that
|
||||
* are already in the current transaction. preallocation gets
|
||||
* freed at the end of each transaction, so it is impossible for
|
||||
@@ -100,7 +100,7 @@ static int reiserfs_file_release(struct inode *inode, struct file *filp)
|
||||
err = reiserfs_truncate_file(inode, 0);
|
||||
}
|
||||
out:
|
||||
up(&inode->i_sem);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
reiserfs_write_unlock(inode->i_sb);
|
||||
return err;
|
||||
}
|
||||
@@ -1342,7 +1342,7 @@ static ssize_t reiserfs_file_write(struct file *file, /* the file we are going t
|
||||
if (unlikely(!access_ok(VERIFY_READ, buf, count)))
|
||||
return -EFAULT;
|
||||
|
||||
down(&inode->i_sem); // locks the entire file for just us
|
||||
mutex_lock(&inode->i_mutex); // locks the entire file for just us
|
||||
|
||||
pos = *ppos;
|
||||
|
||||
@@ -1532,12 +1532,12 @@ static ssize_t reiserfs_file_write(struct file *file, /* the file we are going t
|
||||
generic_osync_inode(inode, file->f_mapping,
|
||||
OSYNC_METADATA | OSYNC_DATA);
|
||||
|
||||
up(&inode->i_sem);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
reiserfs_async_progress_wait(inode->i_sb);
|
||||
return (already_written != 0) ? already_written : res;
|
||||
|
||||
out:
|
||||
up(&inode->i_sem); // unlock the file on exit.
|
||||
mutex_unlock(&inode->i_mutex); // unlock the file on exit.
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@@ -40,12 +40,12 @@ void reiserfs_delete_inode(struct inode *inode)
|
||||
|
||||
/* The = 0 happens when we abort creating a new inode for some reason like lack of space.. */
|
||||
if (!(inode->i_state & I_NEW) && INODE_PKEY(inode)->k_objectid != 0) { /* also handles bad_inode case */
|
||||
down(&inode->i_sem);
|
||||
mutex_lock(&inode->i_mutex);
|
||||
|
||||
reiserfs_delete_xattrs(inode);
|
||||
|
||||
if (journal_begin(&th, inode->i_sb, jbegin_count)) {
|
||||
up(&inode->i_sem);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
goto out;
|
||||
}
|
||||
reiserfs_update_inode_transaction(inode);
|
||||
@@ -59,11 +59,11 @@ void reiserfs_delete_inode(struct inode *inode)
|
||||
DQUOT_FREE_INODE(inode);
|
||||
|
||||
if (journal_end(&th, inode->i_sb, jbegin_count)) {
|
||||
up(&inode->i_sem);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
goto out;
|
||||
}
|
||||
|
||||
up(&inode->i_sem);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
|
||||
/* check return value from reiserfs_delete_object after
|
||||
* ending the transaction
|
||||
@@ -551,7 +551,7 @@ static int convert_tail_for_hole(struct inode *inode,
|
||||
|
||||
/* we don't have to make sure the conversion did not happen while
|
||||
** we were locking the page because anyone that could convert
|
||||
** must first take i_sem.
|
||||
** must first take i_mutex.
|
||||
**
|
||||
** We must fix the tail page for writing because it might have buffers
|
||||
** that are mapped, but have a block number of 0. This indicates tail
|
||||
@@ -586,7 +586,7 @@ static inline int _allocate_block(struct reiserfs_transaction_handle *th,
|
||||
BUG_ON(!th->t_trans_id);
|
||||
|
||||
#ifdef REISERFS_PREALLOCATE
|
||||
if (!(flags & GET_BLOCK_NO_ISEM)) {
|
||||
if (!(flags & GET_BLOCK_NO_IMUX)) {
|
||||
return reiserfs_new_unf_blocknrs2(th, inode, allocated_block_nr,
|
||||
path, block);
|
||||
}
|
||||
@@ -2318,7 +2318,7 @@ static int map_block_for_writepage(struct inode *inode,
|
||||
/* this is where we fill in holes in the file. */
|
||||
if (use_get_block) {
|
||||
retval = reiserfs_get_block(inode, block, bh_result,
|
||||
GET_BLOCK_CREATE | GET_BLOCK_NO_ISEM
|
||||
GET_BLOCK_CREATE | GET_BLOCK_NO_IMUX
|
||||
| GET_BLOCK_NO_DANGLE);
|
||||
if (!retval) {
|
||||
if (!buffer_mapped(bh_result)
|
||||
|
@@ -120,7 +120,7 @@ static int reiserfs_unpack(struct inode *inode, struct file *filp)
|
||||
/* we need to make sure nobody is changing the file size beneath
|
||||
** us
|
||||
*/
|
||||
down(&inode->i_sem);
|
||||
mutex_lock(&inode->i_mutex);
|
||||
|
||||
write_from = inode->i_size & (blocksize - 1);
|
||||
/* if we are on a block boundary, we are already unpacked. */
|
||||
@@ -156,7 +156,7 @@ static int reiserfs_unpack(struct inode *inode, struct file *filp)
|
||||
page_cache_release(page);
|
||||
|
||||
out:
|
||||
up(&inode->i_sem);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
reiserfs_write_unlock(inode->i_sb);
|
||||
return retval;
|
||||
}
|
||||
|
@@ -2211,7 +2211,7 @@ static ssize_t reiserfs_quota_write(struct super_block *sb, int type,
|
||||
size_t towrite = len;
|
||||
struct buffer_head tmp_bh, *bh;
|
||||
|
||||
down(&inode->i_sem);
|
||||
mutex_lock(&inode->i_mutex);
|
||||
while (towrite > 0) {
|
||||
tocopy = sb->s_blocksize - offset < towrite ?
|
||||
sb->s_blocksize - offset : towrite;
|
||||
@@ -2250,7 +2250,7 @@ static ssize_t reiserfs_quota_write(struct super_block *sb, int type,
|
||||
inode->i_version++;
|
||||
inode->i_mtime = inode->i_ctime = CURRENT_TIME;
|
||||
mark_inode_dirty(inode);
|
||||
up(&inode->i_sem);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
return len - towrite;
|
||||
}
|
||||
|
||||
|
@@ -205,7 +205,7 @@ int indirect2direct(struct reiserfs_transaction_handle *th, struct inode *p_s_in
|
||||
1) * p_s_sb->s_blocksize;
|
||||
pos1 = pos;
|
||||
|
||||
// we are protected by i_sem. The tail can not disapper, not
|
||||
// we are protected by i_mutex. The tail can not disapper, not
|
||||
// append can be done either
|
||||
// we are in truncate or packing tail in file_release
|
||||
|
||||
|
@@ -67,11 +67,11 @@ static struct dentry *create_xa_root(struct super_block *sb)
|
||||
goto out;
|
||||
} else if (!xaroot->d_inode) {
|
||||
int err;
|
||||
down(&privroot->d_inode->i_sem);
|
||||
mutex_lock(&privroot->d_inode->i_mutex);
|
||||
err =
|
||||
privroot->d_inode->i_op->mkdir(privroot->d_inode, xaroot,
|
||||
0700);
|
||||
up(&privroot->d_inode->i_sem);
|
||||
mutex_unlock(&privroot->d_inode->i_mutex);
|
||||
|
||||
if (err) {
|
||||
dput(xaroot);
|
||||
@@ -219,7 +219,7 @@ static struct dentry *get_xa_file_dentry(const struct inode *inode,
|
||||
} else if (flags & XATTR_REPLACE || flags & FL_READONLY) {
|
||||
goto out;
|
||||
} else {
|
||||
/* inode->i_sem is down, so nothing else can try to create
|
||||
/* inode->i_mutex is down, so nothing else can try to create
|
||||
* the same xattr */
|
||||
err = xadir->d_inode->i_op->create(xadir->d_inode, xafile,
|
||||
0700 | S_IFREG, NULL);
|
||||
@@ -268,7 +268,7 @@ static struct file *open_xa_file(const struct inode *inode, const char *name,
|
||||
* and don't mess with f->f_pos, but the idea is the same. Do some
|
||||
* action on each and every entry in the directory.
|
||||
*
|
||||
* we're called with i_sem held, so there are no worries about the directory
|
||||
* we're called with i_mutex held, so there are no worries about the directory
|
||||
* changing underneath us.
|
||||
*/
|
||||
static int __xattr_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
||||
@@ -426,7 +426,7 @@ int xattr_readdir(struct file *file, filldir_t filler, void *buf)
|
||||
int res = -ENOTDIR;
|
||||
if (!file->f_op || !file->f_op->readdir)
|
||||
goto out;
|
||||
down(&inode->i_sem);
|
||||
mutex_lock(&inode->i_mutex);
|
||||
// down(&inode->i_zombie);
|
||||
res = -ENOENT;
|
||||
if (!IS_DEADDIR(inode)) {
|
||||
@@ -435,7 +435,7 @@ int xattr_readdir(struct file *file, filldir_t filler, void *buf)
|
||||
unlock_kernel();
|
||||
}
|
||||
// up(&inode->i_zombie);
|
||||
up(&inode->i_sem);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
out:
|
||||
return res;
|
||||
}
|
||||
@@ -480,7 +480,7 @@ static inline __u32 xattr_hash(const char *msg, int len)
|
||||
/* Generic extended attribute operations that can be used by xa plugins */
|
||||
|
||||
/*
|
||||
* inode->i_sem: down
|
||||
* inode->i_mutex: down
|
||||
*/
|
||||
int
|
||||
reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer,
|
||||
@@ -535,7 +535,7 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer,
|
||||
/* Resize it so we're ok to write there */
|
||||
newattrs.ia_size = buffer_size;
|
||||
newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
|
||||
down(&xinode->i_sem);
|
||||
mutex_lock(&xinode->i_mutex);
|
||||
err = notify_change(fp->f_dentry, &newattrs);
|
||||
if (err)
|
||||
goto out_filp;
|
||||
@@ -598,7 +598,7 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer,
|
||||
}
|
||||
|
||||
out_filp:
|
||||
up(&xinode->i_sem);
|
||||
mutex_unlock(&xinode->i_mutex);
|
||||
fput(fp);
|
||||
|
||||
out:
|
||||
@@ -606,7 +606,7 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer,
|
||||
}
|
||||
|
||||
/*
|
||||
* inode->i_sem: down
|
||||
* inode->i_mutex: down
|
||||
*/
|
||||
int
|
||||
reiserfs_xattr_get(const struct inode *inode, const char *name, void *buffer,
|
||||
@@ -793,7 +793,7 @@ reiserfs_delete_xattrs_filler(void *buf, const char *name, int namelen,
|
||||
|
||||
}
|
||||
|
||||
/* This is called w/ inode->i_sem downed */
|
||||
/* This is called w/ inode->i_mutex downed */
|
||||
int reiserfs_delete_xattrs(struct inode *inode)
|
||||
{
|
||||
struct file *fp;
|
||||
@@ -946,7 +946,7 @@ int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs)
|
||||
|
||||
/*
|
||||
* Inode operation getxattr()
|
||||
* Preliminary locking: we down dentry->d_inode->i_sem
|
||||
* Preliminary locking: we down dentry->d_inode->i_mutex
|
||||
*/
|
||||
ssize_t
|
||||
reiserfs_getxattr(struct dentry * dentry, const char *name, void *buffer,
|
||||
@@ -970,7 +970,7 @@ reiserfs_getxattr(struct dentry * dentry, const char *name, void *buffer,
|
||||
/*
|
||||
* Inode operation setxattr()
|
||||
*
|
||||
* dentry->d_inode->i_sem down
|
||||
* dentry->d_inode->i_mutex down
|
||||
*/
|
||||
int
|
||||
reiserfs_setxattr(struct dentry *dentry, const char *name, const void *value,
|
||||
@@ -1008,7 +1008,7 @@ reiserfs_setxattr(struct dentry *dentry, const char *name, const void *value,
|
||||
/*
|
||||
* Inode operation removexattr()
|
||||
*
|
||||
* dentry->d_inode->i_sem down
|
||||
* dentry->d_inode->i_mutex down
|
||||
*/
|
||||
int reiserfs_removexattr(struct dentry *dentry, const char *name)
|
||||
{
|
||||
@@ -1091,7 +1091,7 @@ reiserfs_listxattr_filler(void *buf, const char *name, int namelen,
|
||||
/*
|
||||
* Inode operation listxattr()
|
||||
*
|
||||
* Preliminary locking: we down dentry->d_inode->i_sem
|
||||
* Preliminary locking: we down dentry->d_inode->i_mutex
|
||||
*/
|
||||
ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size)
|
||||
{
|
||||
@@ -1289,9 +1289,9 @@ int reiserfs_xattr_init(struct super_block *s, int mount_flags)
|
||||
if (!IS_ERR(dentry)) {
|
||||
if (!(mount_flags & MS_RDONLY) && !dentry->d_inode) {
|
||||
struct inode *inode = dentry->d_parent->d_inode;
|
||||
down(&inode->i_sem);
|
||||
mutex_lock(&inode->i_mutex);
|
||||
err = inode->i_op->mkdir(inode, dentry, 0700);
|
||||
up(&inode->i_sem);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
if (err) {
|
||||
dput(dentry);
|
||||
dentry = NULL;
|
||||
|
@@ -174,7 +174,7 @@ static void *posix_acl_to_disk(const struct posix_acl *acl, size_t * size)
|
||||
/*
|
||||
* Inode operation get_posix_acl().
|
||||
*
|
||||
* inode->i_sem: down
|
||||
* inode->i_mutex: down
|
||||
* BKL held [before 2.5.x]
|
||||
*/
|
||||
struct posix_acl *reiserfs_get_acl(struct inode *inode, int type)
|
||||
@@ -237,7 +237,7 @@ struct posix_acl *reiserfs_get_acl(struct inode *inode, int type)
|
||||
/*
|
||||
* Inode operation set_posix_acl().
|
||||
*
|
||||
* inode->i_sem: down
|
||||
* inode->i_mutex: down
|
||||
* BKL held [before 2.5.x]
|
||||
*/
|
||||
static int
|
||||
@@ -312,7 +312,7 @@ reiserfs_set_acl(struct inode *inode, int type, struct posix_acl *acl)
|
||||
return error;
|
||||
}
|
||||
|
||||
/* dir->i_sem: down,
|
||||
/* dir->i_mutex: locked,
|
||||
* inode is new and not released into the wild yet */
|
||||
int
|
||||
reiserfs_inherit_default_acl(struct inode *dir, struct dentry *dentry,
|
||||
|
Reference in New Issue
Block a user