[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#411787: redhat-cluster-modules-2.6.18-3-686: GFS Oops on mount at do_add_mount



I've attached a patch for this, posted on the Redhat Cluster list here:

https://www.redhat.com/archives/linux-cluster/2007-February/msg00021.html

This will *not* be fixed upstream; instead, they have elected to update the code to work properly with 2.6.20. It would be great if this could still be included in the Debian sources, however.

------------------------------------------------------------------------
| nate carlson | natecars@natecarlson.com | http://www.natecarlson.com |
|       depriving some poor village of its idiot since 1981            |
------------------------------------------------------------------------
--- cluster_GFS1.orig/gfs-kernel/src/gfs/ops_fstype.c	2006-06-29 20:50:41.000000000 +0400
+++ cluster_GFS1.patched/gfs-kernel/src/gfs/ops_fstype.c	2007-02-05 14:30:03.529125388 +0300
@@ -20,6 +20,7 @@
 #include <linux/buffer_head.h>
 #include <linux/vmalloc.h>
 #include <linux/blkdev.h>
+#include <linux/version.h>
 
 #include "gfs.h"
 #include "daemon.h"
@@ -679,9 +680,15 @@
  * Returns: the new superblock
  */
 
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17)
 struct super_block *
 gfs_get_sb(struct file_system_type *fs_type, int flags,
-	   const char *dev_name, void *data)
+				const char *dev_name, void *data)
+#else
+static int
+gfs_get_sb(struct file_system_type *fs_type, int flags,
+				const char *dev_name, void *data, struct vfsmount *mnt)
+#endif
 {
 	struct block_device *real, *diaper;
 	struct super_block *sb;
@@ -689,12 +696,20 @@
 
 	real = open_bdev_excl(dev_name, flags, fs_type);
 	if (IS_ERR(real))
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17)
 		return (struct super_block *)real;
+#else
+		return real;
+#endif
 
 	diaper = gfs_diaper_get(real, flags);
 	if (IS_ERR(diaper)) {
 		close_bdev_excl(real);
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17)
 		return (struct super_block *)diaper;
+#else
+		return diaper;
+#endif
 	}
 
 	mutex_lock(&diaper->bd_mount_mutex);
@@ -725,7 +740,11 @@
 			sb->s_flags |= MS_ACTIVE;
 	}
 
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17)
 	return sb;
+#else
+	return simple_set_mnt(mnt, sb);
+#endif
 
  out:
 	gfs_diaper_put(diaper);
--- cluster_GFS1.orig/gfs-kernel/src/gfs/ops_super.c	2006-02-16 01:49:19.000000000 +0300
+++ cluster_GFS1.patched/gfs-kernel/src/gfs/ops_super.c	2007-02-05 13:25:10.693313312 +0300
@@ -22,6 +22,7 @@
 #include <linux/statfs.h>
 #include <linux/seq_file.h>
 #include <linux/mount.h>
+#include <linux/version.h>
 
 #include "gfs.h"
 #include "dio.h"
@@ -275,9 +276,15 @@
  */
 
 static int
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17)
 gfs_statfs(struct super_block *sb, struct kstatfs *buf)
 {
 	struct gfs_sbd *sdp = get_v2sdp(sb);
+#else
+gfs_statfs(struct dentry *dentry, struct kstatfs *buf)
+{
+	struct gfs_sbd *sdp = get_v2sdp(dentry->d_sb);
+#endif
 	struct gfs_stat_gfs sg;
 	int error;
 
--- cluster_GFS1.orig/gnbd-kernel/src/gnbd.c	2006-07-12 21:34:29.000000000 +0400
+++ cluster_GFS1.patched/gnbd-kernel/src/gnbd.c	2007-02-05 13:29:37.854009811 +0300
@@ -30,7 +30,11 @@
 #include <linux/buffer_head.h>
 #include <linux/miscdevice.h>
 #include <linux/moduleparam.h>
-#include <linux/devfs_fs_kernel.h>
+#include <linux/version.h>
+
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17)
+	#include <linux/devfs_fs_kernel.h>
+#endif
 
 #include <asm/uaccess.h>
 #include <asm/types.h>
@@ -843,10 +847,12 @@
 
 static struct miscdevice _gnbd_misc =
 {
-        .minor = MISC_DYNAMIC_MINOR,
-        .name  = "gnbd_ctl",
-        .devfs_name = "gnbd_ctl",
-        .fops = &_gnbd_ctl_fops
+	.minor = MISC_DYNAMIC_MINOR,
+	.name  = "gnbd_ctl",
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17)
+	.devfs_name = "gnbd_ctl",
+#endif
+	.fops = &_gnbd_ctl_fops
 };
 
 /* FIXME -- I should probably do more here */
@@ -926,7 +932,9 @@
 	printk(KERN_INFO "gnbd: registered device at major %d\n", major_nr);
 	dprintk(DBG_INIT, "gnbd: debugflags=0x%x\n", debugflags);
 
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17)
 	devfs_mk_dir("gnbd_minor");
+#endif
 	err = class_register(&gnbd_class);
 	if (err)
 		goto out_unregister;
@@ -982,7 +990,9 @@
 		disk->fops = &gnbd_fops;
 		disk->private_data = &gnbd_dev[i];
 		sprintf(disk->disk_name, "gnbd%d", i);
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17)
 		sprintf(disk->devfs_name, "gnbd_minor/%d", i);
+#endif
 		set_capacity(disk, 0);
 		add_disk(disk);
 		if(sysfs_create_link(&gnbd_dev[i].class_dev.kobj,
@@ -1036,7 +1046,9 @@
 			kfree(gnbd_dev[i].server_name);
 	}
 	class_unregister(&gnbd_class);
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17)
 	devfs_remove("gnbd");
+#endif
 	unregister_blkdev(major_nr, "gnbd");
 	printk(KERN_INFO "gnbd: unregistered device at major %d\n", major_nr);
 }

Reply to: