对于scull_read的理解

//ldd3第70页看到的scull_read描述如下:
ssize_t scull_read(struct file *filp,char __user *buf,size_t count,loff_t *f_pos)
{
    struct scull_cdev *dev=filp->private_data;
    struct scull_qset *dptr;//第一个链表项
    int quantum=dev->quantum,qset=dev->qset;
    int itemsize=quantum*qset;  //该链表项中有多少字节
    int item,s_pos,q_pos,rest;
    ssize_t retval=0;
   
    if(down_interruptible(&dev->sem))
        return -ERESTARTSYS;
    if(*f_pos>=dev->size)
        goto out;
    if(*f_pos+count>dev->size)
        count=dev->size-*f_pos;
   
    //在量子集中寻找链表项、qset索引以及偏移量
    item=(long)*f_pos/itemsize;
    rest=(long)*f_pos%itemsize;
    s_pos=rest/quantum;
    q_pos=rest%quantum;
   
    //沿该链表前行,直到正确的位置(在其它地方定义)
    dptr=scull_follow(dev,item);
    if(dptr==NULL || !dptr->data || !dptr->data[s_pos])
        goto out; //don't fill holes
    //读取该量子的数据直到结尾
    if(count>quantum-q_pos)
        count=quantum-q_pos;
    if(copy_to_user(buf,dptr->data[s_pos]+q_pos,count))
    {
        retval=-EFAULT;
        goto out;
    }
    *f_pos+=count;
    retval=count;
   
 out:
    up(&dev->sem);
    return retval;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值