Skip to content

Commit

Permalink
adfs: remove the big kernel lock
Browse files Browse the repository at this point in the history
According to Russell King, adfs was written to not require the big
kernel lock, and all inode updates are done under adfs_dir_lock.

All other metadata in adfs is read-only and does not require locking.
The use of the BKL is the result of various pushdowns from the VFS
operations.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Russell King <rmk@arm.linux.org.uk>
Cc: Stuart Swales <stuart.swales.croftnuisk@gmail.com>
  • Loading branch information
Arnd Bergmann committed Mar 1, 2011
1 parent f5412be commit 4688a06
Show file tree
Hide file tree
Showing 4 changed files with 1 addition and 25 deletions.
1 change: 0 additions & 1 deletion fs/adfs/Kconfig
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
config ADFS_FS
tristate "ADFS file system support (EXPERIMENTAL)"
depends on BLOCK && EXPERIMENTAL
depends on BKL # need to fix
help
The Acorn Disc Filing System is the standard file system of the
RiscOS operating system which runs on Acorn's ARM-based Risc PC
Expand Down
6 changes: 0 additions & 6 deletions fs/adfs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
*
* Common directory handling for ADFS
*/
#include <linux/smp_lock.h>
#include "adfs.h"

/*
Expand All @@ -27,8 +26,6 @@ adfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
struct adfs_dir dir;
int ret = 0;

lock_kernel();

if (filp->f_pos >> 32)
goto out;

Expand Down Expand Up @@ -70,7 +67,6 @@ adfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
ops->free(&dir);

out:
unlock_kernel();
return ret;
}

Expand Down Expand Up @@ -276,7 +272,6 @@ adfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
struct object_info obj;
int error;

lock_kernel();
error = adfs_dir_lookup_byname(dir, &dentry->d_name, &obj);
if (error == 0) {
error = -EACCES;
Expand All @@ -288,7 +283,6 @@ adfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
if (inode)
error = 0;
}
unlock_kernel();
d_add(dentry, inode);
return ERR_PTR(error);
}
Expand Down
6 changes: 0 additions & 6 deletions fs/adfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/smp_lock.h>
#include <linux/buffer_head.h>
#include <linux/writeback.h>
#include "adfs.h"
Expand Down Expand Up @@ -316,8 +315,6 @@ adfs_notify_change(struct dentry *dentry, struct iattr *attr)
unsigned int ia_valid = attr->ia_valid;
int error;

lock_kernel();

error = inode_change_ok(inode, attr);

/*
Expand Down Expand Up @@ -359,7 +356,6 @@ adfs_notify_change(struct dentry *dentry, struct iattr *attr)
if (ia_valid & (ATTR_SIZE | ATTR_MTIME | ATTR_MODE))
mark_inode_dirty(inode);
out:
unlock_kernel();
return error;
}

Expand All @@ -374,7 +370,6 @@ int adfs_write_inode(struct inode *inode, struct writeback_control *wbc)
struct object_info obj;
int ret;

lock_kernel();
obj.file_id = inode->i_ino;
obj.name_len = 0;
obj.parent_id = ADFS_I(inode)->parent_id;
Expand All @@ -384,6 +379,5 @@ int adfs_write_inode(struct inode *inode, struct writeback_control *wbc)
obj.size = inode->i_size;

ret = adfs_dir_update(sb, &obj, wbc->sync_mode == WB_SYNC_ALL);
unlock_kernel();
return ret;
}
13 changes: 1 addition & 12 deletions fs/adfs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
#include <linux/mount.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/smp_lock.h>
#include <linux/statfs.h>
#include "adfs.h"
#include "dir_f.h"
Expand Down Expand Up @@ -120,15 +119,11 @@ static void adfs_put_super(struct super_block *sb)
int i;
struct adfs_sb_info *asb = ADFS_SB(sb);

lock_kernel();

for (i = 0; i < asb->s_map_size; i++)
brelse(asb->s_map[i].dm_bh);
kfree(asb->s_map);
kfree(asb);
sb->s_fs_info = NULL;

unlock_kernel();
}

static int adfs_show_options(struct seq_file *seq, struct vfsmount *mnt)
Expand Down Expand Up @@ -359,15 +354,11 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent)
struct adfs_sb_info *asb;
struct inode *root;

lock_kernel();

sb->s_flags |= MS_NODIRATIME;

asb = kzalloc(sizeof(*asb), GFP_KERNEL);
if (!asb) {
unlock_kernel();
if (!asb)
return -ENOMEM;
}
sb->s_fs_info = asb;

/* set default options */
Expand Down Expand Up @@ -485,15 +476,13 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent)
adfs_error(sb, "get root inode failed\n");
goto error;
}
unlock_kernel();
return 0;

error_free_bh:
brelse(bh);
error:
sb->s_fs_info = NULL;
kfree(asb);
unlock_kernel();
return -EINVAL;
}

Expand Down

0 comments on commit 4688a06

Please sign in to comment.