Skip to contentSkip to conversation

MTD + 2.6.13/2.6.14 OOPS in class_device_create() fix

PATCH In review Artem B. Bityutskiy 1 participant 2 messages Dec 9, 2005 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 MTD + 2.6.13/2.6.14 OOPS in class_device_create() fix

Hello,

Current MTD CVS head oopses in class_device_create().

This are because there is 2 calls in mtdchar.c which look like this:

class_device_create(mtd_class, NULL, MKDEV(MTD_CHAR_MAJOR, mtd->index*2), NULL, "mtd%d", mtd->index);

This is perfectly fine with 2.6.15-rc5, where class_device_create() has the following prototype:

struct class_device *class_device_create(struct class *cls, struct class_device *parent, dev_t devt, struct device *device, char *fmt, ...)

But it causes oops in 2.6.14.3, where class_device_create() has the following (different) prototype:

struct class_device *class_device_create(struct class *cls, dev_t devt, struct device *device, char *fmt, ...)

I.e., one more argument 'parent' was introduced in 2.6.15-rc5. And since the function accepts any number of arguments, it compiles well, but doesn't work.

Usually problems like this are solved by means of include/linux/mtd/compatmac.h, but in this case I have no idea how to solve this gracefully there.

As 2.6.15 is not yet out and 2.6.14 is still used, I offer the attached hotfix for now.

Signature · 3 lines
Best Regards,
Artem B. Bityutskiy,
St.-Petersburg, Russia.
#1 lore raw
Quoted 1 line · Artem B. Bityutskiy

As 2.6.15 is not yet out and 2.6.14 is still used, I offer the attached hotfix for now.

Pardon, here is the hotfix.

==================================================================

drivers/mtd/mtdchar.c 2005-12-09 18:34:43.000000000 +0300 renamed from drivers/mtd/mtdchar.c 2005-12-09 18:36:24.000000000 +0300 +15 -2
diff --exclude=CVS -auNr mtd-cvs/drivers/mtd/mtdchar.c mtd-fix/drivers/mtd/mtdchar.c
@@ -21,15 +21,28 @@
 
 static struct class *mtd_class;
 
+/*
+ * In 2.6.13 and 2.6.14 kernels class_device_create() had different prototype.
+ * No idea how to fix it in compatmac.h, so this is a hotfix. Must go sometime.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15) && \
+    LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)
+#define mtd_class_device_create(cls, parent, devt, device, fmt, num) \
+               class_device_create(cls, devt, device, fmt, num)
+#else
+#define mtd_class_device_create(cls, parent, devt, device, fmt, num) \
+               class_device_create(cls, parent, devt, device, fmt, num)
+#endif
+
 static void mtd_notify_add(struct mtd_info* mtd)
 {
        if (!mtd)
                return;
 
-       class_device_create(mtd_class, NULL, MKDEV(MTD_CHAR_MAJOR, mtd->index*2),
+       mtd_class_device_create(mtd_class, NULL, MKDEV(MTD_CHAR_MAJOR, mtd->index*2),
                            NULL, "mtd%d", mtd->index);
 
-       class_device_create(mtd_class, NULL,
+       mtd_class_device_create(mtd_class, NULL,
                            MKDEV(MTD_CHAR_MAJOR, mtd->index*2+1),
                            NULL, "mtd%dro", mtd->index);
 }

==================================================================

Signature · 3 lines
Best Regards,
Artem B. Bityutskiy,
St.-Petersburg, Russia.