[2/8] Staging: batman-adv: don't lock while sending packets

Message ID 1266592691-13090-2-git-send-email-andrew@lunn.ch (mailing list archive)
State Not Applicable, archived
Headers

Commit Message

Andrew Lunn Feb. 19, 2010, 3:18 p.m. UTC
  From: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>

As in other parts of batman-adv, we should not lock while sending a packet but
keep the lock held for as short as possible. Additionally, we should check
whether the interface is active, otherwise batman_if->net_dev might not be
available ...

Signed-off-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
Acked-by: Marek Lindner <lindner_marek@yahoo.de>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
 drivers/staging/batman-adv/device.c |   13 ++++++++++---
 1 files changed, 10 insertions(+), 3 deletions(-)
  

Patch

diff --git a/drivers/staging/batman-adv/device.c b/drivers/staging/batman-adv/device.c
index a3e7429..451898c 100644
--- a/drivers/staging/batman-adv/device.c
+++ b/drivers/staging/batman-adv/device.c
@@ -25,6 +25,7 @@ 
 #include "send.h"
 #include "types.h"
 #include "hash.h"
+#include "hard-interface.h"
 
 static struct class *batman_class;
 
@@ -206,6 +207,7 @@  ssize_t bat_device_write(struct file *file, const char __user *buff,
 	struct icmp_packet icmp_packet;
 	struct orig_node *orig_node;
 	struct batman_if *batman_if;
+	uint8_t dstaddr[ETH_ALEN];
 	unsigned long flags;
 
 	if (len < sizeof(struct icmp_packet)) {
@@ -251,9 +253,15 @@  ssize_t bat_device_write(struct file *file, const char __user *buff,
 		goto unlock;
 
 	batman_if = orig_node->batman_if;
+	memcpy(dstaddr, orig_node->router->addr, ETH_ALEN);
+
+	spin_unlock_irqrestore(&orig_hash_lock, flags);
 
 	if (!batman_if)
-		goto unlock;
+		goto dst_unreach;
+
+	if (batman_if->if_active != IF_ACTIVE)
+		goto dst_unreach;
 
 	memcpy(icmp_packet.orig,
 	       batman_if->net_dev->dev_addr,
@@ -261,9 +269,8 @@  ssize_t bat_device_write(struct file *file, const char __user *buff,
 
 	send_raw_packet((unsigned char *)&icmp_packet,
 			sizeof(struct icmp_packet),
-			batman_if, orig_node->router->addr);
+			batman_if, dstaddr);
 
-	spin_unlock_irqrestore(&orig_hash_lock, flags);
 	goto out;
 
 unlock: