summaryrefslogtreecommitdiff
path: root/fs/devfs
diff options
context:
space:
mode:
authorAlexander Viro <viro@math.psu.edu>2002-02-12 20:31:22 -0800
committerLinus Torvalds <torvalds@home.transmeta.com>2002-02-12 20:31:22 -0800
commit7994321a1382436bd3698e2eb9d2990a0979bf23 (patch)
treece75ab80bbf9142eef0960bad244b7560a5a8e7a /fs/devfs
parent24b10ca2e75b72716df5d00f93e14dd32c12670e (diff)
[PATCH] BKL shifted inside ->unlink()
Next one in the series - this time it's ->unlink()...
Diffstat (limited to 'fs/devfs')
-rw-r--r--fs/devfs/base.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/fs/devfs/base.c b/fs/devfs/base.c
index 6a0c3e7a2655..d374b4e32b48 100644
--- a/fs/devfs/base.c
+++ b/fs/devfs/base.c
@@ -3030,19 +3030,30 @@ static int devfs_unlink (struct inode *dir, struct dentry *dentry)
struct inode *inode = dentry->d_inode;
struct fs_info *fs_info = dir->i_sb->u.generic_sbp;
+ lock_kernel();
de = get_devfs_entry_from_vfs_inode (inode);
DPRINTK (DEBUG_I_UNLINK, "(%s): de: %p\n", dentry->d_name.name, de);
- if (de == NULL) return -ENOENT;
- if (!de->vfs_deletable) return -EPERM;
+ if (de == NULL) {
+ unlock_kernel();
+ return -ENOENT;
+ }
+ if (!de->vfs_deletable) {
+ unlock_kernel();
+ return -EPERM;
+ }
write_lock (&de->parent->u.dir.lock);
unhooked = _devfs_unhook (de);
write_unlock (&de->parent->u.dir.lock);
- if (!unhooked) return -ENOENT;
+ if (!unhooked) {
+ unlock_kernel();
+ return -ENOENT;
+ }
if ( !is_devfsd_or_child (fs_info) )
devfsd_notify_de (de, DEVFSD_NOTIFY_DELETE, inode->i_mode,
inode->i_uid, inode->i_gid, fs_info, 0);
free_dentry (de);
devfs_put (de);
+ unlock_kernel();
return 0;
} /* End Function devfs_unlink */