X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fisdn%2Fdivert%2Fdivert_procfs.c;h=06967da7c4a8fd0ee13ce94a8d46cfda8797051d;hb=refs%2Fheads%2Fvserver;hp=d89a94b964cb9842dd7bbd0674835f32f2c9547f;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/drivers/isdn/divert/divert_procfs.c b/drivers/isdn/divert/divert_procfs.c index d89a94b96..06967da7c 100644 --- a/drivers/isdn/divert/divert_procfs.c +++ b/drivers/isdn/divert/divert_procfs.c @@ -9,9 +9,7 @@ * */ -#include #include -#include #include #include #ifdef CONFIG_PROC_FS @@ -22,13 +20,14 @@ #include #include "isdn_divert.h" + /*********************************/ /* Variables for interface queue */ /*********************************/ ulong if_used = 0; /* number of interface users */ static struct divert_info *divert_info_head = NULL; /* head of queue */ static struct divert_info *divert_info_tail = NULL; /* pointer to last entry */ -static spinlock_t divert_info_lock = SPIN_LOCK_UNLOCKED;/* lock for queue */ +static DEFINE_SPINLOCK(divert_info_lock);/* lock for queue */ static wait_queue_head_t rd_queue; /*********************************/ @@ -46,7 +45,7 @@ put_info_buffer(char *cp) return; if (!*cp) return; - if (!(ib = (struct divert_info *) kmalloc(sizeof(struct divert_info) + strlen(cp), GFP_ATOMIC))) + if (!(ib = kmalloc(sizeof(struct divert_info) + strlen(cp), GFP_ATOMIC))) return; /* no memory */ strcpy(ib->info_start, cp); /* set output string */ ib->next = NULL; @@ -76,7 +75,7 @@ put_info_buffer(char *cp) /* deflection device read routine */ /**********************************/ static ssize_t -isdn_divert_read(struct file *file, char *buf, size_t count, loff_t * off) +isdn_divert_read(struct file *file, char __user *buf, size_t count, loff_t * off) { struct divert_info *inf; int len; @@ -90,11 +89,11 @@ isdn_divert_read(struct file *file, char *buf, size_t count, loff_t * off) return (0); inf->usage_cnt--; /* new usage count */ - (struct divert_info **) file->private_data = &inf->next; /* next structure */ + file->private_data = &inf->next; /* next structure */ if ((len = strlen(inf->info_start)) <= count) { if (copy_to_user(buf, inf->info_start, len)) return -EFAULT; - file->f_pos += len; + *off += len; return (len); } return (0); @@ -104,7 +103,7 @@ isdn_divert_read(struct file *file, char *buf, size_t count, loff_t * off) /* deflection device write routine */ /**********************************/ static ssize_t -isdn_divert_write(struct file *file, const char *buf, size_t count, loff_t * off) +isdn_divert_write(struct file *file, const char __user *buf, size_t count, loff_t * off) { return (-ENODEV); } /* isdn_divert_write */ @@ -137,12 +136,12 @@ isdn_divert_open(struct inode *ino, struct file *filep) spin_lock_irqsave( &divert_info_lock, flags ); if_used++; if (divert_info_head) - (struct divert_info **) filep->private_data = &(divert_info_tail->next); + filep->private_data = &(divert_info_tail->next); else - (struct divert_info **) filep->private_data = &divert_info_head; + filep->private_data = &divert_info_head; spin_unlock_irqrestore( &divert_info_lock, flags ); /* start_divert(); */ - return (0); + return nonseekable_open(ino, filep); } /* isdn_divert_open */ /*******************/ @@ -184,7 +183,7 @@ isdn_divert_ioctl(struct inode *inode, struct file *file, divert_rule *rulep; char *cp; - if (copy_from_user(&dioctl, (char *) arg, sizeof(dioctl))) + if (copy_from_user(&dioctl, (void __user *) arg, sizeof(dioctl))) return -EFAULT; switch (cmd) { @@ -215,10 +214,9 @@ isdn_divert_ioctl(struct inode *inode, struct file *file, case IIOCMODRULE: if (!(rulep = getruleptr(dioctl.getsetrule.ruleidx))) return (-EINVAL); - save_flags(flags); - cli(); + spin_lock_irqsave(&divert_lock, flags); *rulep = dioctl.getsetrule.rule; /* copy data */ - restore_flags(flags); + spin_unlock_irqrestore(&divert_lock, flags); return (0); /* no copy required */ break; @@ -253,7 +251,7 @@ isdn_divert_ioctl(struct inode *inode, struct file *file, default: return (-EINVAL); } /* switch cmd */ - return copy_to_user((char *)arg, &dioctl, sizeof(dioctl)) ? -EFAULT : 0; + return copy_to_user((void __user *)arg, &dioctl, sizeof(dioctl)) ? -EFAULT : 0; } /* isdn_divert_ioctl */ @@ -287,12 +285,12 @@ divert_dev_init(void) init_waitqueue_head(&rd_queue); #ifdef CONFIG_PROC_FS - isdn_proc_entry = create_proc_entry("isdn", S_IFDIR | S_IRUGO | S_IXUGO, proc_net); + isdn_proc_entry = proc_mkdir("net/isdn", NULL); if (!isdn_proc_entry) return (-1); isdn_divert_entry = create_proc_entry("divert", S_IFREG | S_IRUGO, isdn_proc_entry); if (!isdn_divert_entry) { - remove_proc_entry("isdn", proc_net); + remove_proc_entry("net/isdn", NULL); return (-1); } isdn_divert_entry->proc_fops = &isdn_fops; @@ -312,7 +310,7 @@ divert_dev_deinit(void) #ifdef CONFIG_PROC_FS remove_proc_entry("divert", isdn_proc_entry); - remove_proc_entry("isdn", proc_net); + remove_proc_entry("net/isdn", NULL); #endif /* CONFIG_PROC_FS */ return (0);