diff options
author | David Fries <david@fries.net> | 2008-10-16 01:04:50 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-16 14:21:50 -0400 |
commit | 07e003417b88deac4b887c98f499fc3b01bc8df0 (patch) | |
tree | 2b5ea6b20ec8c456fcb686f13c3607cfcd15e8ff | |
parent | eba3b06da4bd8b79fe6c8ed922a319362c1a40c0 (diff) |
W1: w1_slave_read_id read bug, use device_attribute
Fix bug reading the id sysfs file. If less than the full 8 bytes were
read, the next read would start at the first byte instead of continuing.
It needed the offset added to memcpy, or the better solution was to
replace it with the device attribute instead of bin attribute.
Signed-off-by: David Fries <david@fries.net>
Signed-off-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | drivers/w1/w1.c | 35 |
1 files changed, 10 insertions, 25 deletions
diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index b1b21df835f5..04e7de4b266a 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c | |||
@@ -103,35 +103,20 @@ static ssize_t w1_slave_read_name(struct device *dev, struct device_attribute *a | |||
103 | return sprintf(buf, "%s\n", sl->name); | 103 | return sprintf(buf, "%s\n", sl->name); |
104 | } | 104 | } |
105 | 105 | ||
106 | static ssize_t w1_slave_read_id(struct kobject *kobj, | 106 | static ssize_t w1_slave_read_id(struct device *dev, |
107 | struct bin_attribute *bin_attr, | 107 | struct device_attribute *attr, char *buf) |
108 | char *buf, loff_t off, size_t count) | ||
109 | { | 108 | { |
110 | struct w1_slave *sl = kobj_to_w1_slave(kobj); | 109 | struct w1_slave *sl = dev_to_w1_slave(dev); |
111 | 110 | ssize_t count = sizeof(sl->reg_num); | |
112 | if (off > 8) { | ||
113 | count = 0; | ||
114 | } else { | ||
115 | if (off + count > 8) | ||
116 | count = 8 - off; | ||
117 | |||
118 | memcpy(buf, (u8 *)&sl->reg_num, count); | ||
119 | } | ||
120 | 111 | ||
112 | memcpy(buf, (u8 *)&sl->reg_num, count); | ||
121 | return count; | 113 | return count; |
122 | } | 114 | } |
123 | 115 | ||
124 | static struct device_attribute w1_slave_attr_name = | 116 | static struct device_attribute w1_slave_attr_name = |
125 | __ATTR(name, S_IRUGO, w1_slave_read_name, NULL); | 117 | __ATTR(name, S_IRUGO, w1_slave_read_name, NULL); |
126 | 118 | static struct device_attribute w1_slave_attr_id = | |
127 | static struct bin_attribute w1_slave_attr_bin_id = { | 119 | __ATTR(id, S_IRUGO, w1_slave_read_id, NULL); |
128 | .attr = { | ||
129 | .name = "id", | ||
130 | .mode = S_IRUGO, | ||
131 | }, | ||
132 | .size = 8, | ||
133 | .read = w1_slave_read_id, | ||
134 | }; | ||
135 | 120 | ||
136 | /* Default family */ | 121 | /* Default family */ |
137 | 122 | ||
@@ -650,7 +635,7 @@ static int __w1_attach_slave_device(struct w1_slave *sl) | |||
650 | } | 635 | } |
651 | 636 | ||
652 | /* Create "id" entry */ | 637 | /* Create "id" entry */ |
653 | err = sysfs_create_bin_file(&sl->dev.kobj, &w1_slave_attr_bin_id); | 638 | err = device_create_file(&sl->dev, &w1_slave_attr_id); |
654 | if (err < 0) { | 639 | if (err < 0) { |
655 | dev_err(&sl->dev, | 640 | dev_err(&sl->dev, |
656 | "sysfs file creation for [%s] failed. err=%d\n", | 641 | "sysfs file creation for [%s] failed. err=%d\n", |
@@ -672,7 +657,7 @@ static int __w1_attach_slave_device(struct w1_slave *sl) | |||
672 | return 0; | 657 | return 0; |
673 | 658 | ||
674 | out_rem2: | 659 | out_rem2: |
675 | sysfs_remove_bin_file(&sl->dev.kobj, &w1_slave_attr_bin_id); | 660 | device_remove_file(&sl->dev, &w1_slave_attr_id); |
676 | out_rem1: | 661 | out_rem1: |
677 | device_remove_file(&sl->dev, &w1_slave_attr_name); | 662 | device_remove_file(&sl->dev, &w1_slave_attr_name); |
678 | out_unreg: | 663 | out_unreg: |
@@ -754,7 +739,7 @@ void w1_slave_detach(struct w1_slave *sl) | |||
754 | msg.type = W1_SLAVE_REMOVE; | 739 | msg.type = W1_SLAVE_REMOVE; |
755 | w1_netlink_send(sl->master, &msg); | 740 | w1_netlink_send(sl->master, &msg); |
756 | 741 | ||
757 | sysfs_remove_bin_file(&sl->dev.kobj, &w1_slave_attr_bin_id); | 742 | device_remove_file(&sl->dev, &w1_slave_attr_id); |
758 | device_remove_file(&sl->dev, &w1_slave_attr_name); | 743 | device_remove_file(&sl->dev, &w1_slave_attr_name); |
759 | device_unregister(&sl->dev); | 744 | device_unregister(&sl->dev); |
760 | 745 | ||