public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [BK PATCH] Driver Core fixes for 2.6.6-rc2
@ 2004-04-22 22:28 Greg KH
  2004-04-22 22:30 ` [PATCH] " Greg KH
  0 siblings, 1 reply; 4+ messages in thread
From: Greg KH @ 2004-04-22 22:28 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel

Hi,

Here are two driver core fixes for 2.6.6-rc2, along with a tipar.c
driver fix.

Please pull from:
	bk://kernel.bkbits.net/gregkh/linux/driver-2.6

thanks,

greg k-h

p.s. I'll send these as patches in response to this email to lkml for
those who want to see them.

 drivers/base/firmware_class.c |    2 +-
 drivers/char/tipar.c          |    2 +-
 drivers/i2c/chips/eeprom.c    |    1 +
 drivers/scsi/qla2xxx/qla_os.c |    2 ++
 fs/sysfs/bin.c                |   16 +++++++++++++---
 fs/sysfs/symlink.c            |    6 +++---
 6 files changed, 21 insertions(+), 8 deletions(-)
-----


<mebrown:michaels-house.net>:
  o sysfs module unload race fix for bin_attributes

Linda Xie:
  o symlink doesn't support kobj name > 20 charaters (KOBJ_NAME_LEN)

Romain Lievin:
  o tipar char driver: wrong timeout value


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH] Driver Core fixes for 2.6.6-rc2
  2004-04-22 22:28 [BK PATCH] Driver Core fixes for 2.6.6-rc2 Greg KH
@ 2004-04-22 22:30 ` Greg KH
  2004-04-22 22:30   ` Greg KH
  0 siblings, 1 reply; 4+ messages in thread
From: Greg KH @ 2004-04-22 22:30 UTC (permalink / raw)
  To: linux-kernel

ChangeSet 1.1927, 2004/04/22 12:19:51-07:00, mebrown@michaels-house.net

[PATCH] sysfs module unload race fix for bin_attributes

 -  Add module locking to sysfs bin_attribute files. Update all in-tree
    users to set module owner.

	Compile tested. booted. stress tests pass:

while true; do modprobe mymod; rmmod mymod; done &
while true; do hexdump -C /sys/path/to/sysfs/binary/file; done


 drivers/base/firmware_class.c |    2 +-
 drivers/i2c/chips/eeprom.c    |    1 +
 drivers/scsi/qla2xxx/qla_os.c |    2 ++
 fs/sysfs/bin.c                |   16 +++++++++++++---
 4 files changed, 17 insertions(+), 4 deletions(-)


diff -Nru a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
--- a/drivers/base/firmware_class.c	Thu Apr 22 15:27:17 2004
+++ b/drivers/base/firmware_class.c	Thu Apr 22 15:27:17 2004
@@ -254,7 +254,7 @@
 	return retval;
 }
 static struct bin_attribute firmware_attr_data_tmpl = {
-	.attr = {.name = "data", .mode = 0644},
+	.attr = {.name = "data", .mode = 0644, .owner = THIS_MODULE},
 	.size = 0,
 	.read = firmware_data_read,
 	.write = firmware_data_write,
diff -Nru a/drivers/i2c/chips/eeprom.c b/drivers/i2c/chips/eeprom.c
--- a/drivers/i2c/chips/eeprom.c	Thu Apr 22 15:27:17 2004
+++ b/drivers/i2c/chips/eeprom.c	Thu Apr 22 15:27:17 2004
@@ -155,6 +155,7 @@
 	.attr = {
 		.name = "eeprom",
 		.mode = S_IRUGO,
+		.owner = THIS_MODULE,
 	},
 	.size = EEPROM_SIZE,
 	.read = eeprom_read,
diff -Nru a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
--- a/drivers/scsi/qla2xxx/qla_os.c	Thu Apr 22 15:27:17 2004
+++ b/drivers/scsi/qla2xxx/qla_os.c	Thu Apr 22 15:27:17 2004
@@ -402,6 +402,7 @@
 	.attr = {
 		.name = "fw_dump",
 		.mode = S_IRUSR | S_IWUSR,
+		.owner = THIS_MODULE,
 	},
 	.size = 0,
 	.read = qla2x00_sysfs_read_fw_dump,
@@ -415,6 +416,7 @@
 	.attr = {
 		.name = "nvram",
 		.mode = S_IRUSR | S_IWUSR,
+		.owner = THIS_MODULE,
 	},
 	.size = sizeof(nvram_t),
 	.read = qla2x00_sysfs_read_nvram,
diff -Nru a/fs/sysfs/bin.c b/fs/sysfs/bin.c
--- a/fs/sysfs/bin.c	Thu Apr 22 15:27:17 2004
+++ b/fs/sysfs/bin.c	Thu Apr 22 15:27:17 2004
@@ -101,19 +101,27 @@
 	if (!kobj || !attr)
 		goto Done;
 
+	/* Grab the module reference for this attribute if we have one */
+	error = -ENODEV;
+	if (!try_module_get(attr->attr.owner)) 
+		goto Done;
+
 	error = -EACCES;
 	if ((file->f_mode & FMODE_WRITE) && !attr->write)
-		goto Done;
+		goto Error;
 	if ((file->f_mode & FMODE_READ) && !attr->read)
-		goto Done;
+		goto Error;
 
 	error = -ENOMEM;
 	file->private_data = kmalloc(PAGE_SIZE, GFP_KERNEL);
 	if (!file->private_data)
-		goto Done;
+		goto Error;
 
 	error = 0;
+    goto Done;
 
+ Error:
+	module_put(attr->attr.owner);
  Done:
 	if (error && kobj)
 		kobject_put(kobj);
@@ -123,10 +131,12 @@
 static int release(struct inode * inode, struct file * file)
 {
 	struct kobject * kobj = file->f_dentry->d_parent->d_fsdata;
+	struct bin_attribute * attr = file->f_dentry->d_fsdata;
 	u8 * buffer = file->private_data;
 
 	if (kobj) 
 		kobject_put(kobj);
+	module_put(attr->attr.owner);
 	kfree(buffer);
 	return 0;
 }


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Driver Core fixes for 2.6.6-rc2
  2004-04-22 22:30 ` [PATCH] " Greg KH
