TRACE_M("r3964_read - msg kfree %x",(int)pMsg); 
TRACE_M("r3964_read - msg kfree %p",pMsg); 
static ssize_t r3964_read(struct tty_struct *tty, struct file *file,			  unsigned char __user *buf, size_t nr){   struct r3964_info *pInfo=(struct r3964_info*)tty->disc_data;   struct r3964_client_info *pClient;   struct r3964_message *pMsg;   struct r3964_client_message theMsg;   DECLARE_WAITQUEUE (wait, current);      int pid = current->pid;   int count;      TRACE_L("read()");    pClient=findClient(pInfo, pid);   if(pClient)   {      pMsg = remove_msg(pInfo, pClient);      if(pMsg==NULL)      {		 /* no messages available. */         if (file->f_flags & O_NONBLOCK)		 {            return -EAGAIN;		 }         /* block until there is a message: */         add_wait_queue(&pInfo->read_wait, &wait);repeat:         current->state = TASK_INTERRUPTIBLE;         pMsg = remove_msg(pInfo, pClient);	 if (!pMsg && !signal_pending(current))		 {            schedule();            goto repeat;         }         current->state = TASK_RUNNING;         remove_wait_queue(&pInfo->read_wait, &wait);      }            /* If we still haven't got a message, we must have been signalled */      if (!pMsg) return -EINTR;      /* deliver msg to client process: */      theMsg.msg_id = pMsg->msg_id;      theMsg.arg    = pMsg->arg;      theMsg.error_code = pMsg->error_code;      count = sizeof(struct r3964_client_message);      kfree(pMsg);      TRACE_M("r3964_read - msg kfree %x",(int)pMsg);      if (copy_to_user(buf,&theMsg, count))	return -EFAULT;      TRACE_PS("read - return %d", count);      return count;   }   return -EPERM;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/87e0f3dbd3693bc4583474ab191cbdd5e3d9d0fa/n_r3964.c/clean/drivers/char/n_r3964.c