Skip to contentSkip to conversation

scanlog_init cleanup, minor fixes

PATCH In review Nathan Lynch 2 participants 4 messages Mar 23, 2008 – Mar 26, 2008 PowerPC

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 scanlog_init cleanup, minor fixes

scanlog_init() could use some love.

* properly return -ENODEV if this system doesn't support scan-log-dump
* don't printk if scan-log-dump not present; only older systems have it
* convert from create_proc_entry() to preferred proc_create()
* allocate zeroed data buffer
* fix potential memory leak of ent->data on failed create_proc_entry()
* simplify control flow

---

(not urgent, please consider for 2.6.26)

 arch/powerpc/platforms/pseries/scanlog.c |   37 ++++++++++++++---------------
 1 files changed, 18 insertions(+), 19 deletions(-)
arch/powerpc/platforms/pseries/scanlog.c +18 -19
index 8e1ef16..e5b0ea8 100644
@@ -195,31 +195,30 @@ const struct file_operations scanlog_fops = {
 static int __init scanlog_init(void)
 {
 	struct proc_dir_entry *ent;
+	void *data;
+	int err = -ENOMEM;
 
 	ibm_scan_log_dump = rtas_token("ibm,scan-log-dump");
-	if (ibm_scan_log_dump == RTAS_UNKNOWN_SERVICE) {
-		printk(KERN_ERR "scan-log-dump not implemented on this system\n");
-		return -EIO;
-	}
+	if (ibm_scan_log_dump == RTAS_UNKNOWN_SERVICE)
+		return -ENODEV;
 
-        ent = create_proc_entry("ppc64/rtas/scan-log-dump",  S_IRUSR, NULL);
-	if (ent) {
-		ent->proc_fops = &scanlog_fops;
-		/* Ideally we could allocate a buffer < 4G */
-		ent->data = kmalloc(RTAS_DATA_BUF_SIZE, GFP_KERNEL);
-		if (!ent->data) {
-			printk(KERN_ERR "Failed to allocate a buffer\n");
-			remove_proc_entry("scan-log-dump", ent->parent);
-			return -ENOMEM;
-		}
-		((unsigned int *)ent->data)[0] = 0;
-	} else {
-		printk(KERN_ERR "Failed to create ppc64/scan-log-dump proc entry\n");
-		return -EIO;
-	}
+	/* Ideally we could allocate a buffer < 4G */
+	data = kzalloc(RTAS_DATA_BUF_SIZE, GFP_KERNEL);
+	if (!data)
+		goto err;
+
+	ent = proc_create("ppc64/rtas/scan-log-dump", S_IRUSR, NULL,
+			  &scanlog_fops);
+	if (!ent)
+		goto err;
+
+	ent->data = data;
 	proc_ppc64_scan_log_dump = ent;
 
 	return 0;
+err:
+	kfree(data);
+	return err;
 }
 
 static void __exit scanlog_cleanup(void)
Signature · 1 line
1.5.4.rc5
#1 lore raw
Quoted 30 lines · Nathan Lynch

scanlog_init() could use some love.

arch/powerpc/platforms/pseries/scanlog.c +4 -13
index 8e1ef16..e5b0ea8 100644
@@ -195,31 +195,30 @@ const struct file_operations scanlog_fops = {
 static int __init scanlog_init(void)
 {
 	struct proc_dir_entry *ent;
+	void *data;
+	int err = -ENOMEM;
 
 	ibm_scan_log_dump = rtas_token("ibm,scan-log-dump");
-	if (ibm_scan_log_dump == RTAS_UNKNOWN_SERVICE) {
-		printk(KERN_ERR "scan-log-dump not implemented on this system\n");
-		return -EIO;
-	}
+	if (ibm_scan_log_dump == RTAS_UNKNOWN_SERVICE)
+		return -ENODEV;
 
-        ent = create_proc_entry("ppc64/rtas/scan-log-dump",  S_IRUSR, NULL);
-	if (ent) {
-		ent->proc_fops = &scanlog_fops;
-		/* Ideally we could allocate a buffer < 4G */
-		ent->data = kmalloc(RTAS_DATA_BUF_SIZE, GFP_KERNEL);
-		if (!ent->data) {
-			printk(KERN_ERR "Failed to allocate a buffer\n");
-			remove_proc_entry("scan-log-dump", ent->parent);
-			return -ENOMEM;

arch/powerpc/platforms/pseries/scanlog.c const struct file_operations scanlog_fops = { · line 208

Quoted 10 lines
arch/powerpc/platforms/pseries/scanlog.c +4 -6
-		}
-		((unsigned int *)ent->data)[0] = 0;
-	} else {
-		printk(KERN_ERR "Failed to create ppc64/scan-log-dump proc entry\n");
-		return -EIO;
-	}
+	/* Ideally we could allocate a buffer < 4G */
+	data = kzalloc(RTAS_DATA_BUF_SIZE, GFP_KERNEL);
+	if (!data)
+		goto err;

Not your bug, but what happens if data is > 4G? Kaboom?

cheers

Signature · 8 lines
Michael Ellerman
OzLabs, IBM Australia Development Lab

wwweb: http://michael.ellerman.id.au
phone: +61 2 6212 1183 (tie line 70 21183)

We do not inherit the earth from our ancestors,
we borrow it from our children. - S.M.A.R.T Person
#2 lore raw
Quoted 6 lines · Michael Ellerman

arch/powerpc/platforms/pseries/scanlog.c const struct file_operations scanlog_fops = { · line 208

Quoted 4 lines
arch/powerpc/platforms/pseries/scanlog.c +4 -0
+	/* Ideally we could allocate a buffer < 4G */
+	data = kzalloc(RTAS_DATA_BUF_SIZE, GFP_KERNEL);
+	if (!data)
+		goto err;

Not your bug, but what happens if data is > 4G? Kaboom?

An old RPA doc (scan-log-dump isn't specified in PAPR) says the buffer should be "contiguous real storage", so... yeah, probably. That's why I preserved the comment. Will fix if I get access to a machine to test this code more thoroughly (plenty of other issues in this file, too).

#3 lore raw
Quoted 8 lines · Nathan Lynch
Quoted 6 lines · Michael Ellerman

arch/powerpc/platforms/pseries/scanlog.c const struct file_operations scanlog_fops = { · line 208

Quoted 4 lines
arch/powerpc/platforms/pseries/scanlog.c +4 -0
+	/* Ideally we could allocate a buffer < 4G */
+	data = kzalloc(RTAS_DATA_BUF_SIZE, GFP_KERNEL);
+	if (!data)
+		goto err;

Not your bug, but what happens if data is > 4G? Kaboom?

Quoted 5 lines

An old RPA doc (scan-log-dump isn't specified in PAPR) says the buffer should be "contiguous real storage", so... yeah, probably. That's why I preserved the comment. Will fix if I get access to a machine to test this code more thoroughly (plenty of other issues in this file, too).

Cool, no point changing it if we can't test it.

cheers

Signature · 8 lines
Michael Ellerman
OzLabs, IBM Australia Development Lab

wwweb: http://michael.ellerman.id.au
phone: +61 2 6212 1183 (tie line 70 21183)

We do not inherit the earth from our ancestors,
we borrow it from our children. - S.M.A.R.T Person