Change

char *memory_buffer[];

to

char *memory_buffer;

- Manoj

On Sun, Sep 19, 2010 at 5:05 AM, Bond <[email protected]> wrote:

> Hi,
> I am modifying one of my drivers it had once worked but currently giving me
> some errors.
>
> The Makefile is at the end of the code
>
> Here is the code for
> bond.c
> ----------------------------------------------------------------------
> #include <linux/init.h>
> #include <linux/module.h>
> #include <linux/kernel.h> /* printk() */
> #include <linux/slab.h> /* kmalloc() */
> #include <linux/fs.h> /* everything... */
> #include <linux/errno.h> /* error codes */
> #include <linux/types.h> /* size_t */
> #include <linux/proc_fs.h>
> #include <linux/fcntl.h> /* O_ACCMODE */
> #include <asm/system.h> /* cli(), *_flags */
> #include <asm/uaccess.h> /* copy_from/to_user */
>
> MODULE_LICENSE("Dual BSD/GPL");
>
>
> int memory_open(struct inode *inode, struct file *filp);
> int memory_release(struct inode *inode, struct file *filp);
> ssize_t memory_read(struct file *filp, char *buf, size_t count, loff_t
> *f_pos);
> ssize_t memory_write(struct file *filp, char *buf, size_t count, loff_t
> *f_pos);
> void memory_exit(void);
> int memory_init(void);
>
> /* Structure that declares the usual file */
> /* access functions */
> struct file_operations memory_fops = {
>   read: memory_read,
>   write: memory_write,
>   open: memory_open,
>   release: memory_release
> };
> /* Declaration of the init and exit functions */
> module_init(memory_init);
> module_exit(memory_exit);
>
> /* Global variables of the driver */
> /* Major number */
> int memory_major = 60;
> /* Buffer to store data */
> char *memory_buffer[];
>
> int memory_init(void) {
>   int result;
>
>   /* Registering device */
>   result = register_chrdev(memory_major, "bond", &memory_fops);
>   if (result < 0) {
>     printk(KERN_ALERT  "memory: cannot obtain major number %d\n",
> memory_major);
>     return result;
>   }
>
>   /* Allocating memory for the buffer */
>   memory_buffer = kmalloc(1, GFP_KERNEL);
>   if (!memory_buffer) {
>     result = -ENOMEM;
>     goto fail;
>   }
>   memset(memory_buffer, 0, 10);
>
>   printk(KERN_ALERT "Inserting bond module\n");
>   return 0;
>
>   fail:
>     memory_exit();
>     return result;
> }
>
>
> void memory_exit(void) {
>   /* Freeing the major number */
>   unregister_chrdev(memory_major, "bond");
>
>   /* Freeing buffer memory */
>   if (memory_buffer) {
>     kfree(memory_buffer);
>   }
>
>   printk( KERN_ALERT "Removing bond module\n");
>
> }
>
>
> int memory_open(struct inode *inode, struct file *filp) {
>
>   /* Success */
>   return 0;
> }
>
>
> int memory_release(struct inode *inode, struct file *filp) {
>
>   /* Success */
>   return 0;
> }
>
>
> ssize_t memory_read(struct file *filp, char *buf,
>                     size_t count, loff_t *f_pos) {
>
>   /* Transfering data to user space */
>   copy_to_user(buf,memory_buffer,10);
>
>   /* Changing reading position as best suits */
>   if (*f_pos == 0) {
>     *f_pos+=1;
>     return 1;
>   } else {
>     return 0;
>   }
> }
>
> ssize_t memory_write( struct file *filp, char *buf,
>                       size_t count, loff_t *f_pos) {
>
>   char *tmp;
>
>   tmp=buf+count-1;
>   copy_from_user(memory_buffer,tmp,1);
>   return 1;
> }
> ----------------------------------------------------------------------
>
> Makefile
> ----------------------------------------------------------------------
> ifeq ($(KERNELRELEASE),)
> KERNELDIR ?= /lib/modules/$(shell uname -r)/build
> PWD := $(shell pwd)
> .PHONY: build clean
> build:
>     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
> clean:
>     rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c
>     rm -rf modules.order Module.symvers
> else
> $(info Building with KERNELRELEASE =${KERNELRELEASE})
> obj-m := bond.o
>
> endif
> ----------------------------------------------------------------------
>
> When ever I am compiling it I am getting following error
> ----------------------------------------------------------------------
> /home/s/programming/bond.c:29: warning: initialization from incompatible
> pointer type
> /home/s/programming/bond.c: In function ‘memory_init’:
> /home/s/programming/bond.c:54: error: ‘memory_buffer’ has an incomplete
> type
> /home/s/programming/bond.c:55: warning: the address of ‘memory_buffer’ will
> always evaluate as ‘true’
> /home/s/programming/bond.c: In function ‘memory_exit’:
> /home/s/programming/bond.c:75: warning: the address of ‘memory_buffer’ will
> always evaluate as ‘true’
> make[2]: *** [/home/s/programming/bond.o] Error 1
> make[1]: *** [_module_/home/s/programming] Error 2
> make: *** [build] Error 2
> ----------------------------------------------------------------------
>
> What could be the possible error ?
> I have checked kernel headers they are installed.
> but I am not clear with the error which the above is coming in above.
>
>

Reply via email to