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

Commit 057e7c7f authored by Jonathan Corbet's avatar Jonathan Corbet
Browse files

infiniband: more BKL pushdown



Be extra-cautious and protect the remaining open() functions.

Signed-off-by: default avatarJonathan Corbet <corbet@lwn.net>
parent 65f37b79
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@
#include <linux/kref.h>
#include <linux/compat.h>
#include <linux/semaphore.h>
#include <linux/smp_lock.h>

#include <asm/uaccess.h>

@@ -783,14 +784,17 @@ static int ib_umad_open(struct inode *inode, struct file *filp)
	struct ib_umad_file *file;
	int ret = 0;

	lock_kernel();
	spin_lock(&port_lock);
	port = umad_port[iminor(inode) - IB_UMAD_MINOR_BASE];
	if (port)
		kref_get(&port->umad_dev->ref);
	spin_unlock(&port_lock);

	if (!port)
	if (!port) {
		unlock_kernel();
		return -ENXIO;
	}

	mutex_lock(&port->file_mutex);

@@ -819,6 +823,7 @@ static int ib_umad_open(struct inode *inode, struct file *filp)

out:
	mutex_unlock(&port->file_mutex);
	unlock_kernel();
	return ret;
}

+7 −2
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@
#include <linux/file.h>
#include <linux/mount.h>
#include <linux/cdev.h>
#include <linux/smp_lock.h>

#include <asm/uaccess.h>

@@ -616,14 +617,17 @@ static int ib_uverbs_open(struct inode *inode, struct file *filp)
	struct ib_uverbs_file *file;
	int ret;

	lock_kernel();
	spin_lock(&map_lock);
	dev = dev_table[iminor(inode) - IB_UVERBS_BASE_MINOR];
	if (dev)
		kref_get(&dev->ref);
	spin_unlock(&map_lock);

	if (!dev)
	if (!dev) {
		unlock_kernel();
		return -ENXIO;
	}

	if (!try_module_get(dev->ib_dev->owner)) {
		ret = -ENODEV;
@@ -644,6 +648,7 @@ static int ib_uverbs_open(struct inode *inode, struct file *filp)

	filp->private_data = file;

	unlock_kernel();
	return 0;

err_module:
@@ -651,7 +656,7 @@ static int ib_uverbs_open(struct inode *inode, struct file *filp)

err:
	kref_put(&dev->ref, ib_uverbs_release_dev);

	unlock_kernel();
	return ret;
}