[PATCH 11/30] W1: w1_slave_read_id read bug, use device_attribute

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: David Fries
Date: Wednesday, July 30, 2008 - 7:49 pm

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>
---
 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 cd5bd23..3b15c57 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
 	return sprintf(buf, "%s\n", sl->name);
 }
 
-static ssize_t w1_slave_read_id(struct kobject *kobj,
-				struct bin_attribute *bin_attr,
-				char *buf, loff_t off, size_t count)
+static ssize_t w1_slave_read_id(struct device *dev,
+	struct device_attribute *attr, char *buf)
 {
-	struct w1_slave *sl = kobj_to_w1_slave(kobj);
-
-	if (off > 8) {
-		count = 0;
-	} else {
-		if (off + count > 8)
-			count = 8 - off;
-
-		memcpy(buf, (u8 *)&sl->reg_num, count);
-	}
+	struct w1_slave *sl = dev_to_w1_slave(dev);
+	ssize_t count = sizeof(sl->reg_num);
 
+	memcpy(buf, (u8 *)&sl->reg_num, count);
 	return count;
 }
 
 static struct device_attribute w1_slave_attr_name =
 	__ATTR(name, S_IRUGO, w1_slave_read_name, NULL);
-
-static struct bin_attribute w1_slave_attr_bin_id = {
-      .attr = {
-              .name = "id",
-              .mode = S_IRUGO,
-      },
-      .size = 8,
-      .read = w1_slave_read_id,
-};
+static struct device_attribute w1_slave_attr_id =
+	__ATTR(id, S_IRUGO, w1_slave_read_id, NULL);
 
 /* Default family */
 
@@ -649,7 +634,7 @@ static int __w1_attach_slave_device(struct w1_slave *sl)
 	}
 
 	/* Create "id" entry */
-	err = sysfs_create_bin_file(&sl->dev.kobj, &w1_slave_attr_bin_id);
+	err = device_create_file(&sl->dev, &w1_slave_attr_id);
 	if (err < 0) {
 		dev_err(&sl->dev,
 			"sysfs file creation for [%s] failed. err=%d\n",
@@ -671,7 +656,7 @@ static int __w1_attach_slave_device(struct w1_slave *sl)
 	return 0;
 
 out_rem2:
-	sysfs_remove_bin_file(&sl->dev.kobj, &w1_slave_attr_bin_id);
+	device_remove_file(&sl->dev, &w1_slave_attr_id);
 out_rem1:
 	device_remove_file(&sl->dev, &w1_slave_attr_name);
 out_unreg:
@@ -753,7 +738,7 @@ void w1_slave_detach(struct w1_slave *sl)
 	msg.type = W1_SLAVE_REMOVE;
 	w1_netlink_send(sl->master, &msg);
 
-	sysfs_remove_bin_file(&sl->dev.kobj, &w1_slave_attr_bin_id);
+	device_remove_file(&sl->dev, &w1_slave_attr_id);
 	device_remove_file(&sl->dev, &w1_slave_attr_name);
 	device_unregister(&sl->dev);
 
-- 
1.4.4.4
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 2/30] W1: abort search early on on exit, David Fries, (Mon Jul 28, 7:12 pm)
[PATCH 3/30] W1: don't delay search start, David Fries, (Mon Jul 28, 7:13 pm)
[PATCH 4/30] W1: w1_process, block or sleep, David Fries, (Mon Jul 28, 7:14 pm)
[PATCH 8/30] W1: recode w1_slave_found logic, David Fries, (Mon Jul 28, 7:18 pm)
[PATCH 9/30] W1: new module parameter search_count, David Fries, (Mon Jul 28, 7:19 pm)
[PATCH 16/30] W1: w1.c s/printk/dev_dbg/, David Fries, (Mon Jul 28, 7:23 pm)
[PATCH 17/30] W1: w1_io.c reset comments and msleep, David Fries, (Mon Jul 28, 7:24 pm)
[PATCH 18/30] W1: ds1wm.c msleep for reset, David Fries, (Mon Jul 28, 7:24 pm)
[PATCH 19/30] W1: ds2490.c correct print message, David Fries, (Mon Jul 28, 7:25 pm)
[PATCH 22/30] W1: ds2490.c disable bit read and write, David Fries, (Mon Jul 28, 7:25 pm)
[PATCH 24/30] W1: ds2490.c ds_dump_status rework, David Fries, (Mon Jul 28, 7:26 pm)
[PATCH 26/30] W1: ds2490.c reset ds2490 in init, David Fries, (Mon Jul 28, 7:27 pm)
[PATCH 27/30] W1: ds2490.c magic number work, David Fries, (Mon Jul 28, 7:28 pm)
[PATCH 30/30] W1: ds2490.c optimize ds_set_pullup, David Fries, (Mon Jul 28, 7:30 pm)
[PATCH 2/30] W1: abort search early on on exit, David Fries, (Wed Jul 30, 7:48 pm)
[PATCH 3/30] W1: don't delay search start, David Fries, (Wed Jul 30, 7:48 pm)
[PATCH 4/30] W1: w1_process, block or sleep, David Fries, (Wed Jul 30, 7:48 pm)
[PATCH 8/30] W1: recode w1_slave_found logic, David Fries, (Wed Jul 30, 7:48 pm)
[PATCH 9/30] W1: new module parameter search_count, David Fries, (Wed Jul 30, 7:48 pm)
[PATCH 11/30] W1: w1_slave_read_id read bug, use device_at ..., David Fries, (Wed Jul 30, 7:49 pm)
[PATCH 16/30] W1: w1.c s/printk/dev_dbg/, David Fries, (Wed Jul 30, 7:49 pm)
[PATCH 17/30] W1: w1_io.c reset comments and msleep, David Fries, (Wed Jul 30, 7:49 pm)
[PATCH 18/30] W1: ds1wm.c msleep for reset, David Fries, (Wed Jul 30, 7:49 pm)
[PATCH 19/30] W1: ds2490.c correct print message, David Fries, (Wed Jul 30, 7:49 pm)
[PATCH 22/30] W1: ds2490.c disable bit read and write, David Fries, (Wed Jul 30, 7:50 pm)
[PATCH 24/30] W1: ds2490.c ds_dump_status rework, David Fries, (Wed Jul 30, 7:50 pm)
[PATCH 26/30] W1: ds2490.c reset ds2490 in init, David Fries, (Wed Jul 30, 7:50 pm)
[PATCH 27/30] W1: ds2490.c magic number work, David Fries, (Wed Jul 30, 7:50 pm)
[PATCH 30/30] W1: ds2490.c optimize ds_set_pullup, David Fries, (Wed Jul 30, 7:50 pm)