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: