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;
                }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to