seq_file源码分析,未完待续

ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
{
 struct seq_file *m = (struct seq_file *)file->private_data;
/* grab buffer if we didn't have one */
 if (!m->buf) {
  m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
  if (!m->buf)
   goto Enomem;
 }
/* if not empty - flush it first */
if (m->count) {
  n = min(m->count, size);
  err = copy_to_user(buf, m->buf + m->from, n);
  if (err)
   goto Efault;
  m->count -= n;
  m->from += n;
  size -= n;
  buf += n;
  copied += n;
  if (!m->count)
   m->index++;
  if (!size)
   goto Done;
 }
/* we need at least one record in buffer */
 pos = m->index;
 p = m->op->start(m, &pos);
 while (1) {
  err = PTR_ERR(p);
  if (!p || IS_ERR(p))
   break;
  err = m->op->show(m, p);
  if (err < 0)
   break;
  if (unlikely(err))
   m->count = 0;
  if (unlikely(!m->count)) {
   p = m->op->next(m, p, &pos);
   m->index = pos;
   continue;
  }
  if (m->count < m->size)
   goto Fill;
  m->op->stop(m, p);
  kfree(m->buf);
  m->buf = kmalloc(m->size <<= 1, GFP_KERNEL);
  if (!m->buf)
   goto Enomem;
  m->count = 0;
  m->version = 0;
  pos = m->index;
  p = m->op->start(m, &pos);
 }
 m->op->stop(m, p);
 m->count = 0;
 goto Done;

posted on 2010-12-14 16:14 lstar 阅读(83) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿

文章档案

搜索

最新评论