w1: have netlink search update kernel list
authorDavid Fries <David@Fries.net>
Thu, 26 May 2011 23:26:03 +0000 (16:26 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 27 May 2011 00:12:38 +0000 (17:12 -0700)
Reorganize so the netlink connector one wire search command will update
the kernel list of detected slave devices.  Otherwise, a newly detected
device is unusable because unless it's in the kernel list of known devices
any commands will result in ENODEV status.

Signed-off-by: David Fries <David@Fries.net>
Cc: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/w1/w1.c
drivers/w1/w1.h
drivers/w1/w1_netlink.c

index b7b5014ff7140262cbbcbe32d9530cb2936105e3..10606c822756a3c7ab9ba6de5923a263dab67150 100644 (file)
@@ -827,7 +827,7 @@ void w1_reconnect_slaves(struct w1_family *f, int attach)
        mutex_unlock(&w1_mlock);
 }
 
-static void w1_slave_found(struct w1_master *dev, u64 rn)
+void w1_slave_found(struct w1_master *dev, u64 rn)
 {
        struct w1_slave *sl;
        struct w1_reg_num *tmp;
@@ -933,14 +933,15 @@ void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb
        }
 }
 
-void w1_search_process(struct w1_master *dev, u8 search_type)
+void w1_search_process_cb(struct w1_master *dev, u8 search_type,
+       w1_slave_found_callback cb)
 {
        struct w1_slave *sl, *sln;
 
        list_for_each_entry(sl, &dev->slist, w1_slave_entry)
                clear_bit(W1_SLAVE_ACTIVE, (long *)&sl->flags);
 
-       w1_search_devices(dev, search_type, w1_slave_found);
+       w1_search_devices(dev, search_type, cb);
 
        list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) {
                if (!test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags) && !--sl->ttl)
@@ -953,6 +954,11 @@ void w1_search_process(struct w1_master *dev, u8 search_type)
                dev->search_count--;
 }
 
+static void w1_search_process(struct w1_master *dev, u8 search_type)
+{
+       w1_search_process_cb(dev, search_type, w1_slave_found);
+}
+
 int w1_process(void *data)
 {
        struct w1_master *dev = (struct w1_master *) data;
index f804eba89b7b325715f6c95762ef5f1b4343a507..1ce23fc6186c36def2f0ed2608fb0b010ab32501 100644 (file)
@@ -194,7 +194,9 @@ void w1_destroy_master_attributes(struct w1_master *master);
 void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb);
 void w1_search_devices(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb);
 struct w1_slave *w1_search_slave(struct w1_reg_num *id);
-void w1_search_process(struct w1_master *dev, u8 search_type);
+void w1_slave_found(struct w1_master *dev, u64 rn);
+void w1_search_process_cb(struct w1_master *dev, u8 search_type,
+       w1_slave_found_callback cb);
 struct w1_master *w1_search_master_id(u32 id);
 
 /* Disconnect and reconnect devices in the given family.  Used for finding
index 7e667bc77ef2d02649fbe32cd69b4ab94e06e9f6..55aabd927c60557e82c01a3eb11d92cd9bcd18c1 100644 (file)
@@ -55,6 +55,9 @@ static void w1_send_slave(struct w1_master *dev, u64 rn)
        struct w1_netlink_cmd *cmd = (struct w1_netlink_cmd *)(hdr + 1);
        int avail;
 
+       /* update kernel slave list */
+       w1_slave_found(dev, rn);
+
        avail = dev->priv_size - cmd->len;
 
        if (avail > 8) {
@@ -85,7 +88,7 @@ static int w1_process_search_command(struct w1_master *dev, struct cn_msg *msg,
        dev->priv = msg;
        dev->priv_size = avail;
 
-       w1_search_devices(dev, search_type, w1_send_slave);
+       w1_search_process_cb(dev, search_type, w1_send_slave);
 
        msg->ack = 0;
        cn_netlink_send(msg, 0, GFP_KERNEL);