Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e7ec952f authored by Al Viro's avatar Al Viro
Browse files

get rid of BKL in fs/efs



Only readdir() really needed it, and that's easily fixable by switch to
generic_file_llseek()

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 536c9490
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -5,12 +5,12 @@
 */

#include <linux/buffer_head.h>
#include <linux/smp_lock.h>
#include "efs.h"

static int efs_readdir(struct file *, void *, filldir_t);

const struct file_operations efs_dir_operations = {
	.llseek		= generic_file_llseek,
	.read		= generic_read_dir,
	.readdir	= efs_readdir,
};
@@ -33,8 +33,6 @@ static int efs_readdir(struct file *filp, void *dirent, filldir_t filldir) {
	if (inode->i_size & (EFS_DIRBSIZE-1))
		printk(KERN_WARNING "EFS: WARNING: readdir(): directory size not a multiple of EFS_DIRBSIZE\n");

	lock_kernel();

	/* work out where this entry can be found */
	block = filp->f_pos >> EFS_DIRBSIZE_BITS;

@@ -107,7 +105,6 @@ static int efs_readdir(struct file *filp, void *dirent, filldir_t filldir) {

	filp->f_pos = (block << EFS_DIRBSIZE_BITS) | slot;
out:
	unlock_kernel();
	return 0;
}
+1 −8
Original line number Diff line number Diff line
@@ -8,7 +8,6 @@

#include <linux/buffer_head.h>
#include <linux/string.h>
#include <linux/smp_lock.h>
#include <linux/exportfs.h>
#include "efs.h"

@@ -63,16 +62,12 @@ struct dentry *efs_lookup(struct inode *dir, struct dentry *dentry, struct namei
	efs_ino_t inodenum;
	struct inode * inode = NULL;

	lock_kernel();
	inodenum = efs_find_entry(dir, dentry->d_name.name, dentry->d_name.len);
	if (inodenum) {
		inode = efs_iget(dir->i_sb, inodenum);
		if (IS_ERR(inode)) {
			unlock_kernel();
		if (IS_ERR(inode))
			return ERR_CAST(inode);
	}
	}
	unlock_kernel();

	return d_splice_alias(inode, dentry);
}
@@ -115,11 +110,9 @@ struct dentry *efs_get_parent(struct dentry *child)
	struct dentry *parent = ERR_PTR(-ENOENT);
	efs_ino_t ino;

	lock_kernel();
	ino = efs_find_entry(child->d_inode, "..", 2);
	if (ino)
		parent = d_obtain_alias(efs_iget(child->d_inode->i_sb, ino));
	unlock_kernel();

	return parent;
}
+1 −6
Original line number Diff line number Diff line
@@ -9,7 +9,6 @@
#include <linux/string.h>
#include <linux/pagemap.h>
#include <linux/buffer_head.h>
#include <linux/smp_lock.h>
#include "efs.h"

static int efs_symlink_readpage(struct file *file, struct page *page)
@@ -22,9 +21,8 @@ static int efs_symlink_readpage(struct file *file, struct page *page)
  
	err = -ENAMETOOLONG;
	if (size > 2 * EFS_BLOCKSIZE)
		goto fail_notlocked;
		goto fail;
  
	lock_kernel();
	/* read first 512 bytes of link target */
	err = -EIO;
	bh = sb_bread(inode->i_sb, efs_bmap(inode, 0));
@@ -40,14 +38,11 @@ static int efs_symlink_readpage(struct file *file, struct page *page)
		brelse(bh);
	}
	link[size] = '\0';
	unlock_kernel();
	SetPageUptodate(page);
	kunmap(page);
	unlock_page(page);
	return 0;
fail:
	unlock_kernel();
fail_notlocked:
	SetPageError(page);
	kunmap(page);
	unlock_page(page);