linux/fs/seq_file.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * linux/fs/seq_file.c
   4 *
   5 * helper functions for making synthetic files from sequences of records.
   6 * initial implementation -- AV, Oct 2001.
   7 */
   8
   9#include <linux/cache.h>
  10#include <linux/fs.h>
  11#include <linux/export.h>
  12#include <linux/seq_file.h>
  13#include <linux/vmalloc.h>
  14#include <linux/slab.h>
  15#include <linux/cred.h>
  16#include <linux/mm.h>
  17#include <linux/printk.h>
  18#include <linux/string_helpers.h>
  19
  20#include <linux/uaccess.h>
  21#include <asm/page.h>
  22
  23static struct kmem_cache *seq_file_cache __ro_after_init;
  24
  25static void seq_set_overflow(struct seq_file *m)
  26{
  27        m->count = m->size;
  28}
  29
  30static void *seq_buf_alloc(unsigned long size)
  31{
  32        return kvmalloc(size, GFP_KERNEL_ACCOUNT);
  33}
  34
  35/**
  36 *      seq_open -      initialize sequential file
  37 *      @file: file we initialize
  38 *      @op: method table describing the sequence
  39 *
  40 *      seq_open() sets @file, associating it with a sequence described
  41 *      by @op.  @op->start() sets the iterator up and returns the first
  42 *      element of sequence. @op->stop() shuts it down.  @op->next()
  43 *      returns the next element of sequence.  @op->show() prints element
  44 *      into the buffer.  In case of error ->start() and ->next() return
  45 *      ERR_PTR(error).  In the end of sequence they return %NULL. ->show()
  46 *      returns 0 in case of success and negative number in case of error.
  47 *      Returning SEQ_SKIP means "discard this element and move on".
  48 *      Note: seq_open() will allocate a struct seq_file and store its
  49 *      pointer in @file->private_data. This pointer should not be modified.
  50 */
  51int seq_open(struct file *file, const struct seq_operations *op)
  52{
  53        struct seq_file *p;
  54
  55        WARN_ON(file->private_data);
  56
  57        p = kmem_cache_zalloc(seq_file_cache, GFP_KERNEL);
  58        if (!p)
  59                return -ENOMEM;
  60
  61        file->private_data = p;
  62
  63        mutex_init(&p->lock);
  64        p->op = op;
  65
  66        // No refcounting: the lifetime of 'p' is constrained
  67        // to the lifetime of the file.
  68        p->file = file;
  69
  70        /*
  71         * Wrappers around seq_open(e.g. swaps_open) need to be
  72         * aware of this. If they set f_version themselves, they
  73         * should call seq_open first and then set f_version.
  74         */
  75        file->f_version = 0;
  76
  77        /*
  78         * seq_files support lseek() and pread().  They do not implement
  79         * write() at all, but we clear FMODE_PWRITE here for historical
  80         * reasons.
  81         *
  82         * If a client of seq_files a) implements file.write() and b) wishes to
  83         * support pwrite() then that client will need to implement its own
  84         * file.open() which calls seq_open() and then sets FMODE_PWRITE.
  85         */
  86        file->f_mode &= ~FMODE_PWRITE;
  87        return 0;
  88}
  89EXPORT_SYMBOL(seq_open);
  90
  91static int traverse(struct seq_file *m, loff_t offset)
  92{
  93        loff_t pos = 0;
  94        int error = 0;
  95        void *p;
  96
  97        m->version = 0;
  98        m->index = 0;
  99        m->count = m->from = 0;
 100        if (!offset)
 101                return 0;
 102
 103        if (!m->buf) {
 104                m->buf = seq_buf_alloc(m->size = PAGE_SIZE);
 105                if (!m->buf)
 106                        return -ENOMEM;
 107        }
 108        p = m->op->start(m, &m->index);
 109        while (p) {
 110                error = PTR_ERR(p);
 111                if (IS_ERR(p))
 112                        break;
 113                error = m->op->show(m, p);
 114                if (error < 0)
 115                        break;
 116                if (unlikely(error)) {
 117                        error = 0;
 118                        m->count = 0;
 119                }
 120                if (seq_has_overflowed(m))
 121                        goto Eoverflow;
 122                if (pos + m->count > offset) {
 123                        m->from = offset - pos;
 124                        m->count -= m->from;
 125                        break;
 126                }
 127                pos += m->count;
 128                m->count = 0;
 129                p = m->op->next(m, p, &m->index);
 130                if (pos == offset)
 131                        break;
 132        }
 133        m->op->stop(m, p);
 134        return error;
 135
 136Eoverflow:
 137        m->op->stop(m, p);
 138        kvfree(m->buf);
 139        m->count = 0;
 140        m->buf = seq_buf_alloc(m->size <<= 1);
 141        return !m->buf ? -ENOMEM : -EAGAIN;
 142}
 143
 144/**
 145 *      seq_read -      ->read() method for sequential files.
 146 *      @file: the file to read from
 147 *      @buf: the buffer to read to
 148 *      @size: the maximum number of bytes to read
 149 *      @ppos: the current position in the file
 150 *
 151 *      Ready-made ->f_op->read()
 152 */
 153ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
 154{
 155        struct seq_file *m = file->private_data;
 156        size_t copied = 0;
 157        size_t n;
 158        void *p;
 159        int err = 0;
 160
 161        mutex_lock(&m->lock);
 162
 163        /*
 164         * seq_file->op->..m_start/m_stop/m_next may do special actions
 165         * or optimisations based on the file->f_version, so we want to
 166         * pass the file->f_version to those methods.
 167         *
 168         * seq_file->version is just copy of f_version, and seq_file
 169         * methods can treat it simply as file version.
 170         * It is copied in first and copied out after all operations.
 171         * It is convenient to have it as  part of structure to avoid the
 172         * need of passing another argument to all the seq_file methods.
 173         */
 174        m->version = file->f_version;
 175
 176        /*
 177         * if request is to read from zero offset, reset iterator to first
 178         * record as it might have been already advanced by previous requests
 179         */
 180        if (*ppos == 0) {
 181                m->index = 0;
 182                m->version = 0;
 183                m->count = 0;
 184        }
 185
 186        /* Don't assume *ppos is where we left it */
 187        if (unlikely(*ppos != m->read_pos)) {
 188                while ((err = traverse(m, *ppos)) == -EAGAIN)
 189                        ;
 190                if (err) {
 191                        /* With prejudice... */
 192                        m->read_pos = 0;
 193                        m->version = 0;
 194                        m->index = 0;
 195                        m->count = 0;
 196                        goto Done;
 197                } else {
 198                        m->read_pos = *ppos;
 199                }
 200        }
 201
 202        /* grab buffer if we didn't have one */
 203        if (!m->buf) {
 204                m->buf = seq_buf_alloc(m->size = PAGE_SIZE);
 205                if (!m->buf)
 206                        goto Enomem;
 207        }
 208        /* if not empty - flush it first */
 209        if (m->count) {
 210                n = min(m->count, size);
 211                err = copy_to_user(buf, m->buf + m->from, n);
 212                if (err)
 213                        goto Efault;
 214                m->count -= n;
 215                m->from += n;
 216                size -= n;
 217                buf += n;
 218                copied += n;
 219                if (!size)
 220                        goto Done;
 221        }
 222        /* we need at least one record in buffer */
 223        m->from = 0;
 224        p = m->op->start(m, &m->index);
 225        while (1) {
 226                err = PTR_ERR(p);
 227                if (!p || IS_ERR(p))
 228                        break;
 229                err = m->op->show(m, p);
 230                if (err < 0)
 231                        break;
 232                if (unlikely(err))
 233                        m->count = 0;
 234                if (unlikely(!m->count)) {
 235                        p = m->op->next(m, p, &m->index);
 236                        continue;
 237                }
 238                if (m->count < m->size)
 239                        goto Fill;
 240                m->op->stop(m, p);
 241                kvfree(m->buf);
 242                m->count = 0;
 243                m->buf = seq_buf_alloc(m->size <<= 1);
 244                if (!m->buf)
 245                        goto Enomem;
 246                m->version = 0;
 247                p = m->op->start(m, &m->index);
 248        }
 249        m->op->stop(m, p);
 250        m->count = 0;
 251        goto Done;
 252Fill:
 253        /* they want more? let's try to get some more */
 254        while (1) {
 255                size_t offs = m->count;
 256                loff_t pos = m->index;
 257
 258                p = m->op->next(m, p, &m->index);
 259                if (pos == m->index)
 260                        /* Buggy ->next function */
 261                        m->index++;
 262                if (!p || IS_ERR(p)) {
 263                        err = PTR_ERR(p);
 264                        break;
 265                }
 266                if (m->count >= size)
 267                        break;
 268                err = m->op->show(m, p);
 269                if (seq_has_overflowed(m) || err) {
 270                        m->count = offs;
 271                        if (likely(err <= 0))
 272                                break;
 273                }
 274        }
 275        m->op->stop(m, p);
 276        n = min(m->count, size);
 277        err = copy_to_user(buf, m->buf, n);
 278        if (err)
 279                goto Efault;
 280        copied += n;
 281        m->count -= n;
 282        m->from = n;
 283Done:
 284        if (!copied)
 285                copied = err;
 286        else {
 287                *ppos += copied;
 288                m->read_pos += copied;
 289        }
 290        file->f_version = m->version;
 291        mutex_unlock(&m->lock);
 292        return copied;
 293Enomem:
 294        err = -ENOMEM;
 295        goto Done;
 296Efault:
 297        err = -EFAULT;
 298        goto Done;
 299}
 300EXPORT_SYMBOL(seq_read);
 301
 302/**
 303 *      seq_lseek -     ->llseek() method for sequential files.
 304 *      @file: the file in question
 305 *      @offset: new position
 306 *      @whence: 0 for absolute, 1 for relative position
 307 *
 308 *      Ready-made ->f_op->llseek()
 309 */
 310loff_t seq_lseek(struct file *file, loff_t offset, int whence)
 311{
 312        struct seq_file *m = file->private_data;
 313        loff_t retval = -EINVAL;
 314
 315        mutex_lock(&m->lock);
 316        m->version = file->f_version;
 317        switch (whence) {
 318        case SEEK_CUR:
 319                offset += file->f_pos;
 320                /* fall through */
 321        case SEEK_SET:
 322                if (offset < 0)
 323                        break;
 324                retval = offset;
 325                if (offset != m->read_pos) {
 326                        while ((retval = traverse(m, offset)) == -EAGAIN)
 327                                ;
 328                        if (retval) {
 329                                /* with extreme prejudice... */
 330                                file->f_pos = 0;
 331                                m->read_pos = 0;
 332                                m->version = 0;
 333                                m->index = 0;
 334                                m->count = 0;
 335                        } else {
 336                                m->read_pos = offset;
 337                                retval = file->f_pos = offset;
 338                        }
 339                } else {
 340                        file->f_pos = offset;
 341                }
 342        }
 343        file->f_version = m->version;
 344        mutex_unlock(&m->lock);
 345        return retval;
 346}
 347EXPORT_SYMBOL(seq_lseek);
 348
 349/**
 350 *      seq_release -   free the structures associated with sequential file.
 351 *      @file: file in question
 352 *      @inode: its inode
 353 *
 354 *      Frees the structures associated with sequential file; can be used
 355 *      as ->f_op->release() if you don't have private data to destroy.
 356 */
 357int seq_release(struct inode *inode, struct file *file)
 358{
 359        struct seq_file *m = file->private_data;
 360        kvfree(m->buf);
 361        kmem_cache_free(seq_file_cache, m);
 362        return 0;
 363}
 364EXPORT_SYMBOL(seq_release);
 365
 366/**
 367 *      seq_escape -    print string into buffer, escaping some characters
 368 *      @m:     target buffer
 369 *      @s:     string
 370 *      @esc:   set of characters that need escaping
 371 *
 372 *      Puts string into buffer, replacing each occurrence of character from
 373 *      @esc with usual octal escape.
 374 *      Use seq_has_overflowed() to check for errors.
 375 */
 376void seq_escape(struct seq_file *m, const char *s, const char *esc)
 377{
 378        char *buf;
 379        size_t size = seq_get_buf(m, &buf);
 380        int ret;
 381
 382        ret = string_escape_str(s, buf, size, ESCAPE_OCTAL, esc);
 383        seq_commit(m, ret < size ? ret : -1);
 384}
 385EXPORT_SYMBOL(seq_escape);
 386
 387void seq_vprintf(struct seq_file *m, const char *f, va_list args)
 388{
 389        int len;
 390
 391        if (m->count < m->size) {
 392                len = vsnprintf(m->buf + m->count, m->size - m->count, f, args);
 393                if (m->count + len < m->size) {
 394                        m->count += len;
 395                        return;
 396                }
 397        }
 398        seq_set_overflow(m);
 399}
 400EXPORT_SYMBOL(seq_vprintf);
 401
 402void seq_printf(struct seq_file *m, const char *f, ...)
 403{
 404        va_list args;
 405
 406        va_start(args, f);
 407        seq_vprintf(m, f, args);
 408        va_end(args);
 409}
 410EXPORT_SYMBOL(seq_printf);
 411
 412/**
 413 *      mangle_path -   mangle and copy path to buffer beginning
 414 *      @s: buffer start
 415 *      @p: beginning of path in above buffer
 416 *      @esc: set of characters that need escaping
 417 *
 418 *      Copy the path from @p to @s, replacing each occurrence of character from
 419 *      @esc with usual octal escape.
 420 *      Returns pointer past last written character in @s, or NULL in case of
 421 *      failure.
 422 */
 423char *mangle_path(char *s, const char *p, const char *esc)
 424{
 425        while (s <= p) {
 426                char c = *p++;
 427                if (!c) {
 428                        return s;
 429                } else if (!strchr(esc, c)) {
 430                        *s++ = c;
 431                } else if (s + 4 > p) {
 432                        break;
 433                } else {
 434                        *s++ = '\\';
 435                        *s++ = '0' + ((c & 0300) >> 6);
 436                        *s++ = '0' + ((c & 070) >> 3);
 437                        *s++ = '0' + (c & 07);
 438                }
 439        }
 440        return NULL;
 441}
 442EXPORT_SYMBOL(mangle_path);
 443
 444/**
 445 * seq_path - seq_file interface to print a pathname
 446 * @m: the seq_file handle
 447 * @path: the struct path to print
 448 * @esc: set of characters to escape in the output
 449 *
 450 * return the absolute path of 'path', as represented by the
 451 * dentry / mnt pair in the path parameter.
 452 */
 453int seq_path(struct seq_file *m, const struct path *path, const char *esc)
 454{
 455        char *buf;
 456        size_t size = seq_get_buf(m, &buf);
 457        int res = -1;
 458
 459        if (size) {
 460                char *p = d_path(path, buf, size);
 461                if (!IS_ERR(p)) {
 462                        char *end = mangle_path(buf, p, esc);
 463                        if (end)
 464                                res = end - buf;
 465                }
 466        }
 467        seq_commit(m, res);
 468
 469        return res;
 470}
 471EXPORT_SYMBOL(seq_path);
 472
 473/**
 474 * seq_file_path - seq_file interface to print a pathname of a file
 475 * @m: the seq_file handle
 476 * @file: the struct file to print
 477 * @esc: set of characters to escape in the output
 478 *
 479 * return the absolute path to the file.
 480 */
 481int seq_file_path(struct seq_file *m, struct file *file, const char *esc)
 482{
 483        return seq_path(m, &file->f_path, esc);
 484}
 485EXPORT_SYMBOL(seq_file_path);
 486
 487/*
 488 * Same as seq_path, but relative to supplied root.
 489 */
 490int seq_path_root(struct seq_file *m, const struct path *path,
 491                  const struct path *root, const char *esc)
 492{
 493        char *buf;
 494        size_t size = seq_get_buf(m, &buf);
 495        int res = -ENAMETOOLONG;
 496
 497        if (size) {
 498                char *p;
 499
 500                p = __d_path(path, root, buf, size);
 501                if (!p)
 502                        return SEQ_SKIP;
 503                res = PTR_ERR(p);
 504                if (!IS_ERR(p)) {
 505                        char *end = mangle_path(buf, p, esc);
 506                        if (end)
 507                                res = end - buf;
 508                        else
 509                                res = -ENAMETOOLONG;
 510                }
 511        }
 512        seq_commit(m, res);
 513
 514        return res < 0 && res != -ENAMETOOLONG ? res : 0;
 515}
 516
 517/*
 518 * returns the path of the 'dentry' from the root of its filesystem.
 519 */
 520int seq_dentry(struct seq_file *m, struct dentry *dentry, const char *esc)
 521{
 522        char *buf;
 523        size_t size = seq_get_buf(m, &buf);
 524        int res = -1;
 525
 526        if (size) {
 527                char *p = dentry_path(dentry, buf, size);
 528                if (!IS_ERR(p)) {
 529                        char *end = mangle_path(buf, p, esc);
 530                        if (end)
 531                                res = end - buf;
 532                }
 533        }
 534        seq_commit(m, res);
 535
 536        return res;
 537}
 538EXPORT_SYMBOL(seq_dentry);
 539
 540static void *single_start(struct seq_file *p, loff_t *pos)
 541{
 542        return NULL + (*pos == 0);
 543}
 544
 545static void *single_next(struct seq_file *p, void *v, loff_t *pos)
 546{
 547        ++*pos;
 548        return NULL;
 549}
 550
 551static void single_stop(struct seq_file *p, void *v)
 552{
 553}
 554
 555int single_open(struct file *file, int (*show)(struct seq_file *, void *),
 556                void *data)
 557{
 558        struct seq_operations *op = kmalloc(sizeof(*op), GFP_KERNEL_ACCOUNT);
 559        int res = -ENOMEM;
 560
 561        if (op) {
 562                op->start = single_start;
 563                op->next = single_next;
 564                op->stop = single_stop;
 565                op->show = show;
 566                res = seq_open(file, op);
 567                if (!res)
 568                        ((struct seq_file *)file->private_data)->private = data;
 569                else
 570                        kfree(op);
 571        }
 572        return res;
 573}
 574EXPORT_SYMBOL(single_open);
 575
 576int single_open_size(struct file *file, int (*show)(struct seq_file *, void *),
 577                void *data, size_t size)
 578{
 579        char *buf = seq_buf_alloc(size);
 580        int ret;
 581        if (!buf)
 582                return -ENOMEM;
 583        ret = single_open(file, show, data);
 584        if (ret) {
 585                kvfree(buf);
 586                return ret;
 587        }
 588        ((struct seq_file *)file->private_data)->buf = buf;
 589        ((struct seq_file *)file->private_data)->size = size;
 590        return 0;
 591}
 592EXPORT_SYMBOL(single_open_size);
 593
 594int single_release(struct inode *inode, struct file *file)
 595{
 596        const struct seq_operations *op = ((struct seq_file *)file->private_data)->op;
 597        int res = seq_release(inode, file);
 598        kfree(op);
 599        return res;
 600}
 601EXPORT_SYMBOL(single_release);
 602
 603int seq_release_private(struct inode *inode, struct file *file)
 604{
 605        struct seq_file *seq = file->private_data;
 606
 607        kfree(seq->private);
 608        seq->private = NULL;
 609        return seq_release(inode, file);
 610}
 611EXPORT_SYMBOL(seq_release_private);
 612
 613void *__seq_open_private(struct file *f, const struct seq_operations *ops,
 614                int psize)
 615{
 616        int rc;
 617        void *private;
 618        struct seq_file *seq;
 619
 620        private = kzalloc(psize, GFP_KERNEL_ACCOUNT);
 621        if (private == NULL)
 622                goto out;
 623
 624        rc = seq_open(f, ops);
 625        if (rc < 0)
 626                goto out_free;
 627
 628        seq = f->private_data;
 629        seq->private = private;
 630        return private;
 631
 632out_free:
 633        kfree(private);
 634out:
 635        return NULL;
 636}
 637EXPORT_SYMBOL(__seq_open_private);
 638
 639int seq_open_private(struct file *filp, const struct seq_operations *ops,
 640                int psize)
 641{
 642        return __seq_open_private(filp, ops, psize) ? 0 : -ENOMEM;
 643}
 644EXPORT_SYMBOL(seq_open_private);
 645
 646void seq_putc(struct seq_file *m, char c)
 647{
 648        if (m->count >= m->size)
 649                return;
 650
 651        m->buf[m->count++] = c;
 652}
 653EXPORT_SYMBOL(seq_putc);
 654
 655void seq_puts(struct seq_file *m, const char *s)
 656{
 657        int len = strlen(s);
 658
 659        if (m->count + len >= m->size) {
 660                seq_set_overflow(m);
 661                return;
 662        }
 663        memcpy(m->buf + m->count, s, len);
 664        m->count += len;
 665}
 666EXPORT_SYMBOL(seq_puts);
 667
 668/**
 669 * A helper routine for putting decimal numbers without rich format of printf().
 670 * only 'unsigned long long' is supported.
 671 * @m: seq_file identifying the buffer to which data should be written
 672 * @delimiter: a string which is printed before the number
 673 * @num: the number
 674 * @width: a minimum field width
 675 *
 676 * This routine will put strlen(delimiter) + number into seq_filed.
 677 * This routine is very quick when you show lots of numbers.
 678 * In usual cases, it will be better to use seq_printf(). It's easier to read.
 679 */
 680void seq_put_decimal_ull_width(struct seq_file *m, const char *delimiter,
 681                         unsigned long long num, unsigned int width)
 682{
 683        int len;
 684
 685        if (m->count + 2 >= m->size) /* we'll write 2 bytes at least */
 686                goto overflow;
 687
 688        if (delimiter && delimiter[0]) {
 689                if (delimiter[1] == 0)
 690                        seq_putc(m, delimiter[0]);
 691                else
 692                        seq_puts(m, delimiter);
 693        }
 694
 695        if (!width)
 696                width = 1;
 697
 698        if (m->count + width >= m->size)
 699                goto overflow;
 700
 701        len = num_to_str(m->buf + m->count, m->size - m->count, num, width);
 702        if (!len)
 703                goto overflow;
 704
 705        m->count += len;
 706        return;
 707
 708overflow:
 709        seq_set_overflow(m);
 710}
 711
 712void seq_put_decimal_ull(struct seq_file *m, const char *delimiter,
 713                         unsigned long long num)
 714{
 715        return seq_put_decimal_ull_width(m, delimiter, num, 0);
 716}
 717EXPORT_SYMBOL(seq_put_decimal_ull);
 718
 719/**
 720 * seq_put_hex_ll - put a number in hexadecimal notation
 721 * @m: seq_file identifying the buffer to which data should be written
 722 * @delimiter: a string which is printed before the number
 723 * @v: the number
 724 * @width: a minimum field width
 725 *
 726 * seq_put_hex_ll(m, "", v, 8) is equal to seq_printf(m, "%08llx", v)
 727 *
 728 * This routine is very quick when you show lots of numbers.
 729 * In usual cases, it will be better to use seq_printf(). It's easier to read.
 730 */
 731void seq_put_hex_ll(struct seq_file *m, const char *delimiter,
 732                                unsigned long long v, unsigned int width)
 733{
 734        unsigned int len;
 735        int i;
 736
 737        if (delimiter && delimiter[0]) {
 738                if (delimiter[1] == 0)
 739                        seq_putc(m, delimiter[0]);
 740                else
 741                        seq_puts(m, delimiter);
 742        }
 743
 744        /* If x is 0, the result of __builtin_clzll is undefined */
 745        if (v == 0)
 746                len = 1;
 747        else
 748                len = (sizeof(v) * 8 - __builtin_clzll(v) + 3) / 4;
 749
 750        if (len < width)
 751                len = width;
 752
 753        if (m->count + len > m->size) {
 754                seq_set_overflow(m);
 755                return;
 756        }
 757
 758        for (i = len - 1; i >= 0; i--) {
 759                m->buf[m->count + i] = hex_asc[0xf & v];
 760                v = v >> 4;
 761        }
 762        m->count += len;
 763}
 764
 765void seq_put_decimal_ll(struct seq_file *m, const char *delimiter, long long num)
 766{
 767        int len;
 768
 769        if (m->count + 3 >= m->size) /* we'll write 2 bytes at least */
 770                goto overflow;
 771
 772        if (delimiter && delimiter[0]) {
 773                if (delimiter[1] == 0)
 774                        seq_putc(m, delimiter[0]);
 775                else
 776                        seq_puts(m, delimiter);
 777        }
 778
 779        if (m->count + 2 >= m->size)
 780                goto overflow;
 781
 782        if (num < 0) {
 783                m->buf[m->count++] = '-';
 784                num = -num;
 785        }
 786
 787        if (num < 10) {
 788                m->buf[m->count++] = num + '0';
 789                return;
 790        }
 791
 792        len = num_to_str(m->buf + m->count, m->size - m->count, num, 0);
 793        if (!len)
 794                goto overflow;
 795
 796        m->count += len;
 797        return;
 798
 799overflow:
 800        seq_set_overflow(m);
 801}
 802EXPORT_SYMBOL(seq_put_decimal_ll);
 803
 804/**
 805 * seq_write - write arbitrary data to buffer
 806 * @seq: seq_file identifying the buffer to which data should be written
 807 * @data: data address
 808 * @len: number of bytes
 809 *
 810 * Return 0 on success, non-zero otherwise.
 811 */
 812int seq_write(struct seq_file *seq, const void *data, size_t len)
 813{
 814        if (seq->count + len < seq->size) {
 815                memcpy(seq->buf + seq->count, data, len);
 816                seq->count += len;
 817                return 0;
 818        }
 819        seq_set_overflow(seq);
 820        return -1;
 821}
 822EXPORT_SYMBOL(seq_write);
 823
 824/**
 825 * seq_pad - write padding spaces to buffer
 826 * @m: seq_file identifying the buffer to which data should be written
 827 * @c: the byte to append after padding if non-zero
 828 */
 829void seq_pad(struct seq_file *m, char c)
 830{
 831        int size = m->pad_until - m->count;
 832        if (size > 0) {
 833                if (size + m->count > m->size) {
 834                        seq_set_overflow(m);
 835                        return;
 836                }
 837                memset(m->buf + m->count, ' ', size);
 838                m->count += size;
 839        }
 840        if (c)
 841                seq_putc(m, c);
 842}
 843EXPORT_SYMBOL(seq_pad);
 844
 845/* A complete analogue of print_hex_dump() */
 846void seq_hex_dump(struct seq_file *m, const char *prefix_str, int prefix_type,
 847                  int rowsize, int groupsize, const void *buf, size_t len,
 848                  bool ascii)
 849{
 850        const u8 *ptr = buf;
 851        int i, linelen, remaining = len;
 852        char *buffer;
 853        size_t size;
 854        int ret;
 855
 856        if (rowsize != 16 && rowsize != 32)
 857                rowsize = 16;
 858
 859        for (i = 0; i < len && !seq_has_overflowed(m); i += rowsize) {
 860                linelen = min(remaining, rowsize);
 861                remaining -= rowsize;
 862
 863                switch (prefix_type) {
 864                case DUMP_PREFIX_ADDRESS:
 865                        seq_printf(m, "%s%p: ", prefix_str, ptr + i);
 866                        break;
 867                case DUMP_PREFIX_OFFSET:
 868                        seq_printf(m, "%s%.8x: ", prefix_str, i);
 869                        break;
 870                default:
 871                        seq_printf(m, "%s", prefix_str);
 872                        break;
 873                }
 874
 875                size = seq_get_buf(m, &buffer);
 876                ret = hex_dump_to_buffer(ptr + i, linelen, rowsize, groupsize,
 877                                         buffer, size, ascii);
 878                seq_commit(m, ret < size ? ret : -1);
 879
 880                seq_putc(m, '\n');
 881        }
 882}
 883EXPORT_SYMBOL(seq_hex_dump);
 884
 885struct list_head *seq_list_start(struct list_head *head, loff_t pos)
 886{
 887        struct list_head *lh;
 888
 889        list_for_each(lh, head)
 890                if (pos-- == 0)
 891                        return lh;
 892
 893        return NULL;
 894}
 895EXPORT_SYMBOL(seq_list_start);
 896
 897struct list_head *seq_list_start_head(struct list_head *head, loff_t pos)
 898{
 899        if (!pos)
 900                return head;
 901
 902        return seq_list_start(head, pos - 1);
 903}
 904EXPORT_SYMBOL(seq_list_start_head);
 905
 906struct list_head *seq_list_next(void *v, struct list_head *head, loff_t *ppos)
 907{
 908        struct list_head *lh;
 909
 910        lh = ((struct list_head *)v)->next;
 911        ++*ppos;
 912        return lh == head ? NULL : lh;
 913}
 914EXPORT_SYMBOL(seq_list_next);
 915
 916/**
 917 * seq_hlist_start - start an iteration of a hlist
 918 * @head: the head of the hlist
 919 * @pos:  the start position of the sequence
 920 *
 921 * Called at seq_file->op->start().
 922 */
 923struct hlist_node *seq_hlist_start(struct hlist_head *head, loff_t pos)
 924{
 925        struct hlist_node *node;
 926
 927        hlist_for_each(node, head)
 928                if (pos-- == 0)
 929                        return node;
 930        return NULL;
 931}
 932EXPORT_SYMBOL(seq_hlist_start);
 933
 934/**
 935 * seq_hlist_start_head - start an iteration of a hlist
 936 * @head: the head of the hlist
 937 * @pos:  the start position of the sequence
 938 *
 939 * Called at seq_file->op->start(). Call this function if you want to
 940 * print a header at the top of the output.
 941 */
 942struct hlist_node *seq_hlist_start_head(struct hlist_head *head, loff_t pos)
 943{
 944        if (!pos)
 945                return SEQ_START_TOKEN;
 946
 947        return seq_hlist_start(head, pos - 1);
 948}
 949EXPORT_SYMBOL(seq_hlist_start_head);
 950
 951/**
 952 * seq_hlist_next - move to the next position of the hlist
 953 * @v:    the current iterator
 954 * @head: the head of the hlist
 955 * @ppos: the current position
 956 *
 957 * Called at seq_file->op->next().
 958 */
 959struct hlist_node *seq_hlist_next(void *v, struct hlist_head *head,
 960                                  loff_t *ppos)
 961{
 962        struct hlist_node *node = v;
 963
 964        ++*ppos;
 965        if (v == SEQ_START_TOKEN)
 966                return head->first;
 967        else
 968                return node->next;
 969}
 970EXPORT_SYMBOL(seq_hlist_next);
 971
 972/**
 973 * seq_hlist_start_rcu - start an iteration of a hlist protected by RCU
 974 * @head: the head of the hlist
 975 * @pos:  the start position of the sequence
 976 *
 977 * Called at seq_file->op->start().
 978 *
 979 * This list-traversal primitive may safely run concurrently with
 980 * the _rcu list-mutation primitives such as hlist_add_head_rcu()
 981 * as long as the traversal is guarded by rcu_read_lock().
 982 */
 983struct hlist_node *seq_hlist_start_rcu(struct hlist_head *head,
 984                                       loff_t pos)
 985{
 986        struct hlist_node *node;
 987
 988        __hlist_for_each_rcu(node, head)
 989                if (pos-- == 0)
 990                        return node;
 991        return NULL;
 992}
 993EXPORT_SYMBOL(seq_hlist_start_rcu);
 994
 995/**
 996 * seq_hlist_start_head_rcu - start an iteration of a hlist protected by RCU
 997 * @head: the head of the hlist
 998 * @pos:  the start position of the sequence
 999 *
1000 * Called at seq_file->op->start(). Call this function if you want to
1001 * print a header at the top of the output.
1002 *
1003 * This list-traversal primitive may safely run concurrently with
1004 * the _rcu list-mutation primitives such as hlist_add_head_rcu()
1005 * as long as the traversal is guarded by rcu_read_lock().
1006 */
1007struct hlist_node *seq_hlist_start_head_rcu(struct hlist_head *head,
1008                                            loff_t pos)
1009{
1010        if (!pos)
1011                return SEQ_START_TOKEN;
1012
1013        return seq_hlist_start_rcu(head, pos - 1);
1014}
1015EXPORT_SYMBOL(seq_hlist_start_head_rcu);
1016
1017/**
1018 * seq_hlist_next_rcu - move to the next position of the hlist protected by RCU
1019 * @v:    the current iterator
1020 * @head: the head of the hlist
1021 * @ppos: the current position
1022 *
1023 * Called at seq_file->op->next().
1024 *
1025 * This list-traversal primitive may safely run concurrently with
1026 * the _rcu list-mutation primitives such as hlist_add_head_rcu()
1027 * as long as the traversal is guarded by rcu_read_lock().
1028 */
1029struct hlist_node *seq_hlist_next_rcu(void *v,
1030                                      struct hlist_head *head,
1031                                      loff_t *ppos)
1032{
1033        struct hlist_node *node = v;
1034
1035        ++*ppos;
1036        if (v == SEQ_START_TOKEN)
1037                return rcu_dereference(head->first);
1038        else
1039                return rcu_dereference(node->next);
1040}
1041EXPORT_SYMBOL(seq_hlist_next_rcu);
1042
1043/**
1044 * seq_hlist_start_precpu - start an iteration of a percpu hlist array
1045 * @head: pointer to percpu array of struct hlist_heads
1046 * @cpu:  pointer to cpu "cursor"
1047 * @pos:  start position of sequence
1048 *
1049 * Called at seq_file->op->start().
1050 */
1051struct hlist_node *
1052seq_hlist_start_percpu(struct hlist_head __percpu *head, int *cpu, loff_t pos)
1053{
1054        struct hlist_node *node;
1055
1056        for_each_possible_cpu(*cpu) {
1057                hlist_for_each(node, per_cpu_ptr(head, *cpu)) {
1058                        if (pos-- == 0)
1059                                return node;
1060                }
1061        }
1062        return NULL;
1063}
1064EXPORT_SYMBOL(seq_hlist_start_percpu);
1065
1066/**
1067 * seq_hlist_next_percpu - move to the next position of the percpu hlist array
1068 * @v:    pointer to current hlist_node
1069 * @head: pointer to percpu array of struct hlist_heads
1070 * @cpu:  pointer to cpu "cursor"
1071 * @pos:  start position of sequence
1072 *
1073 * Called at seq_file->op->next().
1074 */
1075struct hlist_node *
1076seq_hlist_next_percpu(void *v, struct hlist_head __percpu *head,
1077                        int *cpu, loff_t *pos)
1078{
1079        struct hlist_node *node = v;
1080
1081        ++*pos;
1082
1083        if (node->next)
1084                return node->next;
1085
1086        for (*cpu = cpumask_next(*cpu, cpu_possible_mask); *cpu < nr_cpu_ids;
1087             *cpu = cpumask_next(*cpu, cpu_possible_mask)) {
1088                struct hlist_head *bucket = per_cpu_ptr(head, *cpu);
1089
1090                if (!hlist_empty(bucket))
1091                        return bucket->first;
1092        }
1093        return NULL;
1094}
1095EXPORT_SYMBOL(seq_hlist_next_percpu);
1096
1097void __init seq_file_init(void)
1098{
1099        seq_file_cache = KMEM_CACHE(seq_file, SLAB_ACCOUNT|SLAB_PANIC);
1100}
1101