title: copy_to_user not working in kernel module
body: <p>I was trying to use copy_to_user in kernel module read function, but am not able to copy the data from kernel to user buffer. Please can anyone tell me if I am doing some mistake. My kernel version is 2.6.35. I am giving the portion of kernel module as well as the application being used to test it. Right now my focus is why this copy_to_user is not working. Any help will great.</p>
  
  <pre><code>///////////////////////////////////kernel module//////////////////////////////////////
  
  #define BUF_LEN 80
  
  static char msg[BUF_LEN];       
  static char *msg_Ptr;
  
  static int device_open(struct inode *inode, struct file *file)
  {
  static int counter = 0;
  
  if (Device_Open)
      return -EBUSY;
  
  Device_Open++;
  printk(KERN_ALERT "In open device call\n");
  
  sprintf(msg, "I already told you %d times Hello world!\n", counter++);
  msg_Ptr = msg;
  try_module_get(THIS_MODULE);
  
  return SUCCESS;
  }
  
  
  static ssize_t device_read(struct file *filp,    
             char __user *buffer,    
             size_t length,    
             loff_t * offset)
  {
  /*
   * Number of bytes actually written to the buffer 
   */
  int bytes_read = 0;
  
  /*
   * If we are at the end of the message, 
   * return 0 signifying end of file 
   */
  if (*msg_Ptr == 0)
      return 0;
  
  /* 
   * Actually put the data into the buffer 
   */
  
  
  else {
      bytes_read=copy_to_user(buffer, msg, length);
      if (bytes_read==-1);
          {
           printk(KERN_INFO "Error in else while copying the data \n");
          }
  
      }
  
     return bytes_read;
  }
  
  
  
  
  
  
  ////////////////////////////////////////application////////////////////////
  #include &lt;stdio.h&gt;
  #include &lt;sys/types.h&gt;
  #include &lt;sys/stat.h&gt;
  #include &lt;fcntl.h&gt; 
  #include &lt;stdlib.h&gt;
  
  #define  BUF_SIZE    40
  
  int main()
  {
  ssize_t num_bytes;
  int fd, n=0;
  char buf[BUF_SIZE];
  
  fd=open("/dev/chardev", O_RDWR);
  if(fd== -1){perror("Error while opening device");exit(1);}
  
  printf("fd=%d\n",fd);
  num_bytes=read(fd, buf, BUF_SIZE);
  if(num_bytes==-1){perror("Error while reading"); exit(2);}
  
  printf("The value fetched is %lu bytes\n", num_bytes);
  
  while(n&lt;=num_bytes)
      {
          printf("%c",buf[n]);
          n++;
      }
  
  close(fd);
  return 0;
  
  }
  </code></pre>