@ 2004-04-22 22:30   ` Greg KH
  2004-04-22 22:30     ` Greg KH
  0 siblings, 1 reply; 4+ messages in thread
From: Greg KH @ 2004-04-22 22:30 UTC (permalink / raw)
  To: linux-kernel

ChangeSet 1.1928, 2004/04/22 14:36:55-07:00, lkml@lievin.net

[PATCH] tipar char driver: wrong timeout value

this patch (2.4 & 2.6) fixes a bug about the timeout value. The formula
used to calculate jiffies from timeout is wrong.
The new formula is ok and takes care of integer computation/rounding.
There is the same bug in the tiglusb.c module which will be fixed by another
patch.


 drivers/char/tipar.c |    2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)


diff -Nru a/drivers/char/tipar.c b/drivers/char/tipar.c
--- a/drivers/char/tipar.c	Thu Apr 22 15:27:12 2004
+++ b/drivers/char/tipar.c	Thu Apr 22 15:27:12 2004
@@ -121,7 +121,7 @@
 
 /* ----- global defines ----------------------------------------------- */
 
-#define START(x) { x=jiffies+HZ/(timeout/10); }
+#define START(x) { x = jiffies + (HZ * timeout) / 10; }
 #define WAIT(x)  { \
   if (time_before((x), jiffies)) return -1; \
   if (need_resched()) schedule(); }


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Driver Core fixes for 2.6.6-rc2
  2004-04-22 22:30   ` Greg KH
@ 2004-04-22 22:30     ` Greg KH
  0 siblings, 0 replies; 4+ messages in thread
From: Greg KH @ 2004-04-22 22:30 UTC (permalink / raw)
  To: linux-kernel

ChangeSet 1.1929, 2004/04/22 15:11:12-07:00, lxiep@us.ibm.com

[PATCH] symlink doesn't support kobj name > 20 charaters (KOBJ_NAME_LEN)

Since symlink.c uses "name" field of a kobj when it calculates the
length,  it gets a wrong value if the kobj's name  has more than 20
charathers.  A correct way to do that is to call kobject_name(kobj)
instead of using kobj->name directly.


 fs/sysfs/symlink.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)


diff -Nru a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c
--- a/fs/sysfs/symlink.c	Thu Apr 22 15:27:07 2004
+++ b/fs/sysfs/symlink.c	Thu Apr 22 15:27:07 2004
@@ -42,7 +42,7 @@
 	struct kobject * p = kobj;
 	int length = 1;
 	do {
-		length += strlen(p->name) + 1;
+		length += strlen(kobject_name(p)) + 1;
 		p = p->parent;
 	} while (p);
 	return length;
@@ -54,11 +54,11 @@
 
 	--length;
 	for (p = kobj; p; p = p->parent) {
-		int cur = strlen(p->name);
+		int cur = strlen(kobject_name(p));
 
 		/* back up enough to print this bus id with '/' */
 		length -= cur;
-		strncpy(buffer + length,p->name,cur);
+		strncpy(buffer + length,kobject_name(p),cur);
 		*(buffer + --length) = '/';
 	}
 }


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2004-04-22 22:33 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-04-22 22:28 [BK PATCH] Driver Core fixes for 2.6.6-rc2 Greg KH
2004-04-22 22:30 ` [PATCH] " Greg KH
2004-04-22 22:30   ` Greg KH
2004-04-22 22:30     ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox