提交 d769b3c2 编写于 作者: J Jan Kara 提交者: Al Viro

isofs: Remove global fs lock

sbi->s_mutex isn't needed for isofs at all so we can just remove it. Generally,
since isofs is always mounted read-only, filesystem structure cannot change
under us.  So buffer_head contents stays constant after it's filled in. That
leaves us with possible changes of global data structures. Superblock changes
only during filesystem mount (even remount does not change it), inodes are only
filled in during reading from disk. So there are no changes of these structures
to bother about.

Arguments why sbi->s_mutex can be removed at each place:
isofs_readdir: Accesses sb, inode, filp, local variables => s_mutex not needed
isofs_lookup: Protected by directory's i_mutex. Accesses sb, inode, dentry,
  local variables => s_mutex not needed
rock_ridge_symlink_readpage: Protected by page lock. Accesses sb, inode,
  local variables => s_mutex not needed.
Signed-off-by: NJan Kara <jack@suse.cz>
Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 22ba747f
...@@ -254,19 +254,16 @@ static int isofs_readdir(struct file *filp, ...@@ -254,19 +254,16 @@ static int isofs_readdir(struct file *filp,
char *tmpname; char *tmpname;
struct iso_directory_record *tmpde; struct iso_directory_record *tmpde;
struct inode *inode = filp->f_path.dentry->d_inode; struct inode *inode = filp->f_path.dentry->d_inode;
struct isofs_sb_info *sbi = ISOFS_SB(inode->i_sb);
tmpname = (char *)__get_free_page(GFP_KERNEL); tmpname = (char *)__get_free_page(GFP_KERNEL);
if (tmpname == NULL) if (tmpname == NULL)
return -ENOMEM; return -ENOMEM;
mutex_lock(&sbi->s_mutex);
tmpde = (struct iso_directory_record *) (tmpname+1024); tmpde = (struct iso_directory_record *) (tmpname+1024);
result = do_isofs_readdir(inode, filp, dirent, filldir, tmpname, tmpde); result = do_isofs_readdir(inode, filp, dirent, filldir, tmpname, tmpde);
free_page((unsigned long) tmpname); free_page((unsigned long) tmpname);
mutex_unlock(&sbi->s_mutex);
return result; return result;
} }
......
...@@ -863,7 +863,6 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -863,7 +863,6 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
sbi->s_utf8 = opt.utf8; sbi->s_utf8 = opt.utf8;
sbi->s_nocompress = opt.nocompress; sbi->s_nocompress = opt.nocompress;
sbi->s_overriderockperm = opt.overriderockperm; sbi->s_overriderockperm = opt.overriderockperm;
mutex_init(&sbi->s_mutex);
/* /*
* It would be incredibly stupid to allow people to mark every file * It would be incredibly stupid to allow people to mark every file
* on the disk as suid, so we merely allow them to set the default * on the disk as suid, so we merely allow them to set the default
......
...@@ -55,7 +55,6 @@ struct isofs_sb_info { ...@@ -55,7 +55,6 @@ struct isofs_sb_info {
gid_t s_gid; gid_t s_gid;
uid_t s_uid; uid_t s_uid;
struct nls_table *s_nls_iocharset; /* Native language support table */ struct nls_table *s_nls_iocharset; /* Native language support table */
struct mutex s_mutex; /* replaces BKL, please remove if possible */
}; };
#define ISOFS_INVALID_MODE ((mode_t) -1) #define ISOFS_INVALID_MODE ((mode_t) -1)
......
...@@ -168,7 +168,6 @@ struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nam ...@@ -168,7 +168,6 @@ struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nam
int found; int found;
unsigned long uninitialized_var(block); unsigned long uninitialized_var(block);
unsigned long uninitialized_var(offset); unsigned long uninitialized_var(offset);
struct isofs_sb_info *sbi = ISOFS_SB(dir->i_sb);
struct inode *inode; struct inode *inode;
struct page *page; struct page *page;
...@@ -176,7 +175,6 @@ struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nam ...@@ -176,7 +175,6 @@ struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nam
if (!page) if (!page)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
mutex_lock(&sbi->s_mutex);
found = isofs_find_entry(dir, dentry, found = isofs_find_entry(dir, dentry,
&block, &offset, &block, &offset,
page_address(page), page_address(page),
...@@ -185,7 +183,5 @@ struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nam ...@@ -185,7 +183,5 @@ struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nam
inode = found ? isofs_iget(dir->i_sb, block, offset) : NULL; inode = found ? isofs_iget(dir->i_sb, block, offset) : NULL;
mutex_unlock(&sbi->s_mutex);
return d_splice_alias(inode, dentry); return d_splice_alias(inode, dentry);
} }
...@@ -678,7 +678,6 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page) ...@@ -678,7 +678,6 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page)
init_rock_state(&rs, inode); init_rock_state(&rs, inode);
block = ei->i_iget5_block; block = ei->i_iget5_block;
mutex_lock(&sbi->s_mutex);
bh = sb_bread(inode->i_sb, block); bh = sb_bread(inode->i_sb, block);
if (!bh) if (!bh)
goto out_noread; goto out_noread;
...@@ -748,7 +747,6 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page) ...@@ -748,7 +747,6 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page)
goto fail; goto fail;
brelse(bh); brelse(bh);
*rpnt = '\0'; *rpnt = '\0';
mutex_unlock(&sbi->s_mutex);
SetPageUptodate(page); SetPageUptodate(page);
kunmap(page); kunmap(page);
unlock_page(page); unlock_page(page);
...@@ -765,7 +763,6 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page) ...@@ -765,7 +763,6 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page)
printk("symlink spans iso9660 blocks\n"); printk("symlink spans iso9660 blocks\n");
fail: fail:
brelse(bh); brelse(bh);
mutex_unlock(&sbi->s_mutex);
error: error:
SetPageError(page); SetPageError(page);
kunmap(page); kunmap(page);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册