title: Conflicting types in imported files
body: <p>I'm programming a kernel module which should act as a character device which acts as a circular FIFO device, but when i try to compile it, i have some errors that i do not know how to fix, here is my source. I'm sorry if my english is bad and if i don't write more information, i'm new with C in linux modules, i'm using debian 6, i think it is a problem with the includes, "cbuffer_t is the circular FIFO (It has been provided to me, should not have issues.</p>
  
  <p>the message of compilation i receive:</p>
  
  <pre><code>make
  make -C /lib/modules/2.6.39.4.mikernel/build M=/home/dsouser/Escritorio/Prac3/ParteB modules
  make[1]: se ingresa al directorio `/usr/src/linux-headers-2.6.39.4.mikernel'
    CC [M]  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.o
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:3:19: error: fcntl.h: No existe el fichero o el directorio
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:27:1: warning: "KERNEL_DS" redefined
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
  include/asm-generic/uaccess.h:18:1: warning: this is the location of the previous definition
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:28:1: warning: "USER_DS" redefined
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
  include/asm-generic/uaccess.h:22:1: warning: this is the location of the previous definition
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:80:1: warning: "access_ok" redefined
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
  include/asm-generic/uaccess.h:40:1: warning: this is the location of the previous definition
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:95: error: redefinition of ‘struct exception_table_entry’
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:155:1: warning: "get_user" redefined
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
  include/asm-generic/uaccess.h:219:1: warning: this is the location of the previous definition
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:221: error: conflicting types for ‘__put_user_bad’
  include/asm-generic/uaccess.h:177: note: previous declaration of ‘__put_user_bad’ was here
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:250:1: warning: "put_user" redefined
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
  include/asm-generic/uaccess.h:163:1: warning: this is the location of the previous definition
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:491:1: warning: "__get_user" redefined
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
  include/asm-generic/uaccess.h:179:1: warning: this is the location of the previous definition
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:514:1: warning: "__put_user" redefined
  In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
  include/asm-generic/uaccess.h:143:1: warning: this is the location of the previous definition
  In file included from /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:571,
                   from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:45: error: conflicting types for ‘__copy_to_user’
  include/asm-generic/uaccess.h:108: note: previous definition of ‘__copy_to_user’ was here
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:83: error: redefinition of ‘__copy_to_user’
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:45: note: previous definition of ‘__copy_to_user’ was here
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:90: error: conflicting types for ‘__copy_from_user’
  include/asm-generic/uaccess.h:78: note: previous definition of ‘__copy_from_user’ was here
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:138: error: redefinition of ‘__copy_from_user’
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:90: note: previous definition of ‘__copy_from_user’ was here
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:188: error: conflicting types for ‘copy_to_user’
  include/asm-generic/uaccess.h:253: note: previous definition of ‘copy_to_user’ was here
  /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:203: error: conflicting types for ‘copy_from_user’
  include/asm-generic/uaccess.h:243: note: previous definition of ‘copy_from_user’ was here
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c: In function ‘init_module’:
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:67: warning: assignment from incompatible pointer type
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c: In function ‘cleanup_module’:
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:95: warning: passing argument 1 of ‘destroy_cbuffer_t’ from incompatible pointer type
  /home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:19: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c: In function ‘device_read’:
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:156: warning: passing argument 1 of ‘size_cbuffer_t’ from incompatible pointer type
  /home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:22: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:163: warning: passing argument 1 of ‘size_cbuffer_t’ from incompatible pointer type
  /home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:22: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:164: warning: passing argument 1 of ‘size_cbuffer_t’ from incompatible pointer type
  /home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:22: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:164: warning: value computed is not used
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:177: warning: passing argument 1 of ‘remove_items_cbuffer_t’ from incompatible pointer type
  /home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:43: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c: In function ‘device_write’:
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:205: warning: passing argument 1 of ‘size_cbuffer_t’ from incompatible pointer type
  /home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:22: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:207: warning: passing argument 1 of ‘insert_items_cbuffer_t’ from incompatible pointer type
  /home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:37: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:211: warning: passing argument 1 of ‘nr_gaps_cbuffer_t’ from incompatible pointer type
  /home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:25: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:212: warning: passing argument 1 of ‘insert_items_cbuffer_t’ from incompatible pointer type
  /home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:37: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
  make[2]: *** [/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.o] Error 1
  make[1]: *** [_module_/home/dsouser/Escritorio/Prac3/ParteB] Error 2
  make[1]: se sale del directorio `/usr/src/linux-headers-2.6.39.4.mikernel'
  make: *** [all] Error 2
  </code></pre>
  
  <p>And here is the Source. Sorry for the long post but i didn't know how to fix it. I have read the kernel module programming guide and i have not understood half of it and it hasn't helped me to repair this source.</p>
  
  <pre><code>#define MAX_BUFFER_SIZE 1024
  
  #include &lt;fcntl.h&gt;
  #include "cbuffer.h"
  #include &lt;linux/string.h&gt;
  #include &lt;asm-generic/uaccess.h&gt;
  #include &lt;linux/spinlock.h&gt;
  #include &lt;linux/kernel.h&gt;
  #include &lt;linux/module.h&gt;
  #include &lt;linux/fs.h&gt;
  #include &lt;asm/uaccess.h&gt;    /* for put_user */
  #include &lt;linux/semaphore.h&gt;
  
  MODULE_LICENSE("GPL");
  MODULE_DESCRIPTION("Driver Module for DSO");
  MODULE_AUTHOR("Kaostias");
  
  /*  
   *  Prototypes - this would normally go in a .h file
   */
  int init_module(void);
  void cleanup_module(void);
  static int device_open(struct inode *, struct file *);
  static int device_release(struct inode *, struct file *);
  static ssize_t device_read(struct file *, char *, size_t, loff_t *);
  static ssize_t device_write(struct file *, const char *, size_t, loff_t *);
  
  #define SUCCESS 0
  #define DEVICE_NAME "characterDevice"   /* Dev name as it appears in /proc/devices   */
  #define BUF_LEN 80          /* Max length of the message from the device */
  
  /* 
   * Global variables are declared as static, so are global within the file. 
   */
  
  static int Major;       /* Major number assigned to our device driver */
  static int Device_Open = 0; /* Is device open?  
                   * Used to prevent multiple access to device */
  static char msg[BUF_LEN];   /* The msg the device will give when asked */
  static char *msg_Ptr;
  struct cbuffer_t * buf;
  
  /*semaphore_t fifoR = */DEFINE_SEMAPHORE(fifoR);
  /*semaphore_t fifoW = */DEFINE_SEMAPHORE(fifoW);
  
  static struct file_operations fops = {
      .read = device_read,
      .write = device_write,
      .open = device_open,
      .release = device_release
  };
  
  /*
   * This function is called when the module is loaded
   */
  int init_module(void)
  {
          Major = register_chrdev(0, DEVICE_NAME, &amp;fops);
  
      if (Major &lt; 0) {
        printk(KERN_ALERT "Registering char device failed with %d\n", Major);
        return Major;
      }
      /*
       * Creation of buffer;
       */
      if( (buf = create_cbuffer_t(MAX_BUFFER_SIZE)) != NULL){
          printk(KERN_ALERT "Error when creating the FIFO device.");
      }
      printk(KERN_INFO "Buffer created without error.\n");
      printk(KERN_INFO "I was assigned major number %d. To talk to\n", Major);
      printk(KERN_INFO "the driver, create a dev file with\n");
      printk(KERN_INFO "'mknod /dev/%s c %d 0'.\n", DEVICE_NAME, Major);
      printk(KERN_INFO "Try various minor numbers. Try to cat and echo to\n");
      printk(KERN_INFO "the device file.\n");
      printk(KERN_INFO "Remove the device file and module when done.\n");
  
      return SUCCESS;
  }
  
  /*
   * This function is called when the module is unloaded
   */
  void cleanup_module(void)
  {
      /* 
       * Unregister the device 
       */
      /*int ret = */unregister_chrdev(Major, DEVICE_NAME);
  /*  if (ret &lt; 0)
          printk(KERN_ALERT "Error in unregister_chrdev\n");//, ret);*/
      /*
       * Destroys the FIFO buffer
       */
      destroy_cbuffer_t (buf);
  
  }
  
  /*
   * Methods
   */
  
  /* 
   * Called when a process tries to open the device file, like
   * "cat /dev/mycharfile"
   */
  static int device_open(struct inode *inode, struct file *file)
  {
  
      static int counter = 0;
      if (Device_Open)
          return -EBUSY;
      Device_Open++;
      sprintf(msg, "The device %s has been open %d times.\n",DEVICE_NAME ,counter++);
      msg_Ptr = msg;
      try_module_get(THIS_MODULE);
  
      return SUCCESS;
  }
  
  /* 
   * Called when a process closes the device file.
   */
  static int device_release(struct inode *inode, struct file *file)
  {
  
      Device_Open--;      /* We're now ready for our next caller */
      /* 
       * Decrement the usage count, or else once you opened the file, you'll
       * never get get rid of the module. 
       */
      module_put(THIS_MODULE);
  
      return SUCCESS;
  }
  
  /* 
   * Called when a process, which already opened the dev file, attempts to
   * read from it.
   */
  static ssize_t device_read(struct file *filp,   /* see include/linux/fs.h   */
                 char *buffer,    /* buffer to fill with data */
                 size_t length,   /* length of the buffer     */
                 loff_t * offset)
  {
      int i =0;
      /*
       * Number of bytes actually written to the buffer 
       */
      int bytes_read = 0;
  
      /*
       * If we're at the end of the message, 
       * return 0 signifying end of file 
       */
      if (size_cbuffer_t(buf)&lt;=0)
          return 0; //It should not be able to be less than 0 but just in case    
  
      /* 
       * If the size is higher than the current content, the size of lecture gets 
       * changed
       */
      if(size_cbuffer_t(buf) &lt; length)
          length == size_cbuffer_t(buf);  
  
  
      /* 
       * The buffer is in the user data segment, not the kernel 
       * segment so "*" assignment won't work.  We have to use 
       * put_user which copies data from the kernel data segment to
       * the user data segment. 
       */
  
  
  
       //Se quita la cadena del buffer
      remove_items_cbuffer_t (buf, msg_Ptr, length);
      while ((i = length)&gt; 0){
          put_user(*(msg_Ptr++), buffer++);
          length--;
          bytes_read++;
      }
  
      /* 
       * Most read functions return the number of bytes put into the buffer
       */
      return bytes_read;
  }
  
  /*  
   * Called when a process writes to dev file: echo "hi" &gt; /dev/hello 
   */
  static ssize_t
  device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
  {
      //char[BUF_LEN]  aux;
      int ret = len;
      if (sizeof(buff) == 0 || buff == NULL) 
          return -EINVAL;
  
      while (len) {
          get_user(*(msg_Ptr++), buff++);
          len--;
      }
      if(size_cbuffer_t(buf) &gt;= ret){ 
  
          insert_items_cbuffer_t (buf, msg_Ptr, ret);
  
      }else{
          //strcpy(aux, msg_Ptr, size_cbuffer_t(buf));
          ret = nr_gaps_cbuffer_t(buf);
          insert_items_cbuffer_t(buf, msg_Ptr, ret);
      }
  return ret;
  }
  </code></pre>
  
  <p>My makefile is</p>
  
  <pre><code>obj-m = driverPersonal.o 
  all :
      make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
  
  clean :
      make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
  </code></pre>