Date: Wed, 2 Aug 2017 14:26:46 +0200 From: Hans Petter Selasky <hps@selasky.org> To: Konstantin Belousov <kostikbel@gmail.com> Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r321920 - head/sys/sys Message-ID: <abc9271c-0796-ffce-a1b7-d531fbe8c42e@selasky.org> In-Reply-To: <20170802114303.GE1700@kib.kiev.ua> References: <201708021014.v72AEHEk061037@repo.freebsd.org> <7b1d274f-a531-f788-742a-a8375fe76763@selasky.org> <20170802110607.GC1700@kib.kiev.ua> <760e0077-499e-fffb-a86b-979e410b35e1@selasky.org> <20170802111752.GD1700@kib.kiev.ua> <912d42d0-ea07-82ec-e754-f6b6d2b4cc94@selasky.org> <20170802114303.GE1700@kib.kiev.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
On 08/02/17 13:43, Konstantin Belousov wrote: > On Wed, Aug 02, 2017 at 01:27:50PM +0200, Hans Petter Selasky wrote: >> On 08/02/17 13:17, Konstantin Belousov wrote: >>> But y must be dev_t. >> >> Sure, but "struct cdev" 's si_drv0 is only "int" . How can it contain >> dev_t ? > > Why should it contain dev_t ? > Linux KPI abused that field it seems. > Hi, The LinuxKPI uses si_drv0 to contain the output from mkdev(). Before the mkdev() function would fit into 32-bits. Now it is 64-bits. I can fix the LinuxKPI bits this time. We can store this information in si_drv1->xxx instead of using si_drv0 and dev2unit(). > Lets change the focus of the discussion. > You cited the > struct linux_cdev * > linux_find_cdev(const char *name, unsigned major, unsigned minor) > function which finds cdev (or some mockup of the native cdev) by major/minor. > Where does these major/minor numbers come from ? The major number is in the range 0..255 and decides the type of device. The minor number is in the range 0..255 aswell typically and defines a unique number for each LinuxKPI created character device. > I mean that if they are contructed as major(struct stat.st_rdev) and > minor(struct stat.st_rdev), then even the original code looks wrong > without the ino64 addition. Since devfs reports the internal inode > number into st_rdev, which formally is not accessible outside the devfs > filesystem. So should the code for linux_find_cdev() changed to match > cdevs against inode number ? These numbers do not come from any user-visible files. They are just used internally in the kernel to pass around information. > cdp_inode is serially generated so on real machine it is really a small > number for any /dev node. You can watch that by ls -l /dev. Sure. > While at it, I found that contrib/mknod/pack_dev.c, still has hardcoded references to the old makedev(): > contrib/mknod/pack_dev.c:#define makedev_freebsd(x,y) ((portdev_t)((((x) << 8) & 0x0000ff00) | \ > contrib/mknod/pack_dev.c: dev = makedev_freebsd(numbers[0], numbers[1]); Same goes for: contrib/libarchive/libarchive/archive_pack_dev.c And if you "grep -r makedev /usr/src" you'll find more. --HPS
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?abc9271c-0796-ffce-a1b7-d531fbe8c42e>