mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 08:44:21 +08:00
cd354f1ae7
After Al Viro (finally) succeeded in removing the sched.h #include in module.h recently, it makes sense again to remove other superfluous sched.h includes. There are quite a lot of files which include it but don't actually need anything defined in there. Presumably these includes were once needed for macros that used to live in sched.h, but moved to other header files in the course of cleaning it up. To ease the pain, this time I did not fiddle with any header files and only removed #includes from .c-files, which tend to cause less trouble. Compile tested against 2.6.20-rc2 and 2.6.20-rc2-mm2 (with offsets) on alpha, arm, i386, ia64, mips, powerpc, and x86_64 with allnoconfig, defconfig, allmodconfig, and allyesconfig as well as a few randconfigs on x86_64 and all configs in arch/arm/configs on arm. I also checked that no new warnings were introduced by the patch (actually, some warnings are removed that were emitted by unnecessarily included header files). Signed-off-by: Tim Schmielau <tim@physik3.uni-rostock.de> Acked-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
161 lines
3.8 KiB
C
161 lines
3.8 KiB
C
/* net/atm/addr.c - Local ATM address registry */
|
|
|
|
/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
|
|
|
|
#include <linux/atm.h>
|
|
#include <linux/atmdev.h>
|
|
#include <asm/uaccess.h>
|
|
|
|
#include "signaling.h"
|
|
#include "addr.h"
|
|
|
|
static int check_addr(struct sockaddr_atmsvc *addr)
|
|
{
|
|
int i;
|
|
|
|
if (addr->sas_family != AF_ATMSVC)
|
|
return -EAFNOSUPPORT;
|
|
if (!*addr->sas_addr.pub)
|
|
return *addr->sas_addr.prv ? 0 : -EINVAL;
|
|
for (i = 1; i < ATM_E164_LEN + 1; i++) /* make sure it's \0-terminated */
|
|
if (!addr->sas_addr.pub[i])
|
|
return 0;
|
|
return -EINVAL;
|
|
}
|
|
|
|
static int identical(struct sockaddr_atmsvc *a, struct sockaddr_atmsvc *b)
|
|
{
|
|
if (*a->sas_addr.prv)
|
|
if (memcmp(a->sas_addr.prv, b->sas_addr.prv, ATM_ESA_LEN))
|
|
return 0;
|
|
if (!*a->sas_addr.pub)
|
|
return !*b->sas_addr.pub;
|
|
if (!*b->sas_addr.pub)
|
|
return 0;
|
|
return !strcmp(a->sas_addr.pub, b->sas_addr.pub);
|
|
}
|
|
|
|
static void notify_sigd(struct atm_dev *dev)
|
|
{
|
|
struct sockaddr_atmpvc pvc;
|
|
|
|
pvc.sap_addr.itf = dev->number;
|
|
sigd_enq(NULL, as_itf_notify, NULL, &pvc, NULL);
|
|
}
|
|
|
|
void atm_reset_addr(struct atm_dev *dev, enum atm_addr_type_t atype)
|
|
{
|
|
unsigned long flags;
|
|
struct atm_dev_addr *this, *p;
|
|
struct list_head *head;
|
|
|
|
spin_lock_irqsave(&dev->lock, flags);
|
|
if (atype == ATM_ADDR_LECS)
|
|
head = &dev->lecs;
|
|
else
|
|
head = &dev->local;
|
|
list_for_each_entry_safe(this, p, head, entry) {
|
|
list_del(&this->entry);
|
|
kfree(this);
|
|
}
|
|
spin_unlock_irqrestore(&dev->lock, flags);
|
|
if (head == &dev->local)
|
|
notify_sigd(dev);
|
|
}
|
|
|
|
int atm_add_addr(struct atm_dev *dev, struct sockaddr_atmsvc *addr,
|
|
enum atm_addr_type_t atype)
|
|
{
|
|
unsigned long flags;
|
|
struct atm_dev_addr *this;
|
|
struct list_head *head;
|
|
int error;
|
|
|
|
error = check_addr(addr);
|
|
if (error)
|
|
return error;
|
|
spin_lock_irqsave(&dev->lock, flags);
|
|
if (atype == ATM_ADDR_LECS)
|
|
head = &dev->lecs;
|
|
else
|
|
head = &dev->local;
|
|
list_for_each_entry(this, head, entry) {
|
|
if (identical(&this->addr, addr)) {
|
|
spin_unlock_irqrestore(&dev->lock, flags);
|
|
return -EEXIST;
|
|
}
|
|
}
|
|
this = kmalloc(sizeof(struct atm_dev_addr), GFP_ATOMIC);
|
|
if (!this) {
|
|
spin_unlock_irqrestore(&dev->lock, flags);
|
|
return -ENOMEM;
|
|
}
|
|
this->addr = *addr;
|
|
list_add(&this->entry, head);
|
|
spin_unlock_irqrestore(&dev->lock, flags);
|
|
if (head == &dev->local)
|
|
notify_sigd(dev);
|
|
return 0;
|
|
}
|
|
|
|
int atm_del_addr(struct atm_dev *dev, struct sockaddr_atmsvc *addr,
|
|
enum atm_addr_type_t atype)
|
|
{
|
|
unsigned long flags;
|
|
struct atm_dev_addr *this;
|
|
struct list_head *head;
|
|
int error;
|
|
|
|
error = check_addr(addr);
|
|
if (error)
|
|
return error;
|
|
spin_lock_irqsave(&dev->lock, flags);
|
|
if (atype == ATM_ADDR_LECS)
|
|
head = &dev->lecs;
|
|
else
|
|
head = &dev->local;
|
|
list_for_each_entry(this, head, entry) {
|
|
if (identical(&this->addr, addr)) {
|
|
list_del(&this->entry);
|
|
spin_unlock_irqrestore(&dev->lock, flags);
|
|
kfree(this);
|
|
if (head == &dev->local)
|
|
notify_sigd(dev);
|
|
return 0;
|
|
}
|
|
}
|
|
spin_unlock_irqrestore(&dev->lock, flags);
|
|
return -ENOENT;
|
|
}
|
|
|
|
int atm_get_addr(struct atm_dev *dev, struct sockaddr_atmsvc __user * buf,
|
|
size_t size, enum atm_addr_type_t atype)
|
|
{
|
|
unsigned long flags;
|
|
struct atm_dev_addr *this;
|
|
struct list_head *head;
|
|
int total = 0, error;
|
|
struct sockaddr_atmsvc *tmp_buf, *tmp_bufp;
|
|
|
|
spin_lock_irqsave(&dev->lock, flags);
|
|
if (atype == ATM_ADDR_LECS)
|
|
head = &dev->lecs;
|
|
else
|
|
head = &dev->local;
|
|
list_for_each_entry(this, head, entry)
|
|
total += sizeof(struct sockaddr_atmsvc);
|
|
tmp_buf = tmp_bufp = kmalloc(total, GFP_ATOMIC);
|
|
if (!tmp_buf) {
|
|
spin_unlock_irqrestore(&dev->lock, flags);
|
|
return -ENOMEM;
|
|
}
|
|
list_for_each_entry(this, head, entry)
|
|
memcpy(tmp_bufp++, &this->addr, sizeof(struct sockaddr_atmsvc));
|
|
spin_unlock_irqrestore(&dev->lock, flags);
|
|
error = total > size ? -E2BIG : total;
|
|
if (copy_to_user(buf, tmp_buf, total < size ? total : size))
|
|
error = -EFAULT;
|
|
kfree(tmp_buf);
|
|
return error;
|
|
}
|