Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 27922b4260f65d317aabda37e42bbbff > files > 1341

kernel-2.6.18-238.el5.src.rpm

From: Steven Whitehouse <swhiteho@redhat.com>
Date: Tue, 10 Mar 2009 10:02:11 +0000
Subject: [gfs2] merge upstream uevent patches into RHEL 5.4
Message-id: 1236679331.9571.887.camel@quoit
O-Subject: [RHEL 5.4] GFS2: Merge upstream uevent patches into RHEL 5.4
Bugzilla: 476707
RH-Acked-by: Bob Peterson <rpeterso@redhat.com>

Hi,

This does exactly what it says on the tin. We ought to be sending a
proper set of variables with uevent messages to make it easier to
decipher what is going on. Since we don't change any existing strings
which are sent, this is backward compatible with the existing userspace
programs.

This fixes bugzilla: #476707 and has also been upstream for some time.
This has a couple of minor changes due to the uevent API being slightly
different in RHEL.

Steve.

-------------------------------------------------------------------------

diff --git a/fs/gfs2/locking/dlm/mount.c b/fs/gfs2/locking/dlm/mount.c
index 84da1f1..57e132a 100644
--- a/fs/gfs2/locking/dlm/mount.c
+++ b/fs/gfs2/locking/dlm/mount.c
@@ -202,17 +202,25 @@ out:
 static void gdlm_recovery_done(void *lockspace, unsigned int jid,
                                unsigned int message)
 {
+	char env_jid[20];
+	char env_status[20];
+	char *envp[] = { env_jid, env_status, NULL };
 	struct gdlm_ls *ls = lockspace;
 	ls->recover_jid_done = jid;
 	ls->recover_jid_status = message;
-	kobject_uevent(&ls->kobj, KOBJ_CHANGE);
+	sprintf(env_jid, "JID=%d", jid);
+	sprintf(env_status, "RECOVERY=%s",
+		message == LM_RD_SUCCESS ? "Done" : "Failed");
+	kobject_uevent_env(&ls->kobj, KOBJ_CHANGE, envp);
 }
 
 static void gdlm_others_may_mount(void *lockspace)
 {
+	char *message = "FIRSTMOUNT=Done";
+	char *envp[] = { message, NULL };
 	struct gdlm_ls *ls = lockspace;
 	ls->first_done = 1;
-	kobject_uevent(&ls->kobj, KOBJ_CHANGE);
+	kobject_uevent_env(&ls->kobj, KOBJ_CHANGE, envp);
 }
 
 /* Userspace gets the offline uevent, blocks new gfs locks on
diff --git a/fs/gfs2/locking/dlm/sysfs.c b/fs/gfs2/locking/dlm/sysfs.c
index 1373aec..b1b6e63 100644
--- a/fs/gfs2/locking/dlm/sysfs.c
+++ b/fs/gfs2/locking/dlm/sysfs.c
@@ -187,10 +187,13 @@ static struct kobj_type gdlm_ktype = {
 	.sysfs_ops     = &gdlm_attr_ops,
 };
 
+static struct kset_uevent_ops gdlm_uevent_ops;
+
 static struct kset gdlm_kset = {
 	.subsys = &kernel_subsys,
 	.kobj   = {.name = "lock_dlm",},
 	.ktype  = &gdlm_ktype,
+	.uevent_ops = &gdlm_uevent_ops,
 };
 
 int gdlm_kobject_setup(struct gdlm_ls *ls, struct kobject *fskobj)
@@ -219,6 +222,24 @@ void gdlm_kobject_release(struct gdlm_ls *ls)
 	kobject_unregister(&ls->kobj);
 }
 
+static int gdlm_uevent(struct kset *kset, struct kobject *kobj, char **envp,
+		       int num_envp, char *buffer, int buffer_size)
+{
+	struct gdlm_ls *ls = container_of(kobj, struct gdlm_ls, kobj);
+	int index = 0;
+	int length= 0;
+	if (add_uevent_var(envp, num_envp, &index, buffer, buffer_size, &length, "LOCKTABLE=%s:%s", ls->clustername, ls->fsname))
+		return -ENOMEM;
+	if (add_uevent_var(envp, num_envp, &index, buffer, buffer_size, &length, "LOCKPROTO=lock_dlm"))
+		return -ENOMEM;
+	envp[index] = NULL;
+	return 0;
+}
+
+static struct kset_uevent_ops gdlm_uevent_ops = {
+	.uevent = gdlm_uevent,
+};
+
 int gdlm_sysfs_init(void)
 {
 	int error;
@@ -226,7 +247,7 @@ int gdlm_sysfs_init(void)
 	error = kset_register(&gdlm_kset);
 	if (error)
 		printk("lock_dlm: cannot register kset %d\n", error);
-
+	
 	return error;
 }
 
diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c
index e4faab8..7e997cf 100644
--- a/fs/gfs2/sys.c
+++ b/fs/gfs2/sys.c
@@ -222,10 +222,13 @@ static struct kobj_type gfs2_ktype = {
 	.sysfs_ops     = &gfs2_attr_ops,
 };
 
+static struct kset_uevent_ops gfs2_uevent_ops;
+
 static struct kset gfs2_kset = {
 	.subsys = &fs_subsys,
 	.kobj   = {.name = "gfs2"},
 	.ktype  = &gfs2_ktype,
+	.uevent_ops = &gfs2_uevent_ops,
 };
 
 /*
@@ -528,6 +531,24 @@ void gfs2_sys_fs_del(struct gfs2_sbd *sdp)
 	kobject_unregister(&sdp->sd_kobj);
 }
 
+static int gfs2_uevent(struct kset *kset, struct kobject *kobj, char **envp,
+		       int num_envp, char *buffer, int buffer_size)
+{
+	struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
+	int index = 0;
+	int length = 0;
+	if (add_uevent_var(envp, num_envp, &index, buffer, buffer_size, &length, "LOCKTABLE=%s", sdp->sd_table_name))
+		return -ENOMEM;
+	if (add_uevent_var(envp, num_envp, &index, buffer, buffer_size, &length, "LOCKPROTO=%s", sdp->sd_proto_name))
+		return -ENOMEM;
+	envp[index] = NULL;
+	return 0;
+}
+
+static struct kset_uevent_ops gfs2_uevent_ops = {
+	.uevent = gfs2_uevent,
+};
+
 int gfs2_sys_init(void)
 {
 	gfs2_sys_margs = NULL;