From: Greg KH <greg@kroah.com>

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__ */
 
 /*

_