From: Greg KH Different architectures use different types for dev_t, so it is hard to print dev_t variables out correctly. Quite a lot of code is wrong now, and will continue to be wrong when 64-bit dev_t is merged. Greg's patch introduces a little wrapper function which can be used to safely form a dev_t for printing. I added the format_dev_t function as well, which is needed for direct insertion in a printk statement. 25-akpm/drivers/block/genhd.c | 2 +- 25-akpm/drivers/char/tty_io.c | 2 +- 25-akpm/drivers/i2c/i2c-dev.c | 2 +- 25-akpm/drivers/usb/core/file.c | 2 +- 25-akpm/include/linux/kdev_t.h | 9 +++++++++ 5 files changed, 13 insertions(+), 4 deletions(-) diff -puN drivers/block/genhd.c~dev_t-printing drivers/block/genhd.c --- 25/drivers/block/genhd.c~dev_t-printing Fri Jul 18 13:04:43 2003 +++ 25-akpm/drivers/block/genhd.c Fri Jul 18 13:04:43 2003 @@ -336,7 +336,7 @@ static struct sysfs_ops disk_sysfs_ops = static ssize_t disk_dev_read(struct gendisk * disk, char *page) { dev_t base = MKDEV(disk->major, disk->first_minor); - return sprintf(page, "%04x\n", (unsigned)base); + return print_dev_t(page, base); } static ssize_t disk_range_read(struct gendisk * disk, char *page) { diff -puN drivers/char/tty_io.c~dev_t-printing drivers/char/tty_io.c --- 25/drivers/char/tty_io.c~dev_t-printing Fri Jul 18 13:04:43 2003 +++ 25-akpm/drivers/char/tty_io.c Fri Jul 18 13:04:43 2003 @@ -2106,7 +2106,7 @@ static spinlock_t tty_dev_list_lock = SP static ssize_t show_dev(struct class_device *class_dev, char *buf) { struct tty_dev *tty_dev = to_tty_dev(class_dev); - return sprintf(buf, "%04lx\n", (unsigned long)tty_dev->dev); + return print_dev_t(buf, tty_dev->dev); } static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL); diff -puN drivers/i2c/i2c-dev.c~dev_t-printing drivers/i2c/i2c-dev.c --- 25/drivers/i2c/i2c-dev.c~dev_t-printing Fri Jul 18 13:04:43 2003 +++ 25-akpm/drivers/i2c/i2c-dev.c Fri Jul 18 13:04:43 2003 @@ -118,7 +118,7 @@ static void return_i2c_dev(struct i2c_de static ssize_t show_dev(struct class_device *class_dev, char *buf) { struct i2c_dev *i2c_dev = to_i2c_dev(class_dev); - return sprintf(buf, "%04x\n", MKDEV(I2C_MAJOR, i2c_dev->minor)); + return print_dev_t(buf, MKDEV(I2C_MAJOR, i2c_dev->minor)); } static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL); diff -puN drivers/usb/core/file.c~dev_t-printing drivers/usb/core/file.c --- 25/drivers/usb/core/file.c~dev_t-printing Fri Jul 18 13:04:43 2003 +++ 25-akpm/drivers/usb/core/file.c Fri Jul 18 13:05:24 2003 @@ -93,7 +93,7 @@ static ssize_t show_dev(struct class_dev { struct usb_interface *intf = class_dev_to_usb_interface(class_dev); dev_t dev = MKDEV(USB_MAJOR, intf->minor); - return sprintf(buf, "%04x\n", dev); + return print_dev_t(buf, dev); } static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL); diff -puN include/linux/kdev_t.h~dev_t-printing include/linux/kdev_t.h --- 25/include/linux/kdev_t.h~dev_t-printing Fri Jul 18 13:04:43 2003 +++ 25-akpm/include/linux/kdev_t.h Fri Jul 18 13:04:43 2003 @@ -133,6 +133,15 @@ static inline kdev_t to_kdev_t(int dev) return mk_kdev(MAJOR(dev),MINOR(dev)); } +#define print_dev_t(buffer, dev) \ + sprintf((buffer), "%u:%u\n", MAJOR(dev), MINOR(dev)) + +#define format_dev_t(buffer, dev) \ + ({ \ + sprintf(buffer, "%u:%u", MAJOR(dev), MINOR(dev)); \ + buffer; \ + }) + #else /* __KERNEL__ */ /* _