Commit a11f3a05 authored by Arjan van de Ven's avatar Arjan van de Ven Committed by Linus Torvalds

[PATCH] sem2mutex: vfs_rename_mutex

Semaphore to mutex conversion.

The conversion was generated via scripts, and the result was validated
automatically via a script as well.
Signed-off-by: default avatarArjan van de Ven <arjan@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Cc: Al Viro <viro@ftp.linux.org.uk>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 144efe3e
...@@ -138,9 +138,9 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode, ...@@ -138,9 +138,9 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
cifs_sb = CIFS_SB(inode->i_sb); cifs_sb = CIFS_SB(inode->i_sb);
pTcon = cifs_sb->tcon; pTcon = cifs_sb->tcon;
down(&direntry->d_sb->s_vfs_rename_sem); mutex_lock(&direntry->d_sb->s_vfs_rename_mutex);
full_path = build_path_from_dentry(direntry); full_path = build_path_from_dentry(direntry);
up(&direntry->d_sb->s_vfs_rename_sem); mutex_unlock(&direntry->d_sb->s_vfs_rename_mutex);
if(full_path == NULL) { if(full_path == NULL) {
FreeXid(xid); FreeXid(xid);
return -ENOMEM; return -ENOMEM;
...@@ -317,9 +317,9 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, ...@@ -317,9 +317,9 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,
cifs_sb = CIFS_SB(inode->i_sb); cifs_sb = CIFS_SB(inode->i_sb);
pTcon = cifs_sb->tcon; pTcon = cifs_sb->tcon;
down(&direntry->d_sb->s_vfs_rename_sem); mutex_lock(&direntry->d_sb->s_vfs_rename_mutex);
full_path = build_path_from_dentry(direntry); full_path = build_path_from_dentry(direntry);
up(&direntry->d_sb->s_vfs_rename_sem); mutex_unlock(&direntry->d_sb->s_vfs_rename_mutex);
if(full_path == NULL) if(full_path == NULL)
rc = -ENOMEM; rc = -ENOMEM;
else if (pTcon->ses->capabilities & CAP_UNIX) { else if (pTcon->ses->capabilities & CAP_UNIX) {
......
...@@ -86,9 +86,9 @@ int cifs_dir_notify(struct file * file, unsigned long arg) ...@@ -86,9 +86,9 @@ int cifs_dir_notify(struct file * file, unsigned long arg)
cifs_sb = CIFS_SB(file->f_dentry->d_sb); cifs_sb = CIFS_SB(file->f_dentry->d_sb);
pTcon = cifs_sb->tcon; pTcon = cifs_sb->tcon;
down(&file->f_dentry->d_sb->s_vfs_rename_sem); mutex_lock(&file->f_dentry->d_sb->s_vfs_rename_mutex);
full_path = build_path_from_dentry(file->f_dentry); full_path = build_path_from_dentry(file->f_dentry);
up(&file->f_dentry->d_sb->s_vfs_rename_sem); mutex_unlock(&file->f_dentry->d_sb->s_vfs_rename_mutex);
if(full_path == NULL) { if(full_path == NULL) {
rc = -ENOMEM; rc = -ENOMEM;
......
...@@ -203,9 +203,9 @@ int cifs_open(struct inode *inode, struct file *file) ...@@ -203,9 +203,9 @@ int cifs_open(struct inode *inode, struct file *file)
} }
} }
down(&inode->i_sb->s_vfs_rename_sem); mutex_lock(&inode->i_sb->s_vfs_rename_mutex);
full_path = build_path_from_dentry(file->f_dentry); full_path = build_path_from_dentry(file->f_dentry);
up(&inode->i_sb->s_vfs_rename_sem); mutex_unlock(&inode->i_sb->s_vfs_rename_mutex);
if (full_path == NULL) { if (full_path == NULL) {
FreeXid(xid); FreeXid(xid);
return -ENOMEM; return -ENOMEM;
......
...@@ -574,9 +574,9 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry) ...@@ -574,9 +574,9 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
/* Unlink can be called from rename so we can not grab the sem here /* Unlink can be called from rename so we can not grab the sem here
since we deadlock otherwise */ since we deadlock otherwise */
/* down(&direntry->d_sb->s_vfs_rename_sem);*/ /* mutex_lock(&direntry->d_sb->s_vfs_rename_mutex);*/
full_path = build_path_from_dentry(direntry); full_path = build_path_from_dentry(direntry);
/* up(&direntry->d_sb->s_vfs_rename_sem);*/ /* mutex_unlock(&direntry->d_sb->s_vfs_rename_mutex);*/
if (full_path == NULL) { if (full_path == NULL) {
FreeXid(xid); FreeXid(xid);
return -ENOMEM; return -ENOMEM;
...@@ -718,9 +718,9 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) ...@@ -718,9 +718,9 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
cifs_sb = CIFS_SB(inode->i_sb); cifs_sb = CIFS_SB(inode->i_sb);
pTcon = cifs_sb->tcon; pTcon = cifs_sb->tcon;
down(&inode->i_sb->s_vfs_rename_sem); mutex_lock(&inode->i_sb->s_vfs_rename_mutex);
full_path = build_path_from_dentry(direntry); full_path = build_path_from_dentry(direntry);
up(&inode->i_sb->s_vfs_rename_sem); mutex_unlock(&inode->i_sb->s_vfs_rename_mutex);
if (full_path == NULL) { if (full_path == NULL) {
FreeXid(xid); FreeXid(xid);
return -ENOMEM; return -ENOMEM;
...@@ -803,9 +803,9 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry) ...@@ -803,9 +803,9 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry)
cifs_sb = CIFS_SB(inode->i_sb); cifs_sb = CIFS_SB(inode->i_sb);
pTcon = cifs_sb->tcon; pTcon = cifs_sb->tcon;
down(&inode->i_sb->s_vfs_rename_sem); mutex_lock(&inode->i_sb->s_vfs_rename_mutex);
full_path = build_path_from_dentry(direntry); full_path = build_path_from_dentry(direntry);
up(&inode->i_sb->s_vfs_rename_sem); mutex_unlock(&inode->i_sb->s_vfs_rename_mutex);
if (full_path == NULL) { if (full_path == NULL) {
FreeXid(xid); FreeXid(xid);
return -ENOMEM; return -ENOMEM;
...@@ -1137,9 +1137,9 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) ...@@ -1137,9 +1137,9 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
rc = 0; rc = 0;
} }
down(&direntry->d_sb->s_vfs_rename_sem); mutex_lock(&direntry->d_sb->s_vfs_rename_mutex);
full_path = build_path_from_dentry(direntry); full_path = build_path_from_dentry(direntry);
up(&direntry->d_sb->s_vfs_rename_sem); mutex_unlock(&direntry->d_sb->s_vfs_rename_mutex);
if (full_path == NULL) { if (full_path == NULL) {
FreeXid(xid); FreeXid(xid);
return -ENOMEM; return -ENOMEM;
......
...@@ -48,10 +48,10 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode, ...@@ -48,10 +48,10 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode,
/* No need to check for cross device links since server will do that /* No need to check for cross device links since server will do that
BB note DFS case in future though (when we may have to check) */ BB note DFS case in future though (when we may have to check) */
down(&inode->i_sb->s_vfs_rename_sem); mutex_lock(&inode->i_sb->s_vfs_rename_mutex);
fromName = build_path_from_dentry(old_file); fromName = build_path_from_dentry(old_file);
toName = build_path_from_dentry(direntry); toName = build_path_from_dentry(direntry);
up(&inode->i_sb->s_vfs_rename_sem); mutex_unlock(&inode->i_sb->s_vfs_rename_mutex);
if((fromName == NULL) || (toName == NULL)) { if((fromName == NULL) || (toName == NULL)) {
rc = -ENOMEM; rc = -ENOMEM;
goto cifs_hl_exit; goto cifs_hl_exit;
...@@ -103,9 +103,9 @@ cifs_follow_link(struct dentry *direntry, struct nameidata *nd) ...@@ -103,9 +103,9 @@ cifs_follow_link(struct dentry *direntry, struct nameidata *nd)
xid = GetXid(); xid = GetXid();
down(&direntry->d_sb->s_vfs_rename_sem); mutex_lock(&direntry->d_sb->s_vfs_rename_mutex);
full_path = build_path_from_dentry(direntry); full_path = build_path_from_dentry(direntry);
up(&direntry->d_sb->s_vfs_rename_sem); mutex_unlock(&direntry->d_sb->s_vfs_rename_mutex);
if (!full_path) if (!full_path)
goto out_no_free; goto out_no_free;
...@@ -164,9 +164,9 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname) ...@@ -164,9 +164,9 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname)
cifs_sb = CIFS_SB(inode->i_sb); cifs_sb = CIFS_SB(inode->i_sb);
pTcon = cifs_sb->tcon; pTcon = cifs_sb->tcon;
down(&inode->i_sb->s_vfs_rename_sem); mutex_lock(&inode->i_sb->s_vfs_rename_mutex);
full_path = build_path_from_dentry(direntry); full_path = build_path_from_dentry(direntry);
up(&inode->i_sb->s_vfs_rename_sem); mutex_unlock(&inode->i_sb->s_vfs_rename_mutex);
if(full_path == NULL) { if(full_path == NULL) {
FreeXid(xid); FreeXid(xid);
...@@ -232,9 +232,9 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen) ...@@ -232,9 +232,9 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
/* BB would it be safe against deadlock to grab this sem /* BB would it be safe against deadlock to grab this sem
even though rename itself grabs the sem and calls lookup? */ even though rename itself grabs the sem and calls lookup? */
/* down(&inode->i_sb->s_vfs_rename_sem);*/ /* mutex_lock(&inode->i_sb->s_vfs_rename_mutex);*/
full_path = build_path_from_dentry(direntry); full_path = build_path_from_dentry(direntry);
/* up(&inode->i_sb->s_vfs_rename_sem);*/ /* mutex_unlock(&inode->i_sb->s_vfs_rename_mutex);*/
if(full_path == NULL) { if(full_path == NULL) {
FreeXid(xid); FreeXid(xid);
......
...@@ -404,9 +404,9 @@ static int initiate_cifs_search(const int xid, struct file *file) ...@@ -404,9 +404,9 @@ static int initiate_cifs_search(const int xid, struct file *file)
if(pTcon == NULL) if(pTcon == NULL)
return -EINVAL; return -EINVAL;
down(&file->f_dentry->d_sb->s_vfs_rename_sem); mutex_lock(&file->f_dentry->d_sb->s_vfs_rename_mutex);
full_path = build_path_from_dentry(file->f_dentry); full_path = build_path_from_dentry(file->f_dentry);
up(&file->f_dentry->d_sb->s_vfs_rename_sem); mutex_unlock(&file->f_dentry->d_sb->s_vfs_rename_mutex);
if(full_path == NULL) { if(full_path == NULL) {
return -ENOMEM; return -ENOMEM;
......
...@@ -62,9 +62,9 @@ int cifs_removexattr(struct dentry * direntry, const char * ea_name) ...@@ -62,9 +62,9 @@ int cifs_removexattr(struct dentry * direntry, const char * ea_name)
cifs_sb = CIFS_SB(sb); cifs_sb = CIFS_SB(sb);
pTcon = cifs_sb->tcon; pTcon = cifs_sb->tcon;
down(&sb->s_vfs_rename_sem); mutex_lock(&sb->s_vfs_rename_mutex);
full_path = build_path_from_dentry(direntry); full_path = build_path_from_dentry(direntry);
up(&sb->s_vfs_rename_sem); mutex_unlock(&sb->s_vfs_rename_mutex);
if(full_path == NULL) { if(full_path == NULL) {
FreeXid(xid); FreeXid(xid);
return -ENOMEM; return -ENOMEM;
...@@ -116,9 +116,9 @@ int cifs_setxattr(struct dentry * direntry, const char * ea_name, ...@@ -116,9 +116,9 @@ int cifs_setxattr(struct dentry * direntry, const char * ea_name,
cifs_sb = CIFS_SB(sb); cifs_sb = CIFS_SB(sb);
pTcon = cifs_sb->tcon; pTcon = cifs_sb->tcon;
down(&sb->s_vfs_rename_sem); mutex_lock(&sb->s_vfs_rename_mutex);
full_path = build_path_from_dentry(direntry); full_path = build_path_from_dentry(direntry);
up(&sb->s_vfs_rename_sem); mutex_unlock(&sb->s_vfs_rename_mutex);
if(full_path == NULL) { if(full_path == NULL) {
FreeXid(xid); FreeXid(xid);
return -ENOMEM; return -ENOMEM;
...@@ -223,9 +223,9 @@ ssize_t cifs_getxattr(struct dentry * direntry, const char * ea_name, ...@@ -223,9 +223,9 @@ ssize_t cifs_getxattr(struct dentry * direntry, const char * ea_name,
cifs_sb = CIFS_SB(sb); cifs_sb = CIFS_SB(sb);
pTcon = cifs_sb->tcon; pTcon = cifs_sb->tcon;
down(&sb->s_vfs_rename_sem); mutex_lock(&sb->s_vfs_rename_mutex);
full_path = build_path_from_dentry(direntry); full_path = build_path_from_dentry(direntry);
up(&sb->s_vfs_rename_sem); mutex_unlock(&sb->s_vfs_rename_mutex);
if(full_path == NULL) { if(full_path == NULL) {
FreeXid(xid); FreeXid(xid);
return -ENOMEM; return -ENOMEM;
...@@ -341,9 +341,9 @@ ssize_t cifs_listxattr(struct dentry * direntry, char * data, size_t buf_size) ...@@ -341,9 +341,9 @@ ssize_t cifs_listxattr(struct dentry * direntry, char * data, size_t buf_size)
cifs_sb = CIFS_SB(sb); cifs_sb = CIFS_SB(sb);
pTcon = cifs_sb->tcon; pTcon = cifs_sb->tcon;
down(&sb->s_vfs_rename_sem); mutex_lock(&sb->s_vfs_rename_mutex);
full_path = build_path_from_dentry(direntry); full_path = build_path_from_dentry(direntry);
up(&sb->s_vfs_rename_sem); mutex_unlock(&sb->s_vfs_rename_mutex);
if(full_path == NULL) { if(full_path == NULL) {
FreeXid(xid); FreeXid(xid);
return -ENOMEM; return -ENOMEM;
......
...@@ -104,7 +104,7 @@ ...@@ -104,7 +104,7 @@
*/ */
/* /*
* [Sep 2001 AV] Single-semaphore locking scheme (kudos to David Holland) * [Sep 2001 AV] Single-semaphore locking scheme (kudos to David Holland)
* implemented. Let's see if raised priority of ->s_vfs_rename_sem gives * implemented. Let's see if raised priority of ->s_vfs_rename_mutex gives
* any extra contention... * any extra contention...
*/ */
...@@ -1422,7 +1422,7 @@ struct dentry *lock_rename(struct dentry *p1, struct dentry *p2) ...@@ -1422,7 +1422,7 @@ struct dentry *lock_rename(struct dentry *p1, struct dentry *p2)
return NULL; return NULL;
} }
down(&p1->d_inode->i_sb->s_vfs_rename_sem); mutex_lock(&p1->d_inode->i_sb->s_vfs_rename_mutex);
for (p = p1; p->d_parent != p; p = p->d_parent) { for (p = p1; p->d_parent != p; p = p->d_parent) {
if (p->d_parent == p2) { if (p->d_parent == p2) {
...@@ -1450,7 +1450,7 @@ void unlock_rename(struct dentry *p1, struct dentry *p2) ...@@ -1450,7 +1450,7 @@ void unlock_rename(struct dentry *p1, struct dentry *p2)
mutex_unlock(&p1->d_inode->i_mutex); mutex_unlock(&p1->d_inode->i_mutex);
if (p1 != p2) { if (p1 != p2) {
mutex_unlock(&p2->d_inode->i_mutex); mutex_unlock(&p2->d_inode->i_mutex);
up(&p1->d_inode->i_sb->s_vfs_rename_sem); mutex_unlock(&p1->d_inode->i_sb->s_vfs_rename_mutex);
} }
} }
...@@ -2277,17 +2277,17 @@ asmlinkage long sys_link(const char __user *oldname, const char __user *newname) ...@@ -2277,17 +2277,17 @@ asmlinkage long sys_link(const char __user *oldname, const char __user *newname)
* a) we can get into loop creation. Check is done in is_subdir(). * a) we can get into loop creation. Check is done in is_subdir().
* b) race potential - two innocent renames can create a loop together. * b) race potential - two innocent renames can create a loop together.
* That's where 4.4 screws up. Current fix: serialization on * That's where 4.4 screws up. Current fix: serialization on
* sb->s_vfs_rename_sem. We might be more accurate, but that's another * sb->s_vfs_rename_mutex. We might be more accurate, but that's another
* story. * story.
* c) we have to lock _three_ objects - parents and victim (if it exists). * c) we have to lock _three_ objects - parents and victim (if it exists).
* And that - after we got ->i_mutex on parents (until then we don't know * And that - after we got ->i_mutex on parents (until then we don't know
* whether the target exists). Solution: try to be smart with locking * whether the target exists). Solution: try to be smart with locking
* order for inodes. We rely on the fact that tree topology may change * order for inodes. We rely on the fact that tree topology may change
* only under ->s_vfs_rename_sem _and_ that parent of the object we * only under ->s_vfs_rename_mutex _and_ that parent of the object we
* move will be locked. Thus we can rank directories by the tree * move will be locked. Thus we can rank directories by the tree
* (ancestors first) and rank all non-directories after them. * (ancestors first) and rank all non-directories after them.
* That works since everybody except rename does "lock parent, lookup, * That works since everybody except rename does "lock parent, lookup,
* lock child" and rename is under ->s_vfs_rename_sem. * lock child" and rename is under ->s_vfs_rename_mutex.
* HOWEVER, it relies on the assumption that any object with ->lookup() * HOWEVER, it relies on the assumption that any object with ->lookup()
* has no more than 1 dentry. If "hybrid" objects will ever appear, * has no more than 1 dentry. If "hybrid" objects will ever appear,
* we'd better make sure that there's no link(2) for them. * we'd better make sure that there's no link(2) for them.
......
...@@ -76,7 +76,7 @@ static struct super_block *alloc_super(void) ...@@ -76,7 +76,7 @@ static struct super_block *alloc_super(void)
down_write(&s->s_umount); down_write(&s->s_umount);
s->s_count = S_BIAS; s->s_count = S_BIAS;
atomic_set(&s->s_active, 1); atomic_set(&s->s_active, 1);
sema_init(&s->s_vfs_rename_sem,1); mutex_init(&s->s_vfs_rename_mutex);
mutex_init(&s->s_dquot.dqio_mutex); mutex_init(&s->s_dquot.dqio_mutex);
mutex_init(&s->s_dquot.dqonoff_mutex); mutex_init(&s->s_dquot.dqonoff_mutex);
init_rwsem(&s->s_dquot.dqptr_sem); init_rwsem(&s->s_dquot.dqptr_sem);
......
...@@ -847,7 +847,7 @@ struct super_block { ...@@ -847,7 +847,7 @@ struct super_block {
* The next field is for VFS *only*. No filesystems have any business * The next field is for VFS *only*. No filesystems have any business
* even looking at it. You had been warned. * even looking at it. You had been warned.
*/ */
struct semaphore s_vfs_rename_sem; /* Kludge */ struct mutex s_vfs_rename_mutex; /* Kludge */
/* Granuality of c/m/atime in ns. /* Granuality of c/m/atime in ns.
Cannot be worse than a second */ Cannot be worse than a second */
......
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