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

Commit 7558da94 authored by Jonathan Corbet's avatar Jonathan Corbet
Browse files

mips: cdev lock_kernel() pushdown



Push the cdev lock_kernel() call into MIPS-specific drivers.

Signed-off-by: default avatarJonathan Corbet <corbet@lwn.net>
parent 0c401df3
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <linux/vmalloc.h>
#include <linux/elf.h>
#include <linux/seq_file.h>
#include <linux/smp_lock.h>
#include <linux/syscalls.h>
#include <linux/moduleloader.h>
#include <linux/interrupt.h>
@@ -392,8 +393,12 @@ out:
static int file_open(struct inode *inode, struct file *filp)
{
	int minor = iminor(inode);
	int err;

	return rtlx_open(minor, (filp->f_flags & O_NONBLOCK) ? 0 : 1);
	lock_kernel();
	err = rtlx_open(minor, (filp->f_flags & O_NONBLOCK) ? 0 : 1);
	unlock_kernel();
	return err;
}

static int file_release(struct inode *inode, struct file *filp)
+9 −3
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@
#include <linux/vmalloc.h>
#include <linux/elf.h>
#include <linux/seq_file.h>
#include <linux/smp_lock.h>
#include <linux/syscalls.h>
#include <linux/moduleloader.h>
#include <linux/interrupt.h>
@@ -1050,17 +1051,20 @@ static int vpe_open(struct inode *inode, struct file *filp)
	enum vpe_state state;
	struct vpe_notifications *not;
	struct vpe *v;
	int ret;
	int ret, err = 0;

	lock_kernel();
	if (minor != iminor(inode)) {
		/* assume only 1 device at the moment. */
		printk(KERN_WARNING "VPE loader: only vpe1 is supported\n");
		return -ENODEV;
		err = -ENODEV;
		goto out;
	}

	if ((v = get_vpe(tclimit)) == NULL) {
		printk(KERN_WARNING "VPE loader: unable to get vpe\n");
		return -ENODEV;
		err = -ENODEV;
		goto out;
	}

	state = xchg(&v->state, VPE_STATE_INUSE);
@@ -1100,6 +1104,8 @@ static int vpe_open(struct inode *inode, struct file *filp)
	v->shared_ptr = NULL;
	v->__start = 0;

out:
	unlock_kernel();
	return 0;
}

+18 −7
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
#include <linux/smp_lock.h>
#include <linux/vmalloc.h>
#include <linux/fs.h>
#include <linux/errno.h>
@@ -402,18 +403,26 @@ static int sbprof_zbprof_stop(void)
static int sbprof_tb_open(struct inode *inode, struct file *filp)
{
	int minor;
	int err = 0;

	lock_kernel();
	minor = iminor(inode);
	if (minor != 0)
		return -ENODEV;
	if (minor != 0) {
		err = -ENODEV;
		goto out;
	}

	if (xchg(&sbp.open, SB_OPENING) != SB_CLOSED)
		return -EBUSY;
	if (xchg(&sbp.open, SB_OPENING) != SB_CLOSED) {
		err = -EBUSY;
		goto out;
	}

	memset(&sbp, 0, sizeof(struct sbprof_tb));
	sbp.sbprof_tbbuf = vmalloc(MAX_TBSAMPLE_BYTES);
	if (!sbp.sbprof_tbbuf)
		return -ENOMEM;
	if (!sbp.sbprof_tbbuf) {
		err = -ENOMEM;
		goto out;
	}
	memset(sbp.sbprof_tbbuf, 0, MAX_TBSAMPLE_BYTES);
	init_waitqueue_head(&sbp.tb_sync);
	init_waitqueue_head(&sbp.tb_read);
@@ -421,7 +430,9 @@ static int sbprof_tb_open(struct inode *inode, struct file *filp)

	sbp.open = SB_OPEN;

	return 0;
  out:
	unlock_kernel();
	return err;
}

static int sbprof_tb_release(struct inode *inode, struct file *filp)