Re: [PATCH] I2C update for 2.6.9

From: Greg KH
Date: Tue Oct 19 2004 - 19:37:01 EST


ChangeSet 1.1939.9.8, 2004/09/29 16:14:12-07:00, johnpol@xxxxxxxxxxx

[PATCH] w1: schedule_timeout() issues.

Need to set current state and check signals.

Signed-off-by: Evgeniy Polyakov <johnpol@xxxxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <greg@xxxxxxxxx>


drivers/w1/dscore.c | 13 ++++++++++---
drivers/w1/w1.c | 20 +++++++++++++++-----
drivers/w1/w1_family.c | 11 +++++++++--
drivers/w1/w1_int.c | 11 +++++++++--
4 files changed, 43 insertions(+), 12 deletions(-)


diff -Nru a/drivers/w1/dscore.c b/drivers/w1/dscore.c
--- a/drivers/w1/dscore.c 2004-10-19 16:54:19 -07:00
+++ b/drivers/w1/dscore.c 2004-10-19 16:54:19 -07:00
@@ -727,11 +727,18 @@
{
struct ds_device *dev;

- dev = usb_get_intfdata (intf);
- usb_set_intfdata (intf, NULL);
+ dev = usb_get_intfdata(intf);
+ usb_set_intfdata(intf, NULL);

- while(atomic_read(&dev->refcnt))
+ while (atomic_read(&dev->refcnt)) {
+ printk(KERN_INFO "Waiting for DS to become free: refcnt=%d.\n",
+ atomic_read(&dev->refcnt));
+ set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(HZ);
+
+ if (signal_pending(current))
+ flush_signals(current);
+ }

usb_put_dev(dev->udev);
kfree(dev);
diff -Nru a/drivers/w1/w1.c b/drivers/w1/w1.c
--- a/drivers/w1/w1.c 2004-10-19 16:54:19 -07:00
+++ b/drivers/w1/w1.c 2004-10-19 16:54:19 -07:00
@@ -449,8 +449,15 @@

dev_info(&sl->dev, "%s: detaching %s.\n", __func__, sl->name);

- while (atomic_read(&sl->refcnt))
- schedule_timeout(10);
+ while (atomic_read(&sl->refcnt)) {
+ printk(KERN_INFO "Waiting for %s to become free: refcnt=%d.\n",
+ sl->name, atomic_read(&sl->refcnt));
+ set_current_state(TASK_INTERRUPTIBLE);
+ schedule_timeout(HZ);
+
+ if (signal_pending(current))
+ flush_signals(current);
+ }

sysfs_remove_bin_file (&sl->dev.kobj, &sl->attr_bin);
device_remove_file(&sl->dev, &sl->attr_name);
@@ -507,8 +514,8 @@
* All who don't sleep must send ID bit and COMPLEMENT ID bit.
* They actually are ANDed between all senders.
*/
- id_bit = w1_read_bit(dev);
- comp_bit = w1_read_bit(dev);
+ id_bit = w1_touch_bit(dev, 1);
+ comp_bit = w1_touch_bit(dev, 1);

if (id_bit && comp_bit)
break;
@@ -539,7 +546,10 @@
* and make all who don't have "search_bit" in "i"'th position
* in it's registration number sleep.
*/
- w1_write_bit(dev, search_bit);
+ if (dev->bus_master->touch_bit)
+ w1_touch_bit(dev, search_bit);
+ else
+ w1_write_bit(dev, search_bit);

}
#endif
diff -Nru a/drivers/w1/w1_family.c b/drivers/w1/w1_family.c
--- a/drivers/w1/w1_family.c 2004-10-19 16:54:19 -07:00
+++ b/drivers/w1/w1_family.c 2004-10-19 16:54:19 -07:00
@@ -84,8 +84,15 @@

spin_unlock(&w1_flock);

- while (atomic_read(&fent->refcnt))
- schedule_timeout(10);
+ while (atomic_read(&fent->refcnt)) {
+ printk(KERN_INFO "Waiting for family %u to become free: refcnt=%d.\n",
+ fent->fid, atomic_read(&fent->refcnt));
+ set_current_state(TASK_INTERRUPTIBLE);
+ schedule_timeout(HZ);
+
+ if (signal_pending(current))
+ flush_signals(current);
+ }
}

/*
diff -Nru a/drivers/w1/w1_int.c b/drivers/w1/w1_int.c
--- a/drivers/w1/w1_int.c 2004-10-19 16:54:19 -07:00
+++ b/drivers/w1/w1_int.c 2004-10-19 16:54:19 -07:00
@@ -181,8 +181,15 @@
"%s: Failed to send signal to w1 kernel thread %d.\n",
__func__, dev->kpid);

- while (atomic_read(&dev->refcnt))
- schedule_timeout(10);
+ while (atomic_read(&dev->refcnt)) {
+ printk(KERN_INFO "Waiting for %s to become free: refcnt=%d.\n",
+ dev->name, atomic_read(&dev->refcnt));
+ set_current_state(TASK_INTERRUPTIBLE);
+ schedule_timeout(HZ);
+
+ if (signal_pending(current))
+ flush_signals(current);
+ }

msg.id.mst.id = dev->id;
msg.id.mst.pid = dev->kpid;

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/