Commit 55abcf9f authored by David S. Miller's avatar David S. Miller

Merge master.kernel.org:/home/acme/BK/llc-2.5

into nuts.ninka.net:/home/davem/src/BK/net-2.5
parents 6f1fc71c 797ef46b
......@@ -199,13 +199,13 @@ extern void aarp_cleanup_module(void);
#define at_sk(__sk) ((struct atalk_sock *)(__sk)->protinfo)
extern struct sock *atalk_sockets;
extern spinlock_t atalk_sockets_lock;
extern rwlock_t atalk_sockets_lock;
extern struct atalk_route *atalk_routes;
extern rwlock_t atalk_routes_lock;
extern struct atalk_iface *atalk_interfaces;
extern spinlock_t atalk_interfaces_lock;
extern rwlock_t atalk_interfaces_lock;
extern struct atalk_route atrtr_default;
......
......@@ -76,7 +76,7 @@ static struct aarp_entry *proxies[AARP_HASH_SIZE];
static int unresolved_count;
/* One lock protects it all. */
static spinlock_t aarp_lock = SPIN_LOCK_UNLOCKED;
static rwlock_t aarp_lock = RW_LOCK_UNLOCKED;
/* Used to walk the list and purge/kick entries. */
static struct timer_list aarp_timer;
......@@ -97,7 +97,6 @@ static void __aarp_expire(struct aarp_entry *a)
*
* Must run under aarp_lock.
*/
static void __aarp_send_query(struct aarp_entry *a)
{
static unsigned char aarp_eth_multicast[ETH_ALEN] =
......@@ -264,7 +263,6 @@ static void __aarp_expire_timer(struct aarp_entry **n)
*
* Must run under the aarp_lock.
*/
static void __aarp_kick(struct aarp_entry **n)
{
struct aarp_entry *t;
......@@ -287,7 +285,6 @@ static void __aarp_kick(struct aarp_entry **n)
*
* Must run under the aarp_lock.
*/
static void __aarp_expire_device(struct aarp_entry **n, struct net_device *dev)
{
struct aarp_entry *t;
......@@ -306,7 +303,7 @@ static void aarp_expire_timeout(unsigned long unused)
{
int ct;
spin_lock_bh(&aarp_lock);
write_lock_bh(&aarp_lock);
for (ct = 0; ct < AARP_HASH_SIZE; ct++) {
__aarp_expire_timer(&resolved[ct]);
......@@ -315,7 +312,7 @@ static void aarp_expire_timeout(unsigned long unused)
__aarp_expire_timer(&proxies[ct]);
}
spin_unlock_bh(&aarp_lock);
write_unlock_bh(&aarp_lock);
mod_timer(&aarp_timer, jiffies +
(unresolved_count ? sysctl_aarp_tick_time :
sysctl_aarp_expiry_time));
......@@ -328,7 +325,7 @@ static int aarp_device_event(struct notifier_block *this, unsigned long event,
int ct;
if (event == NETDEV_DOWN) {
spin_lock_bh(&aarp_lock);
write_lock_bh(&aarp_lock);
for (ct = 0; ct < AARP_HASH_SIZE; ct++) {
__aarp_expire_device(&resolved[ct], ptr);
......@@ -336,7 +333,7 @@ static int aarp_device_event(struct notifier_block *this, unsigned long event,
__aarp_expire_device(&proxies[ct], ptr);
}
spin_unlock_bh(&aarp_lock);
write_unlock_bh(&aarp_lock);
}
return NOTIFY_DONE;
}
......@@ -345,7 +342,6 @@ static int aarp_device_event(struct notifier_block *this, unsigned long event,
* Create a new aarp entry. This must use GFP_ATOMIC because it
* runs while holding spinlocks.
*/
static struct aarp_entry *aarp_alloc(void)
{
struct aarp_entry *a = kmalloc(sizeof(*a), GFP_ATOMIC);
......@@ -382,13 +378,13 @@ void aarp_proxy_remove(struct net_device *dev, struct atalk_addr *sa)
int hash = sa->s_node % (AARP_HASH_SIZE - 1);
struct aarp_entry *a;
spin_lock_bh(&aarp_lock);
write_lock_bh(&aarp_lock);
a = __aarp_find_entry(proxies[hash], dev, sa);
if (a)
a->expires_at = jiffies - 1;
spin_unlock_bh(&aarp_lock);
write_unlock_bh(&aarp_lock);
}
/* This must run under aarp_lock. */
......@@ -476,7 +472,7 @@ int aarp_proxy_probe_network(struct atalk_iface *atif, struct atalk_addr *sa)
entry->target_addr.s_net = sa->s_net;
entry->dev = atif->dev;
spin_lock_bh(&aarp_lock);
write_lock_bh(&aarp_lock);
hash = sa->s_node % (AARP_HASH_SIZE - 1);
entry->next = proxies[hash];
......@@ -487,9 +483,9 @@ int aarp_proxy_probe_network(struct atalk_iface *atif, struct atalk_addr *sa)
/* Defer 1/10th */
current->state = TASK_INTERRUPTIBLE;
spin_unlock_bh(&aarp_lock);
write_unlock_bh(&aarp_lock);
schedule_timeout(HZ / 10);
spin_lock_bh(&aarp_lock);
write_lock_bh(&aarp_lock);
if (entry->status & ATIF_PROBE_FAIL)
break;
......@@ -503,13 +499,13 @@ int aarp_proxy_probe_network(struct atalk_iface *atif, struct atalk_addr *sa)
retval = 1;
}
spin_unlock_bh(&aarp_lock);
write_unlock_bh(&aarp_lock);
out:
return retval;
}
/* Send a DDP frame */
int aarp_send_ddp(struct net_device *dev,struct sk_buff *skb,
int aarp_send_ddp(struct net_device *dev, struct sk_buff *skb,
struct atalk_addr *sa, void *hwaddr)
{
static char ddp_eth_multicast[ETH_ALEN] =
......@@ -534,7 +530,7 @@ int aarp_send_ddp(struct net_device *dev,struct sk_buff *skb,
if ((!ddp->deh_snet || at->s_net == ddp->deh_snet) &&
(!ddp->deh_dnet || at->s_net == ddp->deh_dnet)) {
skb_pull(skb, sizeof(struct ddpehdr) - 4);
skb_pull(skb, sizeof(*ddp) - 4);
/*
* The upper two remaining bytes are the port
......@@ -579,13 +575,13 @@ int aarp_send_ddp(struct net_device *dev,struct sk_buff *skb,
goto sent;
}
spin_lock_bh(&aarp_lock);
write_lock_bh(&aarp_lock);
a = __aarp_find_entry(resolved[hash], dev, sa);
if (a) { /* Return 1 and fill in the address */
a->expires_at = jiffies + (sysctl_aarp_expiry_time * 10);
ddp_dl->request(ddp_dl, skb, a->hwaddr);
spin_unlock_bh(&aarp_lock);
write_unlock_bh(&aarp_lock);
goto sent;
}
......@@ -600,7 +596,7 @@ int aarp_send_ddp(struct net_device *dev,struct sk_buff *skb,
a = aarp_alloc();
if (!a) {
/* Whoops slipped... good job it's an unreliable protocol 8) */
spin_unlock_bh(&aarp_lock);
write_unlock_bh(&aarp_lock);
return -1;
}
......@@ -627,7 +623,7 @@ int aarp_send_ddp(struct net_device *dev,struct sk_buff *skb,
/* Now finally, it is safe to drop the lock. */
out_unlock:
spin_unlock_bh(&aarp_lock);
write_unlock_bh(&aarp_lock);
/* Tell the ddp layer we have taken over for this frame. */
return 0;
......@@ -723,7 +719,7 @@ static int aarp_rcv(struct sk_buff *skb, struct net_device *dev,
da.s_node = ea->pa_dst_node;
da.s_net = ea->pa_dst_net;
spin_lock_bh(&aarp_lock);
write_lock_bh(&aarp_lock);
a = __aarp_find_entry(proxies[hash], dev, &da);
if (a && a->status & ATIF_PROBE) {
......@@ -741,13 +737,13 @@ static int aarp_rcv(struct sk_buff *skb, struct net_device *dev,
break;
/* Find the entry. */
a = __aarp_find_entry(unresolved[hash],dev,&sa);
a = __aarp_find_entry(unresolved[hash], dev, &sa);
if (!a || dev != a->dev)
break;
/* We can fill one in - this is good. */
memcpy(a->hwaddr,ea->hw_src,ETH_ALEN);
__aarp_resolved(&unresolved[hash],a,hash);
memcpy(a->hwaddr, ea->hw_src, ETH_ALEN);
__aarp_resolved(&unresolved[hash], a, hash);
if (!unresolved_count)
mod_timer(&aarp_timer,
jiffies + sysctl_aarp_expiry_time);
......@@ -787,8 +783,9 @@ static int aarp_rcv(struct sk_buff *skb, struct net_device *dev,
* address. So as a precaution flush any
* entries we have for this address.
*/
struct aarp_entry *a = __aarp_find_entry(
resolved[sa.s_node %
struct aarp_entry *a;
a = __aarp_find_entry(resolved[sa.s_node %
(AARP_HASH_SIZE - 1)],
skb->dev, &sa);
......@@ -821,7 +818,7 @@ static int aarp_rcv(struct sk_buff *skb, struct net_device *dev,
}
unlock:
spin_unlock_bh(&aarp_lock);
write_unlock_bh(&aarp_lock);
out1:
ret = 1;
out0:
......@@ -830,7 +827,7 @@ static int aarp_rcv(struct sk_buff *skb, struct net_device *dev,
}
static struct notifier_block aarp_notifier = {
.notifier_call =aarp_device_event,
.notifier_call = aarp_device_event,
};
static unsigned char aarp_snap_id[] = { 0x00, 0x00, 0x00, 0x80, 0xF3 };
......@@ -853,7 +850,7 @@ void aarp_device_down(struct net_device *dev)
{
int ct;
spin_lock_bh(&aarp_lock);
write_lock_bh(&aarp_lock);
for (ct = 0; ct < AARP_HASH_SIZE; ct++) {
__aarp_expire_device(&resolved[ct], dev);
......@@ -861,7 +858,7 @@ void aarp_device_down(struct net_device *dev)
__aarp_expire_device(&proxies[ct], dev);
}
spin_unlock_bh(&aarp_lock);
write_unlock_bh(&aarp_lock);
}
/* Called from proc fs */
......@@ -875,7 +872,7 @@ static int aarp_get_info(char *buffer, char **start, off_t offset, int length)
"address", "device", "hw addr", "last_sent",
"expires");
spin_lock_bh(&aarp_lock);
read_lock_bh(&aarp_lock);
for (ct = 0; ct < AARP_HASH_SIZE; ct++) {
for (entry = resolved[ct]; entry; entry = entry->next) {
......@@ -950,11 +947,10 @@ static int aarp_get_info(char *buffer, char **start, off_t offset, int length)
}
}
spin_unlock_bh(&aarp_lock);
read_unlock_bh(&aarp_lock);
return len;
}
#ifdef MODULE
/* General module cleanup. Called from cleanup_module() in ddp.c. */
void aarp_cleanup_module(void)
{
......@@ -962,7 +958,7 @@ void aarp_cleanup_module(void)
unregister_netdevice_notifier(&aarp_notifier);
unregister_snap_client(aarp_dl);
}
#endif /* MODULE */
#ifdef CONFIG_PROC_FS
void aarp_register_proc_fs(void)
{
......
......@@ -30,7 +30,7 @@ static void *atalk_seq_interface_start(struct seq_file *seq, loff_t *pos)
{
loff_t l = *pos;
spin_lock_bh(&atalk_interfaces_lock);
read_lock_bh(&atalk_interfaces_lock);
return l ? atalk_get_interface_idx(--l) : (void *)1;
}
......@@ -53,7 +53,7 @@ static void *atalk_seq_interface_next(struct seq_file *seq, void *v, loff_t *pos
static void atalk_seq_interface_stop(struct seq_file *seq, void *v)
{
spin_unlock_bh(&atalk_interfaces_lock);
read_unlock_bh(&atalk_interfaces_lock);
}
static int atalk_seq_interface_show(struct seq_file *seq, void *v)
......@@ -154,7 +154,7 @@ static void *atalk_seq_socket_start(struct seq_file *seq, loff_t *pos)
{
loff_t l = *pos;
spin_lock_bh(&atalk_sockets_lock);
read_lock_bh(&atalk_sockets_lock);
return l ? atalk_get_socket_idx(--l) : (void *)1;
}
......@@ -177,7 +177,7 @@ static void *atalk_seq_socket_next(struct seq_file *seq, void *v, loff_t *pos)
static void atalk_seq_socket_stop(struct seq_file *seq, void *v)
{
spin_unlock_bh(&atalk_sockets_lock);
read_unlock_bh(&atalk_sockets_lock);
}
static int atalk_seq_socket_show(struct seq_file *seq, void *v)
......
......@@ -73,10 +73,8 @@ extern int aarp_proxy_probe_network(struct atalk_iface *atif,
struct atalk_addr *sa);
extern void aarp_proxy_remove(struct net_device *dev, struct atalk_addr *sa);
#ifdef CONFIG_SYSCTL
extern inline void atalk_register_sysctl(void);
extern inline void atalk_unregister_sysctl(void);
#endif /* CONFIG_SYSCTL */
extern void atalk_register_sysctl(void);
extern void atalk_unregister_sysctl(void);
struct datalink_proto *ddp_dl, *aarp_dl;
static struct proto_ops atalk_dgram_ops;
......@@ -88,29 +86,29 @@ static struct proto_ops atalk_dgram_ops;
\**************************************************************************/
struct sock *atalk_sockets;
spinlock_t atalk_sockets_lock = SPIN_LOCK_UNLOCKED;
rwlock_t atalk_sockets_lock = RW_LOCK_UNLOCKED;
extern inline void atalk_insert_socket(struct sock *sk)
{
spin_lock_bh(&atalk_sockets_lock);
write_lock_bh(&atalk_sockets_lock);
sk->next = atalk_sockets;
if (sk->next)
atalk_sockets->pprev = &sk->next;
atalk_sockets = sk;
sk->pprev = &atalk_sockets;
spin_unlock_bh(&atalk_sockets_lock);
write_unlock_bh(&atalk_sockets_lock);
}
extern inline void atalk_remove_socket(struct sock *sk)
{
spin_lock_bh(&atalk_sockets_lock);
write_lock_bh(&atalk_sockets_lock);
if (sk->pprev) {
if (sk->next)
sk->next->pprev = sk->pprev;
*sk->pprev = sk->next;
sk->pprev = NULL;
}
spin_unlock_bh(&atalk_sockets_lock);
write_unlock_bh(&atalk_sockets_lock);
}
static struct sock *atalk_search_socket(struct sockaddr_at *to,
......@@ -118,7 +116,7 @@ static struct sock *atalk_search_socket(struct sockaddr_at *to,
{
struct sock *s;
spin_lock_bh(&atalk_sockets_lock);
read_lock_bh(&atalk_sockets_lock);
for (s = atalk_sockets; s; s = s->next) {
struct atalk_sock *at = at_sk(s);
......@@ -145,7 +143,7 @@ static struct sock *atalk_search_socket(struct sockaddr_at *to,
break;
}
}
spin_unlock_bh(&atalk_sockets_lock);
read_unlock_bh(&atalk_sockets_lock);
return s;
}
......@@ -164,7 +162,7 @@ static struct sock *atalk_find_or_insert_socket(struct sock *sk,
{
struct sock *s;
spin_lock_bh(&atalk_sockets_lock);
write_lock_bh(&atalk_sockets_lock);
for (s = atalk_sockets; s; s = s->next) {
struct atalk_sock *at = at_sk(s);
......@@ -183,7 +181,7 @@ static struct sock *atalk_find_or_insert_socket(struct sock *sk,
sk->pprev = &atalk_sockets;
}
spin_unlock_bh(&atalk_sockets_lock);
write_unlock_bh(&atalk_sockets_lock);
return s;
}
......@@ -225,12 +223,12 @@ extern inline void atalk_destroy_socket(struct sock *sk)
* *
\**************************************************************************/
/* Anti-deadlock ordering is router_lock --> iface_lock -DaveM */
/* Anti-deadlock ordering is atalk_routes_lock --> iface_lock -DaveM */
struct atalk_route *atalk_routes;
rwlock_t atalk_routes_lock = RW_LOCK_UNLOCKED;
struct atalk_iface *atalk_interfaces;
spinlock_t atalk_interfaces_lock = SPIN_LOCK_UNLOCKED;
rwlock_t atalk_interfaces_lock = RW_LOCK_UNLOCKED;
/* For probing devices or in a routerless network */
struct atalk_route atrtr_default;
......@@ -245,7 +243,7 @@ static void atif_drop_device(struct net_device *dev)
struct atalk_iface **iface = &atalk_interfaces;
struct atalk_iface *tmp;
spin_lock_bh(&atalk_interfaces_lock);
write_lock_bh(&atalk_interfaces_lock);
while ((tmp = *iface) != NULL) {
if (tmp->dev == dev) {
*iface = tmp->next;
......@@ -255,7 +253,7 @@ static void atif_drop_device(struct net_device *dev)
} else
iface = &tmp->next;
}
spin_unlock_bh(&atalk_interfaces_lock);
write_unlock_bh(&atalk_interfaces_lock);
}
static struct atalk_iface *atif_add_device(struct net_device *dev,
......@@ -274,10 +272,10 @@ static struct atalk_iface *atif_add_device(struct net_device *dev,
iface->address = *sa;
iface->status = 0;
spin_lock_bh(&atalk_interfaces_lock);
write_lock_bh(&atalk_interfaces_lock);
iface->next = atalk_interfaces;
atalk_interfaces = iface;
spin_unlock_bh(&atalk_interfaces_lock);
write_unlock_bh(&atalk_interfaces_lock);
out:
return iface;
out_mem:
......@@ -394,7 +392,7 @@ static struct atalk_addr *atalk_find_primary(void)
* Return a point-to-point interface only if
* there is no non-ptp interface available.
*/
spin_lock_bh(&atalk_interfaces_lock);
read_lock_bh(&atalk_interfaces_lock);
for (iface = atalk_interfaces; iface; iface = iface->next) {
if (!fiface && !(iface->dev->flags & IFF_LOOPBACK))
fiface = iface;
......@@ -411,7 +409,7 @@ static struct atalk_addr *atalk_find_primary(void)
else
retval = NULL;
out:
spin_unlock_bh(&atalk_interfaces_lock);
read_unlock_bh(&atalk_interfaces_lock);
return retval;
}
......@@ -442,7 +440,7 @@ static struct atalk_iface *atalk_find_interface(int net, int node)
{
struct atalk_iface *iface;
spin_lock_bh(&atalk_interfaces_lock);
read_lock_bh(&atalk_interfaces_lock);
for (iface = atalk_interfaces; iface; iface = iface->next) {
if ((node == ATADDR_BCAST ||
node == ATADDR_ANYNODE ||
......@@ -457,7 +455,7 @@ static struct atalk_iface *atalk_find_interface(int net, int node)
ntohs(net) <= ntohs(iface->nets.nr_lastnet))
break;
}
spin_unlock_bh(&atalk_interfaces_lock);
read_unlock_bh(&atalk_interfaces_lock);
return iface;
}
......@@ -574,7 +572,7 @@ static int atrtr_create(struct rtentry *r, struct net_device *devhint)
if (!devhint) {
riface = NULL;
spin_lock_bh(&atalk_interfaces_lock);
read_lock_bh(&atalk_interfaces_lock);
for (iface = atalk_interfaces; iface; iface = iface->next) {
if (!riface &&
ntohs(ga->sat_addr.s_net) >=
......@@ -587,7 +585,7 @@ static int atrtr_create(struct rtentry *r, struct net_device *devhint)
ga->sat_addr.s_node == iface->address.s_node)
riface = iface;
}
spin_unlock_bh(&atalk_interfaces_lock);
read_unlock_bh(&atalk_interfaces_lock);
retval = -ENETUNREACH;
if (!riface)
......@@ -1042,7 +1040,7 @@ static int atalk_pick_and_bind_port(struct sock *sk, struct sockaddr_at *sat)
struct sock *s;
int retval;
spin_lock_bh(&atalk_sockets_lock);
write_lock_bh(&atalk_sockets_lock);
for (sat->sat_port = ATPORT_RESERVED;
sat->sat_port < ATPORT_LAST;
......@@ -1071,7 +1069,7 @@ try_next_port:;
retval = -EBUSY;
out:
spin_unlock_bh(&atalk_sockets_lock);
write_unlock_bh(&atalk_sockets_lock);
return retval;
}
......@@ -1831,13 +1829,18 @@ EXPORT_SYMBOL(aarp_send_ddp);
EXPORT_SYMBOL(atrtr_get_dev);
EXPORT_SYMBOL(atalk_find_dev_addr);
static char atalk_banner[] __initdata =
KERN_INFO "NET4: AppleTalk 0.20 for Linux NET4.0\n";
static char atalk_err_snap[] __initdata =
KERN_CRIT "Unable to register DDP with SNAP.\n";
/* Called by proto.c on kernel start up */
static int __init atalk_init(void)
{
(void)sock_register(&atalk_family_ops);
ddp_dl = register_snap_client(ddp_snap_id, atalk_rcv);
if (!ddp_dl)
printk(KERN_CRIT "Unable to register DDP with SNAP.\n");
printk(atalk_err_snap);
dev_add_pack(&ltalk_packet_type);
dev_add_pack(&ppptalk_packet_type);
......@@ -1848,15 +1851,12 @@ static int __init atalk_init(void)
#ifdef CONFIG_PROC_FS
aarp_register_proc_fs();
#endif /* CONFIG_PROC_FS */
#ifdef CONFIG_SYSCTL
atalk_register_sysctl();
#endif /* CONFIG_SYSCTL */
printk(KERN_INFO "NET4: AppleTalk 0.20 for Linux NET4.0\n");
printk(atalk_banner);
return 0;
}
module_init(atalk_init);
#ifdef MODULE
/*
* Note on MOD_{INC,DEC}_USE_COUNT:
*
......@@ -1886,7 +1886,6 @@ static void __exit atalk_exit(void)
sock_unregister(PF_APPLETALK);
}
module_exit(atalk_exit);
#endif /* MODULE */
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Alan Cox <Alan.Cox@linux.org>");
......
......@@ -7,14 +7,14 @@
*/
#include <linux/config.h>
#include <linux/sysctl.h>
#ifdef CONFIG_SYSCTL
#include <linux/sysctl.h>
extern int sysctl_aarp_expiry_time;
extern int sysctl_aarp_tick_time;
extern int sysctl_aarp_retransmit_limit;
extern int sysctl_aarp_resolve_time;
#ifdef CONFIG_SYSCTL
static struct ctl_table atalk_table[] = {
{
.ctl_name = NET_ATALK_AARP_EXPIRY_TIME,
......@@ -83,7 +83,7 @@ void atalk_unregister_sysctl(void)
unregister_sysctl_table(atalk_table_header);
}
#else
#else /* CONFIG_PROC_FS */
void atalk_register_sysctl(void)
{
}
......@@ -91,4 +91,4 @@ void atalk_register_sysctl(void)
void atalk_unregister_sysctl(void)
{
}
#endif
#endif /* CONFIG_PROC_FS */
......@@ -315,15 +315,6 @@ static struct file_operations ipx_seq_socket_fops = {
.release = seq_release,
};
static int ipx_proc_perms(struct inode* inode, int op)
{
return 0;
}
static struct inode_operations ipx_seq_inode = {
.permission = ipx_proc_perms,
};
static struct proc_dir_entry *ipx_proc_dir;
int __init ipx_proc_init(void)
......@@ -335,24 +326,21 @@ int __init ipx_proc_init(void)
if (!ipx_proc_dir)
goto out;
p = create_proc_entry("interface", 0, ipx_proc_dir);
p = create_proc_entry("interface", S_IRUGO, ipx_proc_dir);
if (!p)
goto out_interface;
p->proc_fops = &ipx_seq_interface_fops;
p->proc_iops = &ipx_seq_inode;
p = create_proc_entry("route", 0, ipx_proc_dir);
p = create_proc_entry("route", S_IRUGO, ipx_proc_dir);
if (!p)
goto out_route;
p->proc_fops = &ipx_seq_route_fops;
p->proc_iops = &ipx_seq_inode;
p = create_proc_entry("socket", 0, ipx_proc_dir);
p = create_proc_entry("socket", S_IRUGO, ipx_proc_dir);
if (!p)
goto out_socket;
p->proc_fops = &ipx_seq_socket_fops;
p->proc_iops = &ipx_seq_inode;
rc = 0;
out:
......
......@@ -211,11 +211,6 @@ static int llc_seq_core_open(struct inode *inode, struct file *file)
return seq_open(file, &llc_seq_core_ops);
}
static int llc_proc_perms(struct inode* inode, int op)
{
return 0;
}
static struct file_operations llc_seq_socket_fops = {
.open = llc_seq_socket_open,
.read = seq_read,
......@@ -230,10 +225,6 @@ static struct file_operations llc_seq_core_fops = {
.release = seq_release,
};
static struct inode_operations llc_seq_inode = {
.permission = llc_proc_perms,
};
static struct proc_dir_entry *llc_proc_dir;
int __init llc_proc_init(void)
......@@ -245,19 +236,17 @@ int __init llc_proc_init(void)
if (!llc_proc_dir)
goto out;
p = create_proc_entry("socket", 0, llc_proc_dir);
p = create_proc_entry("socket", S_IRUGO, llc_proc_dir);
if (!p)
goto out_socket;
p->proc_fops = &llc_seq_socket_fops;
p->proc_iops = &llc_seq_inode;
p = create_proc_entry("core", 0, llc_proc_dir);
p = create_proc_entry("core", S_IRUGO, llc_proc_dir);
if (!p)
goto out_core;
p->proc_fops = &llc_seq_core_fops;
p->proc_iops = &llc_seq_inode;
rc = 0;
out:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment