mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 23:13:01 +02:00
drivers/s390: cdev lock_kernel() pushdown
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
This commit is contained in:
parent
51a776fa7a
commit
764a4a8e54
|
@ -14,6 +14,7 @@
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
#include <linux/smp_lock.h>
|
||||||
|
|
||||||
#include <asm/ccwdev.h>
|
#include <asm/ccwdev.h>
|
||||||
#include <asm/cio.h>
|
#include <asm/cio.h>
|
||||||
|
@ -421,6 +422,7 @@ fs3270_open(struct inode *inode, struct file *filp)
|
||||||
|
|
||||||
if (imajor(filp->f_path.dentry->d_inode) != IBM_FS3270_MAJOR)
|
if (imajor(filp->f_path.dentry->d_inode) != IBM_FS3270_MAJOR)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
lock_kernel();
|
||||||
minor = iminor(filp->f_path.dentry->d_inode);
|
minor = iminor(filp->f_path.dentry->d_inode);
|
||||||
/* Check for minor 0 multiplexer. */
|
/* Check for minor 0 multiplexer. */
|
||||||
if (minor == 0) {
|
if (minor == 0) {
|
||||||
|
@ -429,7 +431,8 @@ fs3270_open(struct inode *inode, struct file *filp)
|
||||||
tty = get_current_tty();
|
tty = get_current_tty();
|
||||||
if (!tty || tty->driver->major != IBM_TTY3270_MAJOR) {
|
if (!tty || tty->driver->major != IBM_TTY3270_MAJOR) {
|
||||||
mutex_unlock(&tty_mutex);
|
mutex_unlock(&tty_mutex);
|
||||||
return -ENODEV;
|
rc = -ENODEV;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
minor = tty->index + RAW3270_FIRSTMINOR;
|
minor = tty->index + RAW3270_FIRSTMINOR;
|
||||||
mutex_unlock(&tty_mutex);
|
mutex_unlock(&tty_mutex);
|
||||||
|
@ -438,19 +441,22 @@ fs3270_open(struct inode *inode, struct file *filp)
|
||||||
fp = (struct fs3270 *) raw3270_find_view(&fs3270_fn, minor);
|
fp = (struct fs3270 *) raw3270_find_view(&fs3270_fn, minor);
|
||||||
if (!IS_ERR(fp)) {
|
if (!IS_ERR(fp)) {
|
||||||
raw3270_put_view(&fp->view);
|
raw3270_put_view(&fp->view);
|
||||||
return -EBUSY;
|
rc = -EBUSY;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
/* Allocate fullscreen view structure. */
|
/* Allocate fullscreen view structure. */
|
||||||
fp = fs3270_alloc_view();
|
fp = fs3270_alloc_view();
|
||||||
if (IS_ERR(fp))
|
if (IS_ERR(fp)) {
|
||||||
return PTR_ERR(fp);
|
rc = PTR_ERR(fp);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
init_waitqueue_head(&fp->wait);
|
init_waitqueue_head(&fp->wait);
|
||||||
fp->fs_pid = get_pid(task_pid(current));
|
fp->fs_pid = get_pid(task_pid(current));
|
||||||
rc = raw3270_add_view(&fp->view, &fs3270_fn, minor);
|
rc = raw3270_add_view(&fp->view, &fs3270_fn, minor);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
fs3270_free_view(&fp->view);
|
fs3270_free_view(&fp->view);
|
||||||
return rc;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate idal-buffer. */
|
/* Allocate idal-buffer. */
|
||||||
|
@ -458,7 +464,8 @@ fs3270_open(struct inode *inode, struct file *filp)
|
||||||
if (IS_ERR(ib)) {
|
if (IS_ERR(ib)) {
|
||||||
raw3270_put_view(&fp->view);
|
raw3270_put_view(&fp->view);
|
||||||
raw3270_del_view(&fp->view);
|
raw3270_del_view(&fp->view);
|
||||||
return PTR_ERR(fp);
|
rc = PTR_ERR(fp);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
fp->rdbuf = ib;
|
fp->rdbuf = ib;
|
||||||
|
|
||||||
|
@ -466,9 +473,11 @@ fs3270_open(struct inode *inode, struct file *filp)
|
||||||
if (rc) {
|
if (rc) {
|
||||||
raw3270_put_view(&fp->view);
|
raw3270_put_view(&fp->view);
|
||||||
raw3270_del_view(&fp->view);
|
raw3270_del_view(&fp->view);
|
||||||
return rc;
|
goto out;
|
||||||
}
|
}
|
||||||
filp->private_data = fp;
|
filp->private_data = fp;
|
||||||
|
out:
|
||||||
|
unlock_kernel();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
#include <linux/mtio.h>
|
#include <linux/mtio.h>
|
||||||
|
#include <linux/smp_lock.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
|
@ -289,21 +290,26 @@ tapechar_open (struct inode *inode, struct file *filp)
|
||||||
if (imajor(filp->f_path.dentry->d_inode) != tapechar_major)
|
if (imajor(filp->f_path.dentry->d_inode) != tapechar_major)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
lock_kernel();
|
||||||
minor = iminor(filp->f_path.dentry->d_inode);
|
minor = iminor(filp->f_path.dentry->d_inode);
|
||||||
device = tape_get_device(minor / TAPE_MINORS_PER_DEV);
|
device = tape_get_device(minor / TAPE_MINORS_PER_DEV);
|
||||||
if (IS_ERR(device)) {
|
if (IS_ERR(device)) {
|
||||||
DBF_EVENT(3, "TCHAR:open: tape_get_device() failed\n");
|
DBF_EVENT(3, "TCHAR:open: tape_get_device() failed\n");
|
||||||
return PTR_ERR(device);
|
rc = PTR_ERR(device);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rc = tape_open(device);
|
rc = tape_open(device);
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
filp->private_data = device;
|
filp->private_data = device;
|
||||||
return nonseekable_open(inode, filp);
|
rc = nonseekable_open(inode, filp);
|
||||||
}
|
}
|
||||||
tape_put_device(device);
|
else
|
||||||
|
tape_put_device(device);
|
||||||
|
|
||||||
|
out:
|
||||||
|
unlock_kernel();
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include <linux/kmod.h>
|
#include <linux/kmod.h>
|
||||||
#include <linux/cdev.h>
|
#include <linux/cdev.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
#include <linux/smp_lock.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -319,9 +320,11 @@ static int vmlogrdr_open (struct inode *inode, struct file *filp)
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
|
|
||||||
/* Besure this device hasn't already been opened */
|
/* Besure this device hasn't already been opened */
|
||||||
|
lock_kernel();
|
||||||
spin_lock_bh(&logptr->priv_lock);
|
spin_lock_bh(&logptr->priv_lock);
|
||||||
if (logptr->dev_in_use) {
|
if (logptr->dev_in_use) {
|
||||||
spin_unlock_bh(&logptr->priv_lock);
|
spin_unlock_bh(&logptr->priv_lock);
|
||||||
|
unlock_kernel();
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
logptr->dev_in_use = 1;
|
logptr->dev_in_use = 1;
|
||||||
|
@ -365,7 +368,9 @@ static int vmlogrdr_open (struct inode *inode, struct file *filp)
|
||||||
|| (logptr->iucv_path_severed));
|
|| (logptr->iucv_path_severed));
|
||||||
if (logptr->iucv_path_severed)
|
if (logptr->iucv_path_severed)
|
||||||
goto out_record;
|
goto out_record;
|
||||||
return nonseekable_open(inode, filp);
|
ret = nonseekable_open(inode, filp);
|
||||||
|
unlock_kernel();
|
||||||
|
return ret;
|
||||||
|
|
||||||
out_record:
|
out_record:
|
||||||
if (logptr->autorecording)
|
if (logptr->autorecording)
|
||||||
|
@ -375,6 +380,7 @@ out_path:
|
||||||
logptr->path = NULL;
|
logptr->path = NULL;
|
||||||
out_dev:
|
out_dev:
|
||||||
logptr->dev_in_use = 0;
|
logptr->dev_in_use = 0;
|
||||||
|
unlock_kernel();
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/cdev.h>
|
#include <linux/cdev.h>
|
||||||
|
#include <linux/smp_lock.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/cio.h>
|
#include <asm/cio.h>
|
||||||
|
@ -668,7 +669,7 @@ static int ur_open(struct inode *inode, struct file *file)
|
||||||
|
|
||||||
if (accmode == O_RDWR)
|
if (accmode == O_RDWR)
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
|
lock_kernel();
|
||||||
/*
|
/*
|
||||||
* We treat the minor number as the devno of the ur device
|
* We treat the minor number as the devno of the ur device
|
||||||
* to find in the driver tree.
|
* to find in the driver tree.
|
||||||
|
@ -676,8 +677,10 @@ static int ur_open(struct inode *inode, struct file *file)
|
||||||
devno = MINOR(file->f_dentry->d_inode->i_rdev);
|
devno = MINOR(file->f_dentry->d_inode->i_rdev);
|
||||||
|
|
||||||
urd = urdev_get_from_devno(devno);
|
urd = urdev_get_from_devno(devno);
|
||||||
if (!urd)
|
if (!urd) {
|
||||||
return -ENXIO;
|
rc = -ENXIO;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
spin_lock(&urd->open_lock);
|
spin_lock(&urd->open_lock);
|
||||||
while (urd->open_flag) {
|
while (urd->open_flag) {
|
||||||
|
@ -720,6 +723,7 @@ static int ur_open(struct inode *inode, struct file *file)
|
||||||
goto fail_urfile_free;
|
goto fail_urfile_free;
|
||||||
urf->file_reclen = rc;
|
urf->file_reclen = rc;
|
||||||
file->private_data = urf;
|
file->private_data = urf;
|
||||||
|
unlock_kernel();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail_urfile_free:
|
fail_urfile_free:
|
||||||
|
@ -730,6 +734,8 @@ fail_unlock:
|
||||||
spin_unlock(&urd->open_lock);
|
spin_unlock(&urd->open_lock);
|
||||||
fail_put:
|
fail_put:
|
||||||
urdev_put(urd);
|
urdev_put(urd);
|
||||||
|
out:
|
||||||
|
unlock_kernel();
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user