Esempio n. 1
0
int atm_add_addr(struct atm_dev *dev,struct sockaddr_atmsvc *addr)
{
	unsigned long flags;
	struct atm_dev_addr **walk;
	int error;

	error = check_addr(addr);
	if (error)
		return error;
	spin_lock_irqsave(&dev->lock, flags);
	for (walk = &dev->local; *walk; walk = &(*walk)->next)
		if (identical(&(*walk)->addr,addr)) {
			spin_unlock_irqrestore(&dev->lock, flags);
			return -EEXIST;
		}
	*walk = kmalloc(sizeof(struct atm_dev_addr), GFP_ATOMIC);
	if (!*walk) {
		spin_unlock_irqrestore(&dev->lock, flags);
		return -ENOMEM;
	}
	(*walk)->addr = *addr;
	(*walk)->next = NULL;
	spin_unlock_irqrestore(&dev->lock, flags);
	notify_sigd(dev);
	return 0;
}
Esempio n. 2
0
void atm_reset_addr(struct atm_dev *dev)
{
	struct atm_dev_addr *this;

	down(&local_lock);
	while (dev->local) {
		this = dev->local;
		dev->local = this->next;
		kfree(this);
	}
	up(&local_lock);
	notify_sigd(dev);
}
Esempio n. 3
0
void atm_reset_addr(struct atm_dev *dev)
{
	unsigned long flags;
	struct atm_dev_addr *this;

	spin_lock_irqsave(&dev->lock, flags);
	while (dev->local) {
		this = dev->local;
		dev->local = this->next;
		kfree(this);
	}
	spin_unlock_irqrestore(&dev->lock, flags);
	notify_sigd(dev);
}
Esempio n. 4
0
int atm_del_addr(struct atm_dev *dev,struct sockaddr_atmsvc *addr)
{
	struct atm_dev_addr **walk,*this;
	int error;

	error = check_addr(addr);
	if (error) return error;
	down(&local_lock);
	for (walk = &dev->local; *walk; walk = &(*walk)->next)
		if (identical(&(*walk)->addr,addr)) break;
	if (!*walk) {
		up(&local_lock);
		return -ENOENT;
	}
	this = *walk;
	*walk = this->next;
	kfree(this);
	up(&local_lock);
	notify_sigd(dev);
	return 0;
}
Esempio n. 5
0
int atm_del_addr(struct atm_dev *dev,struct sockaddr_atmsvc *addr)
{
	unsigned long flags;
	struct atm_dev_addr **walk,*this;
	int error;

	error = check_addr(addr);
	if (error)
		return error;
	spin_lock_irqsave(&dev->lock, flags);
	for (walk = &dev->local; *walk; walk = &(*walk)->next)
		if (identical(&(*walk)->addr,addr)) break;
	if (!*walk) {
		spin_unlock_irqrestore(&dev->lock, flags);
		return -ENOENT;
	}
	this = *walk;
	*walk = this->next;
	kfree(this);
	spin_unlock_irqrestore(&dev->lock, flags);
	notify_sigd(dev);
	return 0;
}
Esempio n. 6
0
int atm_add_addr(struct atm_dev *dev,struct sockaddr_atmsvc *addr)
{
	struct atm_dev_addr **walk;
	int error;

	error = check_addr(addr);
	if (error) return error;
	down(&local_lock);
	for (walk = &dev->local; *walk; walk = &(*walk)->next)
		if (identical(&(*walk)->addr,addr)) {
			up(&local_lock);
			return -EEXIST;
		}
	*walk = kmalloc(sizeof(struct atm_dev_addr),GFP_KERNEL);
	if (!*walk) {
		up(&local_lock);
		return -ENOMEM;
	}
	(*walk)->addr = *addr;
	(*walk)->next = NULL;
	up(&local_lock);
	notify_sigd(dev);
	return 0;
}