Date: Mon, 26 Dec 2016 10:38:30 +0100 From: Michal Meloun <melounmichal@gmail.com> To: Hans Petter Selasky <hselasky@FreeBSD.org>, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r310559 - in head/sys/compat/linuxkpi/common: include/linux src Message-ID: <eb3ae7ea-0881-d76f-788e-c200aa22fc45@freebsd.org> In-Reply-To: <201612260118.uBQ1I8Dm015288@repo.freebsd.org> References: <201612260118.uBQ1I8Dm015288@repo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 26.12.2016 2:18, Hans Petter Selasky wrote: > Author: hselasky > Date: Mon Dec 26 01:18:07 2016 > New Revision: 310559 > URL: https://svnweb.freebsd.org/changeset/base/310559 > > Log: > Implement register and unregister chrdev in the LinuxKPI. > > Obtained from: kmacy @ > 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/src/linux_compat.c > > Modified: head/sys/compat/linuxkpi/common/include/linux/cdev.h > ============================================================================== > --- head/sys/compat/linuxkpi/common/include/linux/cdev.h Sun Dec 25 22:32:16 2016 (r310558) > +++ head/sys/compat/linuxkpi/common/include/linux/cdev.h Mon Dec 26 01:18:07 2016 (r310559) > @@ -95,7 +95,7 @@ cdev_add(struct linux_cdev *cdev, dev_t > args.mda_gid = 0; > args.mda_mode = 0700; > args.mda_si_drv1 = cdev; > - args.mda_unit = MINOR(dev); > + args.mda_unit = dev; > > error = make_dev_s(&args, &cdev->cdev, "%s", > kobject_name(&cdev->kobj)); > @@ -121,7 +121,7 @@ cdev_add_ext(struct linux_cdev *cdev, de > args.mda_gid = gid; > args.mda_mode = mode; > args.mda_si_drv1 = cdev; > - args.mda_unit = MINOR(dev); > + args.mda_unit = dev; > > error = make_dev_s(&args, &cdev->cdev, "%s/%d", > kobject_name(&cdev->kobj), MINOR(dev)); > @@ -142,6 +142,8 @@ cdev_del(struct linux_cdev *cdev) > kobject_put(&cdev->kobj); > } > > +struct linux_cdev *linux_find_cdev(const char *name, unsigned major, unsigned minor); > + > #define cdev linux_cdev > > #endif /* _LINUX_CDEV_H_ */ > > Modified: head/sys/compat/linuxkpi/common/include/linux/fs.h > ============================================================================== > --- head/sys/compat/linuxkpi/common/include/linux/fs.h Sun Dec 25 22:32:16 2016 (r310558) > +++ head/sys/compat/linuxkpi/common/include/linux/fs.h Mon Dec 26 01:18:07 2016 (r310559) > @@ -2,7 +2,7 @@ > * Copyright (c) 2010 Isilon Systems, Inc. > * Copyright (c) 2010 iX Systems, Inc. > * Copyright (c) 2010 Panasas, Inc. > - * Copyright (c) 2013 Mellanox Technologies, Ltd. > + * Copyright (c) 2013-2016 Mellanox Technologies, Ltd. > * All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > @@ -151,6 +151,39 @@ struct file_operations { > #define FMODE_WRITE FWRITE > #define FMODE_EXEC FEXEC > > +int __register_chrdev(unsigned int major, unsigned int baseminor, > + unsigned int count, const char *name, > + const struct file_operations *fops); > +int __register_chrdev_p(unsigned int major, unsigned int baseminor, > + unsigned int count, const char *name, > + const struct file_operations *fops, uid_t uid, > + gid_t gid, int mode); > +void __unregister_chrdev(unsigned int major, unsigned int baseminor, > + unsigned int count, const char *name); > + > +static inline void > +unregister_chrdev(unsigned int major, const char *name) > +{ > + > + __unregister_chrdev(major, 0, 256, name); > +} > + > +static inline int > +register_chrdev(unsigned int major, const char *name, > + const struct file_operations *fops) > +{ > + > + return (__register_chrdev(major, 0, 256, name, fops)); > +} > + > +static inline int > +register_chrdev_p(unsigned int major, const char *name, > + const struct file_operations *fops, uid_t uid, gid_t gid, int mode) > +{ > + > + return (__register_chrdev_p(major, 0, 256, name, fops, uid, gid, mode)); > +} > + > static inline int > register_chrdev_region(dev_t dev, unsigned range, const char *name) > { > @@ -184,7 +217,7 @@ static inline dev_t > iminor(struct inode *inode) > { > > - return dev2unit(inode->v_rdev); > + return (MINOR(dev2unit(inode->v_rdev))); This breaks many kernels: --- all_subdir_ibcore --- In file included from /usr2/Meloun/svn/src/sys/modules/ibcore/../../ofed/drivers/infiniband/core/ucma.c:34: In file included from /usr2/Meloun/svn/src/sys/modules/ibcore/../../compat/linuxkpi/common/include/linux/file.h:41: /usr2/Meloun/svn/src/sys/modules/ibcore/../../compat/linuxkpi/common/include/linux/fs.h:220:10: error: implicit declaration of function 'MINOR' is invalid in C99 [-Werror,-Wimplicit-function-declaration] return (MINOR(dev2unit(inode->v_rdev))); ^ > } > > static inline struct inode * > > Modified: head/sys/compat/linuxkpi/common/src/linux_compat.c > ============================================================================== > --- head/sys/compat/linuxkpi/common/src/linux_compat.c Sun Dec 25 22:32:16 2016 (r310558) > +++ head/sys/compat/linuxkpi/common/src/linux_compat.c Mon Dec 26 01:18:07 2016 (r310559) > @@ -1418,6 +1418,82 @@ linux_irq_handler(void *ent) > irqe->handler(irqe->irq, irqe->arg); > } > > +struct linux_cdev * > +linux_find_cdev(const char *name, unsigned major, unsigned minor) > +{ > + int unit = 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 && > + strcmp(kobject_name(&ldev->kobj), name) == 0) { > + break; > + } > + } > + dev_unlock(); > + > + return (cdev != NULL ? cdev->si_drv1 : NULL); > +} > + > +int > +__register_chrdev(unsigned int major, unsigned int baseminor, > + unsigned int count, const char *name, > + const struct file_operations *fops) > +{ > + struct linux_cdev *cdev; > + int ret = 0; > + int i; > + > + for (i = baseminor; i < baseminor + count; i++) { > + cdev = cdev_alloc(); > + cdev_init(cdev, fops); > + kobject_set_name(&cdev->kobj, name); > + > + ret = cdev_add(cdev, makedev(major, i), 1); > + if (ret != 0) > + break; > + } > + return (ret); > +} > + > +int > +__register_chrdev_p(unsigned int major, unsigned int baseminor, > + unsigned int count, const char *name, > + const struct file_operations *fops, uid_t uid, > + gid_t gid, int mode) > +{ > + struct linux_cdev *cdev; > + int ret = 0; > + int i; > + > + for (i = baseminor; i < baseminor + count; i++) { > + cdev = cdev_alloc(); > + cdev_init(cdev, fops); > + kobject_set_name(&cdev->kobj, name); > + > + ret = cdev_add_ext(cdev, makedev(major, i), uid, gid, mode); > + if (ret != 0) > + break; > + } > + return (ret); > +} > + > +void > +__unregister_chrdev(unsigned int major, unsigned int baseminor, > + unsigned int count, const char *name) > +{ > + struct linux_cdev *cdevp; > + int i; > + > + for (i = baseminor; i < baseminor + count; i++) { > + cdevp = linux_find_cdev(name, major, i); > + if (cdevp != NULL) > + cdev_del(cdevp); > + } > +} > + > #if defined(__i386__) || defined(__amd64__) > bool linux_cpu_has_clflush; > #endif >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?eb3ae7ea-0881-d76f-788e-c200aa22fc45>