diff options
Diffstat (limited to 'drivers/isdn/hysdn/hysdn_proclog.c')
| -rw-r--r-- | drivers/isdn/hysdn/hysdn_proclog.c | 110 |
1 files changed, 29 insertions, 81 deletions
diff --git a/drivers/isdn/hysdn/hysdn_proclog.c b/drivers/isdn/hysdn/hysdn_proclog.c index 236cc7dadfd..7b5fd8fb176 100644 --- a/drivers/isdn/hysdn/hysdn_proclog.c +++ b/drivers/isdn/hysdn/hysdn_proclog.c @@ -24,7 +24,7 @@ extern struct proc_dir_entry *hysdn_proc_entry; static DEFINE_MUTEX(hysdn_log_mutex); -static void put_log_buffer(hysdn_card * card, char *cp); +static void put_log_buffer(hysdn_card *card, char *cp); /*************************************************/ /* structure keeping ascii log for device output */ @@ -54,7 +54,7 @@ struct procdata { /* log function for cards error log interface */ /**********************************************/ void -hysdn_card_errlog(hysdn_card * card, tErrLogEntry * logp, int maxsize) +hysdn_card_errlog(hysdn_card *card, tErrLogEntry *logp, int maxsize) { char buf[ERRLOG_TEXT_SIZE + 40]; @@ -66,7 +66,7 @@ hysdn_card_errlog(hysdn_card * card, tErrLogEntry * logp, int maxsize) /* Log function using format specifiers for output */ /***************************************************/ void -hysdn_addlog(hysdn_card * card, char *fmt,...) +hysdn_addlog(hysdn_card *card, char *fmt, ...) { struct procdata *pd = card->proclog; char *cp; @@ -98,7 +98,7 @@ hysdn_addlog(hysdn_card * card, char *fmt,...) /* Flushes buffers not longer in use. */ /********************************************/ static void -put_log_buffer(hysdn_card * card, char *cp) +put_log_buffer(hysdn_card *card, char *cp) { struct log_data *ib; struct procdata *pd = card->proclog; @@ -115,7 +115,7 @@ put_log_buffer(hysdn_card * card, char *cp) return; /* no open file for read */ if (!(ib = kmalloc(sizeof(struct log_data) + strlen(cp), GFP_ATOMIC))) - return; /* no memory */ + return; /* no memory */ strcpy(ib->log_start, cp); /* set output string */ ib->next = NULL; ib->proc_ctrl = pd; /* point to own control structure */ @@ -153,20 +153,12 @@ put_log_buffer(hysdn_card * card, char *cp) /* write log file -> set log level bits */ /****************************************/ static ssize_t -hysdn_log_write(struct file *file, const char __user *buf, size_t count, loff_t * off) +hysdn_log_write(struct file *file, const char __user *buf, size_t count, loff_t *off) { int rc; - unsigned char valbuf[128]; hysdn_card *card = file->private_data; - if (count > (sizeof(valbuf) - 1)) - count = sizeof(valbuf) - 1; /* limit length */ - if (copy_from_user(valbuf, buf, count)) - return (-EFAULT); /* copy failed */ - - valbuf[count] = 0; /* terminating 0 */ - - rc = kstrtoul(valbuf, 0, &card->debug_flags); + rc = kstrtoul_from_user(buf, count, 0, &card->debug_flags); if (rc < 0) return rc; hysdn_addlog(card, "debug set to 0x%lx", card->debug_flags); @@ -177,33 +169,21 @@ hysdn_log_write(struct file *file, const char __user *buf, size_t count, loff_t /* read log file */ /******************/ static ssize_t -hysdn_log_read(struct file *file, char __user *buf, size_t count, loff_t * off) +hysdn_log_read(struct file *file, char __user *buf, size_t count, loff_t *off) { struct log_data *inf; int len; - struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); - struct procdata *pd = NULL; - hysdn_card *card; + hysdn_card *card = PDE_DATA(file_inode(file)); - if (!*((struct log_data **) file->private_data)) { + if (!(inf = *((struct log_data **) file->private_data))) { + struct procdata *pd = card->proclog; if (file->f_flags & O_NONBLOCK) return (-EAGAIN); - /* sorry, but we need to search the card */ - card = card_root; - while (card) { - pd = card->proclog; - if (pd->log == pde) - break; - card = card->next; /* search next entry */ - } - if (card) - interruptible_sleep_on(&(pd->rd_queue)); - else - return (-EAGAIN); - + wait_event_interruptible(pd->rd_queue, (inf = + *((struct log_data **) file->private_data))); } - if (!(inf = *((struct log_data **) file->private_data))) + if (!inf) return (0); inf->usage_cnt--; /* new usage count */ @@ -223,27 +203,15 @@ hysdn_log_read(struct file *file, char __user *buf, size_t count, loff_t * off) static int hysdn_log_open(struct inode *ino, struct file *filep) { - hysdn_card *card; - struct procdata *pd = NULL; - unsigned long flags; + hysdn_card *card = PDE_DATA(ino); mutex_lock(&hysdn_log_mutex); - card = card_root; - while (card) { - pd = card->proclog; - if (pd->log == PDE(ino)) - break; - card = card->next; /* search next entry */ - } - if (!card) { - mutex_unlock(&hysdn_log_mutex); - return (-ENODEV); /* device is unknown/invalid */ - } - filep->private_data = card; /* remember our own card */ - if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) { /* write only access -> write log level only */ + filep->private_data = card; /* remember our own card */ } else if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) { + struct procdata *pd = card->proclog; + unsigned long flags; /* read access -> log/debug read */ spin_lock_irqsave(&card->hysdn_lock, flags); @@ -283,21 +251,13 @@ hysdn_log_close(struct inode *ino, struct file *filep) } else { /* read access -> log/debug read, mark one further file as closed */ - pd = NULL; inf = *((struct log_data **) filep->private_data); /* get first log entry */ if (inf) pd = (struct procdata *) inf->proc_ctrl; /* still entries there */ else { /* no info available -> search card */ - card = card_root; - while (card) { - pd = card->proclog; - if (pd->log == PDE(ino)) - break; - card = card->next; /* search next entry */ - } - if (card) - pd = card->proclog; /* pointer to procfs log */ + card = PDE_DATA(file_inode(filep)); + pd = card->proclog; /* pointer to procfs log */ } if (pd) pd->if_used--; /* decrement interface usage count by one */ @@ -324,27 +284,15 @@ hysdn_log_close(struct inode *ino, struct file *filep) /* select/poll routine to be able using select() */ /*************************************************/ static unsigned int -hysdn_log_poll(struct file *file, poll_table * wait) +hysdn_log_poll(struct file *file, poll_table *wait) { unsigned int mask = 0; - struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); - hysdn_card *card; - struct procdata *pd = NULL; + hysdn_card *card = PDE_DATA(file_inode(file)); + struct procdata *pd = card->proclog; if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) return (mask); /* no polling for write supported */ - /* we need to search the card */ - card = card_root; - while (card) { - pd = card->proclog; - if (pd->log == pde) - break; - card = card->next; /* search next entry */ - } - if (!card) - return (mask); /* card not found */ - poll_wait(file, &(pd->rd_queue), wait); if (*((struct log_data **) file->private_data)) @@ -364,7 +312,7 @@ static const struct file_operations log_fops = .write = hysdn_log_write, .poll = hysdn_log_poll, .open = hysdn_log_open, - .release = hysdn_log_close, + .release = hysdn_log_close, }; @@ -373,7 +321,7 @@ static const struct file_operations log_fops = /* conf files. */ /***********************************************************************************/ int -hysdn_proclog_init(hysdn_card * card) +hysdn_proclog_init(hysdn_card *card) { struct procdata *pd; @@ -381,9 +329,9 @@ hysdn_proclog_init(hysdn_card * card) if ((pd = kzalloc(sizeof(struct procdata), GFP_KERNEL)) != NULL) { sprintf(pd->log_name, "%s%d", PROC_LOG_BASENAME, card->myid); - pd->log = proc_create(pd->log_name, - S_IFREG | S_IRUGO | S_IWUSR, hysdn_proc_entry, - &log_fops); + pd->log = proc_create_data(pd->log_name, + S_IFREG | S_IRUGO | S_IWUSR, hysdn_proc_entry, + &log_fops, card); init_waitqueue_head(&(pd->rd_queue)); @@ -398,7 +346,7 @@ hysdn_proclog_init(hysdn_card * card) /* The module counter is assumed to be 0 ! */ /************************************************************************************/ void -hysdn_proclog_release(hysdn_card * card) +hysdn_proclog_release(hysdn_card *card) { struct procdata *pd; |
