adb: BKL pushdown
Put explicit lock_kernel() calls in adb_open(). The fact that adb_release() already has them suggests this is necessary. Signed-off-by: Jonathan Corbet <corbet@lwn.net>
This commit is contained in:
@@ -644,12 +644,18 @@ do_adb_query(struct adb_request *req)
|
|||||||
static int adb_open(struct inode *inode, struct file *file)
|
static int adb_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct adbdev_state *state;
|
struct adbdev_state *state;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
if (iminor(inode) > 0 || adb_controller == NULL)
|
lock_kernel();
|
||||||
return -ENXIO;
|
if (iminor(inode) > 0 || adb_controller == NULL) {
|
||||||
|
ret = -ENXIO;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
state = kmalloc(sizeof(struct adbdev_state), GFP_KERNEL);
|
state = kmalloc(sizeof(struct adbdev_state), GFP_KERNEL);
|
||||||
if (state == 0)
|
if (state == 0) {
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
file->private_data = state;
|
file->private_data = state;
|
||||||
spin_lock_init(&state->lock);
|
spin_lock_init(&state->lock);
|
||||||
atomic_set(&state->n_pending, 0);
|
atomic_set(&state->n_pending, 0);
|
||||||
@@ -657,7 +663,9 @@ static int adb_open(struct inode *inode, struct file *file)
|
|||||||
init_waitqueue_head(&state->wait_queue);
|
init_waitqueue_head(&state->wait_queue);
|
||||||
state->inuse = 1;
|
state->inuse = 1;
|
||||||
|
|
||||||
return 0;
|
out:
|
||||||
|
unlock_kernel();
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int adb_release(struct inode *inode, struct file *file)
|
static int adb_release(struct inode *inode, struct file *file)
|
||||||
|
Reference in New Issue
Block a user