BKL: remove BKL from freevxfs
All uses of the BKL in freevxfs were the result of a pushdown into code that doesn't really need it. As Christoph points out, this is a read-only file system, which eliminates most of the races in readdir/lookup. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Cc: Christoph Hellwig <hch@infradead.org>
This commit is contained in:
@@ -36,7 +36,6 @@
|
|||||||
#include <linux/highmem.h>
|
#include <linux/highmem.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/pagemap.h>
|
#include <linux/pagemap.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
|
|
||||||
#include "vxfs.h"
|
#include "vxfs.h"
|
||||||
#include "vxfs_dir.h"
|
#include "vxfs_dir.h"
|
||||||
@@ -212,16 +211,12 @@ vxfs_lookup(struct inode *dip, struct dentry *dp, struct nameidata *nd)
|
|||||||
if (dp->d_name.len > VXFS_NAMELEN)
|
if (dp->d_name.len > VXFS_NAMELEN)
|
||||||
return ERR_PTR(-ENAMETOOLONG);
|
return ERR_PTR(-ENAMETOOLONG);
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
ino = vxfs_inode_by_name(dip, dp);
|
ino = vxfs_inode_by_name(dip, dp);
|
||||||
if (ino) {
|
if (ino) {
|
||||||
ip = vxfs_iget(dip->i_sb, ino);
|
ip = vxfs_iget(dip->i_sb, ino);
|
||||||
if (IS_ERR(ip)) {
|
if (IS_ERR(ip))
|
||||||
unlock_kernel();
|
|
||||||
return ERR_CAST(ip);
|
return ERR_CAST(ip);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
unlock_kernel();
|
|
||||||
d_add(dp, ip);
|
d_add(dp, ip);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -248,8 +243,6 @@ vxfs_readdir(struct file *fp, void *retp, filldir_t filler)
|
|||||||
u_long page, npages, block, pblocks, nblocks, offset;
|
u_long page, npages, block, pblocks, nblocks, offset;
|
||||||
loff_t pos;
|
loff_t pos;
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
|
|
||||||
switch ((long)fp->f_pos) {
|
switch ((long)fp->f_pos) {
|
||||||
case 0:
|
case 0:
|
||||||
if (filler(retp, ".", 1, fp->f_pos, ip->i_ino, DT_DIR) < 0)
|
if (filler(retp, ".", 1, fp->f_pos, ip->i_ino, DT_DIR) < 0)
|
||||||
@@ -265,10 +258,8 @@ vxfs_readdir(struct file *fp, void *retp, filldir_t filler)
|
|||||||
|
|
||||||
pos = fp->f_pos - 2;
|
pos = fp->f_pos - 2;
|
||||||
|
|
||||||
if (pos > VXFS_DIRROUND(ip->i_size)) {
|
if (pos > VXFS_DIRROUND(ip->i_size))
|
||||||
unlock_kernel();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
npages = dir_pages(ip);
|
npages = dir_pages(ip);
|
||||||
nblocks = dir_blocks(ip);
|
nblocks = dir_blocks(ip);
|
||||||
@@ -327,6 +318,5 @@ vxfs_readdir(struct file *fp, void *retp, filldir_t filler)
|
|||||||
done:
|
done:
|
||||||
fp->f_pos = ((page << PAGE_CACHE_SHIFT) | offset) + 2;
|
fp->f_pos = ((page << PAGE_CACHE_SHIFT) | offset) + 2;
|
||||||
out:
|
out:
|
||||||
unlock_kernel();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -38,7 +38,6 @@
|
|||||||
#include <linux/buffer_head.h>
|
#include <linux/buffer_head.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/stat.h>
|
#include <linux/stat.h>
|
||||||
#include <linux/vfs.h>
|
#include <linux/vfs.h>
|
||||||
#include <linux/mount.h>
|
#include <linux/mount.h>
|
||||||
@@ -81,16 +80,12 @@ vxfs_put_super(struct super_block *sbp)
|
|||||||
{
|
{
|
||||||
struct vxfs_sb_info *infp = VXFS_SBI(sbp);
|
struct vxfs_sb_info *infp = VXFS_SBI(sbp);
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
|
|
||||||
vxfs_put_fake_inode(infp->vsi_fship);
|
vxfs_put_fake_inode(infp->vsi_fship);
|
||||||
vxfs_put_fake_inode(infp->vsi_ilist);
|
vxfs_put_fake_inode(infp->vsi_ilist);
|
||||||
vxfs_put_fake_inode(infp->vsi_stilist);
|
vxfs_put_fake_inode(infp->vsi_stilist);
|
||||||
|
|
||||||
brelse(infp->vsi_bp);
|
brelse(infp->vsi_bp);
|
||||||
kfree(infp);
|
kfree(infp);
|
||||||
|
|
||||||
unlock_kernel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -159,14 +154,11 @@ static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent)
|
|||||||
struct inode *root;
|
struct inode *root;
|
||||||
int ret = -EINVAL;
|
int ret = -EINVAL;
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
|
|
||||||
sbp->s_flags |= MS_RDONLY;
|
sbp->s_flags |= MS_RDONLY;
|
||||||
|
|
||||||
infp = kzalloc(sizeof(*infp), GFP_KERNEL);
|
infp = kzalloc(sizeof(*infp), GFP_KERNEL);
|
||||||
if (!infp) {
|
if (!infp) {
|
||||||
printk(KERN_WARNING "vxfs: unable to allocate incore superblock\n");
|
printk(KERN_WARNING "vxfs: unable to allocate incore superblock\n");
|
||||||
unlock_kernel();
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -239,7 +231,6 @@ static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent)
|
|||||||
goto out_free_ilist;
|
goto out_free_ilist;
|
||||||
}
|
}
|
||||||
|
|
||||||
unlock_kernel();
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_free_ilist:
|
out_free_ilist:
|
||||||
@@ -249,7 +240,6 @@ out_free_ilist:
|
|||||||
out:
|
out:
|
||||||
brelse(bp);
|
brelse(bp);
|
||||||
kfree(infp);
|
kfree(infp);
|
||||||
unlock_kernel();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user