Moving from FreeBSD7 to FreeBSD8 (cdev, minor, dev2unit)
Dmitry Krivenok
krivenok.dmitry at gmail.com
Fri May 7 08:59:23 UTC 2010
Hello Hackers,
I'm working on porting some kernel modules written for FreeBSD7 to FreeBSD8.
Some of these modules contain the following code:
struct cdev *dev;
...
int dev_num = minor(dev);
This code doesn't compile on FreeBSD8.
I found that in FreeBSD7 minor() was defined as follows:
515 int
516 minor(struct cdev *x)
517 {
518 if (x == NULL)
519 return NODEV;
520 return(x->si_drv0 & MAXMINOR);
521 }
where MAXMINOR was defined as
236 #define MAXMINOR 0xffff00ffU
But in FreeBSD8 minor() is defined as macro that takes integer as a parameter:
323 #define minor(x) ((int)((x)&0xffff00ff)) /* minor number */
I also found that FreeBSD8 provides dev2unit macro:
276 #define dev2unit(d) ((d)->si_drv0)
It looks like dev2unit is exactly what I need to fix compilation issue.
I changed the code of all modules as follows:
- int dev_num = minor(dev);
+ int dev_num = minor(dev2unit(dev));
and now it compiles and works well.
Is this the proper way of solving the problem?
Thanks in advance!
--
Sincerely yours, Dmitry V. Krivenok
e-mail: krivenok.dmitry at gmail.com
skype: krivenok_dmitry
jabber: krivenok_dmitry at jabber.ru
icq: 242-526-443
More information about the freebsd-hackers
mailing list