Ignore:
Timestamp:
Apr 21, 2017, 4:28:29 AM (5 weeks ago)
Author:
brainslayer
Message:

update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-4.9/lib/iov_iter.c

    r31574 r31885  
    735735EXPORT_SYMBOL(iov_iter_advance);
    736736
     737void iov_iter_revert(struct iov_iter *i, size_t unroll)
     738{
     739        if (!unroll)
     740                return;
     741        i->count += unroll;
     742        if (unlikely(i->type & ITER_PIPE)) {
     743                struct pipe_inode_info *pipe = i->pipe;
     744                int idx = i->idx;
     745                size_t off = i->iov_offset;
     746                while (1) {
     747                        size_t n = off - pipe->bufs[idx].offset;
     748                        if (unroll < n) {
     749                                off -= (n - unroll);
     750                                break;
     751                        }
     752                        unroll -= n;
     753                        if (!unroll && idx == i->start_idx) {
     754                                off = 0;
     755                                break;
     756                        }
     757                        if (!idx--)
     758                                idx = pipe->buffers - 1;
     759                        off = pipe->bufs[idx].offset + pipe->bufs[idx].len;
     760                }
     761                i->iov_offset = off;
     762                i->idx = idx;
     763                pipe_truncate(i);
     764                return;
     765        }
     766        if (unroll <= i->iov_offset) {
     767                i->iov_offset -= unroll;
     768                return;
     769        }
     770        unroll -= i->iov_offset;
     771        if (i->type & ITER_BVEC) {
     772                const struct bio_vec *bvec = i->bvec;
     773                while (1) {
     774                        size_t n = (--bvec)->bv_len;
     775                        i->nr_segs++;
     776                        if (unroll <= n) {
     777                                i->bvec = bvec;
     778                                i->iov_offset = n - unroll;
     779                                return;
     780                        }
     781                        unroll -= n;
     782                }
     783        } else { /* same logics for iovec and kvec */
     784                const struct iovec *iov = i->iov;
     785                while (1) {
     786                        size_t n = (--iov)->iov_len;
     787                        i->nr_segs++;
     788                        if (unroll <= n) {
     789                                i->iov = iov;
     790                                i->iov_offset = n - unroll;
     791                                return;
     792                        }
     793                        unroll -= n;
     794                }
     795        }
     796}
     797EXPORT_SYMBOL(iov_iter_revert);
     798
    737799/*
    738800 * Return the count of just the current iov_iter segment.
     
    788850        i->iov_offset = 0;
    789851        i->count = count;
     852        i->start_idx = i->idx;
    790853}
    791854EXPORT_SYMBOL(iov_iter_pipe);
Note: See TracChangeset for help on using the changeset viewer.