On Jan 6, 2008 6:58 PM, Onkar <[EMAIL PROTECTED]> wrote:

> Hi all,
>
> i am implementing scull (character device driver in LDD : chapter 3 ) , in
> that I found ::
>
> Please refer to Linux Device Drivers Rubunu et al  , 3/e.pg 57
>
> ssize_t scull_read(struct file *filp, char __user *buf, size_t count,loff_t
> *f_pos)
>
> Scull_Dev *scull_follow(Scull_Dev *dev, int n)
> {
>     while (n--) {
>         if (!dev->next) {
>             dev->next = kmalloc(sizeof(Scull_Dev), GFP_KERNEL);
> <<<============== why memory allocations in read operations??
>             memset(dev->next, 0, sizeof(Scull_Dev));
>         }
>         dev = dev->next;
>         continue;
>     }
>     return dev;
> }
>
> IMHO this implementation is WRONG ?? Correct me if I am wrong.
>
> other implementation is :
>
> /*
>  scull_follow
> Take a walk in the linked list until node 'n' has been reached.
> */
> struct scull_qset* scull_follow(struct scull_dev *dev, int n){
>   struct scull_qset *qs = dev->data;
>
>   // Allocate first node if needed


 Only if qs == NULL then allocate memory. (In case of write)
else skip this statement block altogether. For read and if qs has
some persistent data already, this statement block will be skipped.


>   if(!qs) {
>     // Reserve memory
>     qs = dev->data = kmalloc(sizeof(struct scull_qset), GFP_KERNEL);
>     // Failure :(
>     if(qs == NULL){
>       return NULL;
>     }
>     // Zero out the region
>     memset(qs, 0, sizeof(struct scull_qset));
>   }


Same  below.

>
>
>   while(n--){
>     // If the next node does not exist, allocate it.
>     if(!qs->next){
>       qs->next = kmalloc(sizeof(struct scull_qset), GFP_KERNEL);
>       if(qs->next== NULL){
>     return NULL;
>       }
>       memset(qs->next, 0, sizeof(struct scull_qset));
>     }
>     qs = qs->next;
>     continue;
>   }
>   return qs;
> }
>
> But here too i am not convinced with memory allocation ?? Why memory
> allocations in read when we only
> want to reach the first partially filled node ??
>
>
Thanks.

Reply via email to