return 0;
}
-static void
-nosy_start_snoop(struct client *client)
-{
- spin_lock_irq(&client->lynx->client_list_lock);
- list_add_tail(&client->link, &client->lynx->client_list);
- spin_unlock_irq(&client->lynx->client_list_lock);
-}
-
-static void
-nosy_stop_snoop(struct client *client)
-{
- spin_lock_irq(&client->lynx->client_list_lock);
- list_del_init(&client->link);
- spin_unlock_irq(&client->lynx->client_list_lock);
-}
-
-static struct client *
-nosy_add_client(struct pcilynx *lynx)
+static int
+nosy_open(struct inode *inode, struct file *file)
{
+ int minor = iminor(inode);
struct client *client;
+ if (minor > MAX_MINORS || minors[minor] == NULL)
+ return -ENODEV;
+
client = kmalloc(sizeof *client, GFP_KERNEL);
+ if (client == NULL)
+ return -ENOMEM;
+
client->tcode_mask = ~0;
- client->lynx = lynx;
+ client->lynx = minors[minor];
INIT_LIST_HEAD(&client->link);
if (packet_buffer_init(&client->buffer, 128 * 1024) < 0) {
kfree(client);
- debug("Failed to allocate packet buffer\n");
- return NULL;
+ return -ENOMEM;
}
- return client;
-}
+ file->private_data = client;
-static void
-nosy_remove_client(struct client *client)
-{
- nosy_stop_snoop(client);
- packet_buffer_destroy(&client->buffer);
- kfree(client);
+ return 0;
}
static int
-nosy_open(struct inode *inode, struct file *file)
+nosy_release(struct inode *inode, struct file *file)
{
- int minor = iminor(inode);
-
- if (minor > MAX_MINORS || minors[minor] == NULL)
- return -ENODEV;
+ struct client *client = file->private_data;
- file->private_data = nosy_add_client(minors[minor]);
- if (file->private_data == NULL)
- return -ENOMEM;
- else
- return 0;
-}
+ spin_lock_irq(&client->lynx->client_list_lock);
+ list_del_init(&client->link);
+ spin_unlock_irq(&client->lynx->client_list_lock);
-static int
-nosy_release(struct inode *inode, struct file *file)
-{
- nosy_remove_client(file->private_data);
+ packet_buffer_destroy(&client->buffer);
+ kfree(client);
return 0;
}
return 0;
case NOSY_IOC_START:
- nosy_start_snoop(client);
+ spin_lock_irq(client_list_lock);
+ list_add_tail(&client->link, &client->lynx->client_list);
+ spin_unlock_irq(client_list_lock);
+
return 0;
case NOSY_IOC_STOP:
- nosy_stop_snoop(client);
+ spin_lock_irq(client_list_lock);
+ list_del_init(&client->link);
+ spin_unlock_irq(client_list_lock);
+
return 0;
case NOSY_IOC_FILTER:
spin_lock_irq(client_list_lock);
client->tcode_mask = arg;
spin_unlock_irq(client_list_lock);
+
return 0;
default: