Lines Matching refs:seq

28 static void dfs_seq_overflow(struct dfs_seq_file *seq)  in dfs_seq_overflow()  argument
30 seq->count = seq->size; in dfs_seq_overflow()
57 struct dfs_seq_file *seq; in dfs_seq_open() local
70 seq = rt_calloc(1, sizeof(struct dfs_seq_file)); in dfs_seq_open()
71 if (!seq) in dfs_seq_open()
74 file->data = seq; in dfs_seq_open()
76 rt_mutex_init(&seq->lock, "dfs_seq", RT_IPC_FLAG_PRIO); in dfs_seq_open()
78 seq->ops = ops; in dfs_seq_open()
79 seq->file = file; in dfs_seq_open()
99 static int dfs_seq_traverse(struct dfs_seq_file *seq, off_t offset) in dfs_seq_traverse() argument
105 seq->index = 0; in dfs_seq_traverse()
106 seq->count = seq->from = 0; in dfs_seq_traverse()
110 if (!seq->buf) in dfs_seq_traverse()
112 seq->buf = dfs_seq_alloc(seq->size = PAGE_SIZE); in dfs_seq_traverse()
113 if (!seq->buf) in dfs_seq_traverse()
116 p = seq->ops->start(seq, &seq->index); in dfs_seq_traverse()
119 error = seq->ops->show(seq, p); in dfs_seq_traverse()
125 seq->count = 0; in dfs_seq_traverse()
127 if (dfs_seq_is_full(seq)) in dfs_seq_traverse()
130 p = seq->ops->next(seq, p, &seq->index); in dfs_seq_traverse()
131 if (pos + seq->count > offset) in dfs_seq_traverse()
133 seq->from = offset - pos; in dfs_seq_traverse()
134 seq->count -= seq->from; in dfs_seq_traverse()
137 pos += seq->count; in dfs_seq_traverse()
138 seq->count = 0; in dfs_seq_traverse()
142 seq->ops->stop(seq, p); in dfs_seq_traverse()
146 seq->ops->stop(seq, p); in dfs_seq_traverse()
147 rt_free(seq->buf); in dfs_seq_traverse()
148 seq->count = 0; in dfs_seq_traverse()
149 seq->buf = dfs_seq_alloc(seq->size <<= 1); in dfs_seq_traverse()
150 return !seq->buf ? -ENOMEM : -EAGAIN; in dfs_seq_traverse()
177 struct dfs_seq_file *seq = file->data; in dfs_seq_read() local
186 rt_mutex_take(&seq->lock, RT_WAITING_FOREVER); in dfs_seq_read()
194 seq->index = 0; in dfs_seq_read()
195 seq->count = 0; in dfs_seq_read()
199 if (*pos != seq->read_pos) in dfs_seq_read()
201 while ((err = dfs_seq_traverse(seq, *pos)) == -EAGAIN) in dfs_seq_read()
206 seq->read_pos = 0; in dfs_seq_read()
207 seq->index = 0; in dfs_seq_read()
208 seq->count = 0; in dfs_seq_read()
213 seq->read_pos = *pos; in dfs_seq_read()
218 if (!seq->buf) in dfs_seq_read()
220 seq->buf = dfs_seq_alloc(seq->size = PAGE_SIZE); in dfs_seq_read()
221 if (!seq->buf) in dfs_seq_read()
225 if (seq->count) in dfs_seq_read()
227 n = seq->count > size ? size : seq->count; in dfs_seq_read()
228 rt_memcpy((char *)buf + copied, seq->buf + seq->from, n); in dfs_seq_read()
230 seq->count -= n; in dfs_seq_read()
231 seq->from += n; in dfs_seq_read()
233 if (seq->count) /* hadn't managed to copy everything */ in dfs_seq_read()
237 seq->from = 0; in dfs_seq_read()
238 p = seq->ops->start(seq, &seq->index); in dfs_seq_read()
241 err = seq->ops->show(seq, p); in dfs_seq_read()
245 seq->count = 0; in dfs_seq_read()
246 if (!seq->count) in dfs_seq_read()
248 p = seq->ops->next(seq, p, &seq->index); in dfs_seq_read()
251 if (!dfs_seq_is_full(seq)) /* got it */ in dfs_seq_read()
254 seq->ops->stop(seq, p); in dfs_seq_read()
255 rt_free(seq->buf); in dfs_seq_read()
256 seq->count = 0; in dfs_seq_read()
257 seq->buf = dfs_seq_alloc(seq->size <<= 1); in dfs_seq_read()
258 if (!seq->buf) in dfs_seq_read()
260 p = seq->ops->start(seq, &seq->index); in dfs_seq_read()
263 seq->ops->stop(seq, p); in dfs_seq_read()
264 seq->count = 0; in dfs_seq_read()
272 size_t offs = seq->count; in dfs_seq_read()
273 off_t pos = seq->index; in dfs_seq_read()
275 p = seq->ops->next(seq, p, &seq->index); in dfs_seq_read()
276 if (pos == seq->index) in dfs_seq_read()
278 LOG_W(".next function %p did not update position index\n", seq->ops->next); in dfs_seq_read()
279 seq->index++; in dfs_seq_read()
283 if (seq->count >= size) in dfs_seq_read()
285 err = seq->ops->show(seq, p); in dfs_seq_read()
288 seq->count = offs; in dfs_seq_read()
290 else if (err || dfs_seq_is_full(seq)) in dfs_seq_read()
292 seq->count = offs; in dfs_seq_read()
296 seq->ops->stop(seq, p); in dfs_seq_read()
297 n = seq->count > size ? size : seq->count; in dfs_seq_read()
298 rt_memcpy((char *)buf + copied, seq->buf, n); in dfs_seq_read()
301 seq->count -= n; in dfs_seq_read()
302 seq->from = n; in dfs_seq_read()
306 copied = seq->count ? -EFAULT : err; in dfs_seq_read()
311 seq->read_pos += copied; in dfs_seq_read()
313 rt_mutex_release(&seq->lock); in dfs_seq_read()
333 struct dfs_seq_file *seq = file->data; in dfs_seq_lseek() local
336 rt_mutex_take(&seq->lock, RT_WAITING_FOREVER); in dfs_seq_lseek()
346 if (offset != seq->read_pos) in dfs_seq_lseek()
348 while ((retval = dfs_seq_traverse(seq, offset)) == -EAGAIN); in dfs_seq_lseek()
353 seq->read_pos = 0; in dfs_seq_lseek()
354 seq->index = 0; in dfs_seq_lseek()
355 seq->count = 0; in dfs_seq_lseek()
359 seq->read_pos = offset; in dfs_seq_lseek()
365 rt_mutex_release(&seq->lock); in dfs_seq_lseek()
379 struct dfs_seq_file *seq = file->data; in dfs_seq_release() local
381 if (seq) in dfs_seq_release()
383 rt_mutex_detach(&seq->lock); in dfs_seq_release()
384 if (seq->buf) in dfs_seq_release()
386 rt_free(seq->buf); in dfs_seq_release()
388 rt_free(seq); in dfs_seq_release()
405 void dfs_seq_vprintf(struct dfs_seq_file *seq, const char *f, va_list args) in dfs_seq_vprintf() argument
409 if (seq->count < seq->size) in dfs_seq_vprintf()
411 len = vsnprintf(seq->buf + seq->count, seq->size - seq->count, f, args); in dfs_seq_vprintf()
412 if (seq->count + len < seq->size) in dfs_seq_vprintf()
414 seq->count += len; in dfs_seq_vprintf()
418 dfs_seq_overflow(seq); in dfs_seq_vprintf()
428 void dfs_seq_printf(struct dfs_seq_file *seq, const char *f, ...) in dfs_seq_printf() argument
433 dfs_seq_vprintf(seq, f, args); in dfs_seq_printf()
443 void dfs_seq_putc(struct dfs_seq_file *seq, char c) in dfs_seq_putc() argument
445 if (seq->count < seq->size) in dfs_seq_putc()
447 seq->buf[seq->count++] = c; in dfs_seq_putc()
457 void dfs_seq_puts(struct dfs_seq_file *seq, const char *s) in dfs_seq_puts() argument
461 if (seq->count + len >= seq->size) in dfs_seq_puts()
463 dfs_seq_overflow(seq); in dfs_seq_puts()
466 rt_memcpy(seq->buf + seq->count, s, len); in dfs_seq_puts()
467 seq->count += len; in dfs_seq_puts()
479 int dfs_seq_write(struct dfs_seq_file *seq, const void *data, size_t len) in dfs_seq_write() argument
481 if (seq->count + len < seq->size) in dfs_seq_write()
483 rt_memcpy(seq->buf + seq->count, data, len); in dfs_seq_write()
484 seq->count += len; in dfs_seq_write()
487 dfs_seq_overflow(seq); in dfs_seq_write()
497 void dfs_seq_pad(struct dfs_seq_file *seq, char c) in dfs_seq_pad() argument
499 int size = seq->pad_until - seq->count; in dfs_seq_pad()
503 if (size + seq->count > seq->size) in dfs_seq_pad()
505 dfs_seq_overflow(seq); in dfs_seq_pad()
508 rt_memset(seq->buf + seq->count, ' ', size); in dfs_seq_pad()
509 seq->count += size; in dfs_seq_pad()
514 dfs_seq_putc(seq, c); in dfs_seq_pad()