svn commit: r321926 - in head/sys/compat/linuxkpi/common: include/linux src
Hans Petter Selasky
hselasky at FreeBSD.org
Wed Aug 2 14:27:29 UTC 2017
Author: hselasky
Date: Wed Aug 2 14:27:27 2017
New Revision: 321926
URL: https://svnweb.freebsd.org/changeset/base/321926
Log:
Fix LinuxKPI regression after r321920. The mda_unit and si_drv0 fields are not
wide enough to hold the full 64-bit dev_t. Instead use the "dev" field in
the "linux_cdev" structure to store and lookup this value.
While at it remove superfluous use of parenthesis inside the
MAJOR(), MINOR() and MKDEV() macros in the LinuxKPI.
MFC after: 1 week
Sponsored by: Mellanox Technologies
Modified:
head/sys/compat/linuxkpi/common/include/linux/cdev.h
head/sys/compat/linuxkpi/common/include/linux/fs.h
head/sys/compat/linuxkpi/common/include/linux/kdev_t.h
head/sys/compat/linuxkpi/common/src/linux_compat.c
Modified: head/sys/compat/linuxkpi/common/include/linux/cdev.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/cdev.h Wed Aug 2 14:12:47 2017 (r321925)
+++ head/sys/compat/linuxkpi/common/include/linux/cdev.h Wed Aug 2 14:27:27 2017 (r321926)
@@ -95,7 +95,6 @@ cdev_add(struct linux_cdev *cdev, dev_t dev, unsigned
args.mda_gid = 0;
args.mda_mode = 0700;
args.mda_si_drv1 = cdev;
- args.mda_unit = dev;
error = make_dev_s(&args, &cdev->cdev, "%s",
kobject_name(&cdev->kobj));
@@ -121,7 +120,6 @@ cdev_add_ext(struct linux_cdev *cdev, dev_t dev, uid_t
args.mda_gid = gid;
args.mda_mode = mode;
args.mda_si_drv1 = cdev;
- args.mda_unit = dev;
error = make_dev_s(&args, &cdev->cdev, "%s/%d",
kobject_name(&cdev->kobj), MINOR(dev));
Modified: head/sys/compat/linuxkpi/common/include/linux/fs.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/fs.h Wed Aug 2 14:12:47 2017 (r321925)
+++ head/sys/compat/linuxkpi/common/include/linux/fs.h Wed Aug 2 14:27:27 2017 (r321926)
@@ -229,12 +229,8 @@ nonseekable_open(struct inode *inode, struct file *fil
return 0;
}
-static inline dev_t
-iminor(struct inode *inode)
-{
-
- return (minor(dev2unit(inode->v_rdev)));
-}
+extern unsigned int linux_iminor(struct inode *);
+#define iminor(...) linux_iminor(__VA_ARGS__)
static inline struct linux_file *
get_file(struct linux_file *f)
Modified: head/sys/compat/linuxkpi/common/include/linux/kdev_t.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/kdev_t.h Wed Aug 2 14:12:47 2017 (r321925)
+++ head/sys/compat/linuxkpi/common/include/linux/kdev_t.h Wed Aug 2 14:27:27 2017 (r321926)
@@ -33,9 +33,9 @@
#include <sys/types.h>
-#define MAJOR(dev) major((dev))
-#define MINOR(dev) minor((dev))
-#define MKDEV(ma, mi) makedev((ma), (mi))
+#define MAJOR(dev) major(dev)
+#define MINOR(dev) minor(dev)
+#define MKDEV(ma, mi) makedev(ma, mi)
static inline uint16_t
old_encode_dev(dev_t dev)
Modified: head/sys/compat/linuxkpi/common/src/linux_compat.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_compat.c Wed Aug 2 14:12:47 2017 (r321925)
+++ head/sys/compat/linuxkpi/common/src/linux_compat.c Wed Aug 2 14:27:27 2017 (r321926)
@@ -1417,6 +1417,21 @@ linux_file_fill_kinfo(struct file *fp, struct kinfo_fi
return (0);
}
+unsigned int
+linux_iminor(struct inode *inode)
+{
+ struct linux_cdev *ldev;
+
+ if (inode == NULL || inode->v_rdev == NULL ||
+ inode->v_rdev->si_devsw != &linuxcdevsw)
+ return (-1U);
+ ldev = inode->v_rdev->si_drv1;
+ if (ldev == NULL)
+ return (-1U);
+
+ return (minor(ldev->dev));
+}
+
struct fileops linuxfileops = {
.fo_read = linux_file_read,
.fo_write = invfo_rdwr,
@@ -1975,13 +1990,13 @@ linux_in_atomic(void)
struct linux_cdev *
linux_find_cdev(const char *name, unsigned major, unsigned minor)
{
- int unit = MKDEV(major, minor);
+ dev_t dev = MKDEV(major, minor);
struct cdev *cdev;
dev_lock();
LIST_FOREACH(cdev, &linuxcdevsw.d_devs, si_list) {
struct linux_cdev *ldev = cdev->si_drv1;
- if (dev2unit(cdev) == unit &&
+ if (ldev->dev == dev &&
strcmp(kobject_name(&ldev->kobj), name) == 0) {
break;
}
More information about the svn-src-all
mailing list