Thanks. It worked. On Sat, Sep 25, 2010 at 12:46 AM, John Mahoney <[email protected]> wrote:
> On Fri, Sep 24, 2010 at 9:38 AM, sri <[email protected]> wrote: > > My driver write routine is not working properly. > > As a result, when I do echo "123" > /dev/eater, the process is stopping > and > > the control goes into an infinite loop. > > lsmod showed my driver was in use by 2 processes. > > Now if i want to forcefully remove my driver module from kernel, how to > do > > that? > > > > Below is the write routine: > > static int eater_write(struct file *file, const char *buf, size_t lbuf, > > loff_t *ppos) > > { > > int actual_data_allowed_to_write; > > int data_written; > > int data_to_copy=0; > > > > printk("requested bytes to write: %d\n", lbuf); > > > > actual_data_allowed_to_write = MAXSIZE - *ppos; > > > > printk("allowed bytes to write: %d\n", > > actual_data_allowed_to_write); > > > > if(actual_data_allowed_to_write == 0) > > { > > printk("Device has no space to write. format it\n"); > > return(actual_data_allowed_to_write); > > } > > > > //if available space can accommodate data to write > > if(actual_data_allowed_to_write > lbuf) > > data_to_copy=lbuf; > > //if available space can't accommodate date to write > > if(actual_data_allowed_to_write < lbuf) > > data_to_copy=actual_data_allowed_to_write; > > > > printk("data_to_copy: %d\n", data_to_copy); > > > > data_written=copy_from_user(eater_space + *ppos, /* to */ \ > > buf, /* from */ \ > > data_to_copy); > > Also, copy_from_user returns the number of bytes which could NOT be > written. > > SO > > data_written = data_to_copy - data_written; > > > //update device memory with new position > > *ppos += data_to_copy; > > printk("\nWrote %d bytes\n", data_written); > > > > return(data_written); > > } > > > > Appreciate any help. > > > > /Sri. > > > -- -- Krishna Mohan B
