Skip to content

Commit 9223687

Browse files
Kent OverstreetAl Viro
authored andcommitted
iov_iter: Move iov_iter to uio.h
Signed-off-by: Kent Overstreet <[email protected]>
1 parent 8142c18 commit 9223687

File tree

2 files changed

+50
-32
lines changed

2 files changed

+50
-32
lines changed

include/linux/fs.h

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -295,38 +295,6 @@ struct page;
295295
struct address_space;
296296
struct writeback_control;
297297

298-
struct iov_iter {
299-
const struct iovec *iov;
300-
unsigned long nr_segs;
301-
size_t iov_offset;
302-
size_t count;
303-
};
304-
305-
size_t iov_iter_copy_from_user_atomic(struct page *page,
306-
struct iov_iter *i, unsigned long offset, size_t bytes);
307-
size_t iov_iter_copy_from_user(struct page *page,
308-
struct iov_iter *i, unsigned long offset, size_t bytes);
309-
void iov_iter_advance(struct iov_iter *i, size_t bytes);
310-
int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes);
311-
size_t iov_iter_single_seg_count(const struct iov_iter *i);
312-
313-
static inline void iov_iter_init(struct iov_iter *i,
314-
const struct iovec *iov, unsigned long nr_segs,
315-
size_t count, size_t written)
316-
{
317-
i->iov = iov;
318-
i->nr_segs = nr_segs;
319-
i->iov_offset = 0;
320-
i->count = count + written;
321-
322-
iov_iter_advance(i, written);
323-
}
324-
325-
static inline size_t iov_iter_count(struct iov_iter *i)
326-
{
327-
return i->count;
328-
}
329-
330298
/*
331299
* "descriptor" for what we're up to with a read.
332300
* This allows us to use the same read code yet

include/linux/uio.h

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,23 @@
99
#ifndef __LINUX_UIO_H
1010
#define __LINUX_UIO_H
1111

12+
#include <linux/kernel.h>
1213
#include <uapi/linux/uio.h>
1314

15+
struct page;
1416

1517
struct kvec {
1618
void *iov_base; /* and that should *never* hold a userland pointer */
1719
size_t iov_len;
1820
};
1921

22+
struct iov_iter {
23+
const struct iovec *iov;
24+
unsigned long nr_segs;
25+
size_t iov_offset;
26+
size_t count;
27+
};
28+
2029
/*
2130
* Total number of bytes covered by an iovec.
2231
*
@@ -34,8 +43,49 @@ static inline size_t iov_length(const struct iovec *iov, unsigned long nr_segs)
3443
return ret;
3544
}
3645

46+
static inline struct iovec iov_iter_iovec(const struct iov_iter *iter)
47+
{
48+
return (struct iovec) {
49+
.iov_base = iter->iov->iov_base + iter->iov_offset,
50+
.iov_len = min(iter->count,
51+
iter->iov->iov_len - iter->iov_offset),
52+
};
53+
}
54+
55+
#define iov_for_each(iov, iter, start) \
56+
for (iter = (start); \
57+
(iter).count && \
58+
((iov = iov_iter_iovec(&(iter))), 1); \
59+
iov_iter_advance(&(iter), (iov).iov_len))
60+
3761
unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to);
3862

63+
size_t iov_iter_copy_from_user_atomic(struct page *page,
64+
struct iov_iter *i, unsigned long offset, size_t bytes);
65+
size_t iov_iter_copy_from_user(struct page *page,
66+
struct iov_iter *i, unsigned long offset, size_t bytes);
67+
void iov_iter_advance(struct iov_iter *i, size_t bytes);
68+
int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes);
69+
size_t iov_iter_single_seg_count(const struct iov_iter *i);
70+
71+
static inline void iov_iter_init(struct iov_iter *i,
72+
const struct iovec *iov, unsigned long nr_segs,
73+
size_t count, size_t written)
74+
{
75+
i->iov = iov;
76+
i->nr_segs = nr_segs;
77+
i->iov_offset = 0;
78+
i->count = count + written;
79+
80+
iov_iter_advance(i, written);
81+
}
82+
83+
static inline size_t iov_iter_count(struct iov_iter *i)
84+
{
85+
return i->count;
86+
}
87+
3988
int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len);
4089
int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len);
90+
4191
#endif

0 commit comments

Comments
 (0)