On Sun, Sep 26, 2010 at 12:21 AM, Bond <[email protected]> wrote:

>
>
>
>> On Sun, Sep 26, 2010 at 12:30 PM, Venkatram Tummala <
>> [email protected]> wrote:
>>
>>> in your code you have done  in memory_read
>>>
>>>>   *f_pos = *f_pos + count;
>>>>
>>>> why have you done this?
>>>> What purpose it serves?
>>>>
>>>
>>> It updates the file pointer.
>>>
>>> Why is that important to update the pointer?
> Can this be not done without updating.
>

Try writing a user space file handling program in C. I repeat what other
have already said before. Before starting kernel development, you need to
know the user space basics.

The first read comes in with a *f_pos of 0. If you dont update the file
pointer, the user space program will keep reading from f_pos 0 indefinitely.
As file pointer is at offset 0 always because you dont update *f_pos, every
read(..) called by user space will succeed. So, your command cat /dev/bond
will never return. user space programs generally look for a specific return
code to know that it is the end of the file.

>
> Your read function is
>
> ssize_t memory_read(struct file *filp, char __user *buf,
>
>                 size_t count, loff_t *f_pos)
> {
>         if (*f_pos > 0)
>                 return 0;
>         if (count > strlen(memory_buffer))
>                 count = strlen(memory_buffer);
>         copy_to_user(buf,memory_buffer,count);
>
>         *f_pos = *f_pos + count;
>
>         return count;
> }
>
> I am not able to understand why one needs to update f_pos
> to be able to write to userspace or when I am doing a cat /dev/bond
>

Reply via email to