mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
synced 2025-04-19 20:58:31 +09:00
fs/splice: Use pipe_buf() helper to retrieve pipe buffer
Use pipe_buf() helper to retrieve the pipe buffer throughout the file replacing the open-coded the logic. Suggested-by: Oleg Nesterov <oleg@redhat.com> Signed-off-by: K Prateek Nayak <kprateek.nayak@amd.com> Link: https://lore.kernel.org/r/20250307052919.34542-5-kprateek.nayak@amd.com Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
ba0822021c
commit
d5c6cb01b6
40
fs/splice.c
40
fs/splice.c
@ -200,7 +200,6 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe,
|
||||
unsigned int spd_pages = spd->nr_pages;
|
||||
unsigned int tail = pipe->tail;
|
||||
unsigned int head = pipe->head;
|
||||
unsigned int mask = pipe->ring_size - 1;
|
||||
ssize_t ret = 0;
|
||||
int page_nr = 0;
|
||||
|
||||
@ -214,7 +213,7 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe,
|
||||
}
|
||||
|
||||
while (!pipe_full(head, tail, pipe->max_usage)) {
|
||||
struct pipe_buffer *buf = &pipe->bufs[head & mask];
|
||||
struct pipe_buffer *buf = pipe_buf(pipe, head);
|
||||
|
||||
buf->page = spd->pages[page_nr];
|
||||
buf->offset = spd->partial[page_nr].offset;
|
||||
@ -247,7 +246,6 @@ ssize_t add_to_pipe(struct pipe_inode_info *pipe, struct pipe_buffer *buf)
|
||||
{
|
||||
unsigned int head = pipe->head;
|
||||
unsigned int tail = pipe->tail;
|
||||
unsigned int mask = pipe->ring_size - 1;
|
||||
int ret;
|
||||
|
||||
if (unlikely(!pipe->readers)) {
|
||||
@ -256,7 +254,7 @@ ssize_t add_to_pipe(struct pipe_inode_info *pipe, struct pipe_buffer *buf)
|
||||
} else if (pipe_full(head, tail, pipe->max_usage)) {
|
||||
ret = -EAGAIN;
|
||||
} else {
|
||||
pipe->bufs[head & mask] = *buf;
|
||||
*pipe_buf(pipe, head) = *buf;
|
||||
pipe->head = head + 1;
|
||||
return buf->len;
|
||||
}
|
||||
@ -447,11 +445,10 @@ static int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_des
|
||||
{
|
||||
unsigned int head = pipe->head;
|
||||
unsigned int tail = pipe->tail;
|
||||
unsigned int mask = pipe->ring_size - 1;
|
||||
int ret;
|
||||
|
||||
while (!pipe_empty(head, tail)) {
|
||||
struct pipe_buffer *buf = &pipe->bufs[tail & mask];
|
||||
struct pipe_buffer *buf = pipe_buf(pipe, tail);
|
||||
|
||||
sd->len = buf->len;
|
||||
if (sd->len > sd->total_len)
|
||||
@ -495,8 +492,7 @@ static int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_des
|
||||
static inline bool eat_empty_buffer(struct pipe_inode_info *pipe)
|
||||
{
|
||||
unsigned int tail = pipe->tail;
|
||||
unsigned int mask = pipe->ring_size - 1;
|
||||
struct pipe_buffer *buf = &pipe->bufs[tail & mask];
|
||||
struct pipe_buffer *buf = pipe_buf(pipe, tail);
|
||||
|
||||
if (unlikely(!buf->len)) {
|
||||
pipe_buf_release(pipe, buf);
|
||||
@ -690,7 +686,7 @@ iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
|
||||
while (sd.total_len) {
|
||||
struct kiocb kiocb;
|
||||
struct iov_iter from;
|
||||
unsigned int head, tail, mask;
|
||||
unsigned int head, tail;
|
||||
size_t left;
|
||||
int n;
|
||||
|
||||
@ -711,12 +707,11 @@ iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
|
||||
|
||||
head = pipe->head;
|
||||
tail = pipe->tail;
|
||||
mask = pipe->ring_size - 1;
|
||||
|
||||
/* build the vector */
|
||||
left = sd.total_len;
|
||||
for (n = 0; !pipe_empty(head, tail) && left && n < nbufs; tail++) {
|
||||
struct pipe_buffer *buf = &pipe->bufs[tail & mask];
|
||||
struct pipe_buffer *buf = pipe_buf(pipe, tail);
|
||||
size_t this_len = buf->len;
|
||||
|
||||
/* zero-length bvecs are not supported, skip them */
|
||||
@ -752,7 +747,7 @@ iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
|
||||
/* dismiss the fully eaten buffers, adjust the partial one */
|
||||
tail = pipe->tail;
|
||||
while (ret) {
|
||||
struct pipe_buffer *buf = &pipe->bufs[tail & mask];
|
||||
struct pipe_buffer *buf = pipe_buf(pipe, tail);
|
||||
if (ret >= buf->len) {
|
||||
ret -= buf->len;
|
||||
buf->len = 0;
|
||||
@ -809,7 +804,7 @@ ssize_t splice_to_socket(struct pipe_inode_info *pipe, struct file *out,
|
||||
pipe_lock(pipe);
|
||||
|
||||
while (len > 0) {
|
||||
unsigned int head, tail, mask, bc = 0;
|
||||
unsigned int head, tail, bc = 0;
|
||||
size_t remain = len;
|
||||
|
||||
/*
|
||||
@ -846,10 +841,9 @@ ssize_t splice_to_socket(struct pipe_inode_info *pipe, struct file *out,
|
||||
|
||||
head = pipe->head;
|
||||
tail = pipe->tail;
|
||||
mask = pipe->ring_size - 1;
|
||||
|
||||
while (!pipe_empty(head, tail)) {
|
||||
struct pipe_buffer *buf = &pipe->bufs[tail & mask];
|
||||
struct pipe_buffer *buf = pipe_buf(pipe, tail);
|
||||
size_t seg;
|
||||
|
||||
if (!buf->len) {
|
||||
@ -894,7 +888,7 @@ ssize_t splice_to_socket(struct pipe_inode_info *pipe, struct file *out,
|
||||
len -= ret;
|
||||
tail = pipe->tail;
|
||||
while (ret > 0) {
|
||||
struct pipe_buffer *buf = &pipe->bufs[tail & mask];
|
||||
struct pipe_buffer *buf = pipe_buf(pipe, tail);
|
||||
size_t seg = min_t(size_t, ret, buf->len);
|
||||
|
||||
buf->offset += seg;
|
||||
@ -1725,7 +1719,6 @@ static int splice_pipe_to_pipe(struct pipe_inode_info *ipipe,
|
||||
struct pipe_buffer *ibuf, *obuf;
|
||||
unsigned int i_head, o_head;
|
||||
unsigned int i_tail, o_tail;
|
||||
unsigned int i_mask, o_mask;
|
||||
int ret = 0;
|
||||
bool input_wakeup = false;
|
||||
|
||||
@ -1747,9 +1740,7 @@ retry:
|
||||
pipe_double_lock(ipipe, opipe);
|
||||
|
||||
i_tail = ipipe->tail;
|
||||
i_mask = ipipe->ring_size - 1;
|
||||
o_head = opipe->head;
|
||||
o_mask = opipe->ring_size - 1;
|
||||
|
||||
do {
|
||||
size_t o_len;
|
||||
@ -1792,8 +1783,8 @@ retry:
|
||||
goto retry;
|
||||
}
|
||||
|
||||
ibuf = &ipipe->bufs[i_tail & i_mask];
|
||||
obuf = &opipe->bufs[o_head & o_mask];
|
||||
ibuf = pipe_buf(ipipe, i_tail);
|
||||
obuf = pipe_buf(opipe, o_head);
|
||||
|
||||
if (len >= ibuf->len) {
|
||||
/*
|
||||
@ -1862,7 +1853,6 @@ static ssize_t link_pipe(struct pipe_inode_info *ipipe,
|
||||
struct pipe_buffer *ibuf, *obuf;
|
||||
unsigned int i_head, o_head;
|
||||
unsigned int i_tail, o_tail;
|
||||
unsigned int i_mask, o_mask;
|
||||
ssize_t ret = 0;
|
||||
|
||||
/*
|
||||
@ -1873,9 +1863,7 @@ static ssize_t link_pipe(struct pipe_inode_info *ipipe,
|
||||
pipe_double_lock(ipipe, opipe);
|
||||
|
||||
i_tail = ipipe->tail;
|
||||
i_mask = ipipe->ring_size - 1;
|
||||
o_head = opipe->head;
|
||||
o_mask = opipe->ring_size - 1;
|
||||
|
||||
do {
|
||||
if (!opipe->readers) {
|
||||
@ -1896,8 +1884,8 @@ static ssize_t link_pipe(struct pipe_inode_info *ipipe,
|
||||
pipe_full(o_head, o_tail, opipe->max_usage))
|
||||
break;
|
||||
|
||||
ibuf = &ipipe->bufs[i_tail & i_mask];
|
||||
obuf = &opipe->bufs[o_head & o_mask];
|
||||
ibuf = pipe_buf(ipipe, i_tail);
|
||||
obuf = pipe_buf(opipe, o_head);
|
||||
|
||||
/*
|
||||
* Get a reference to this pipe buffer,
|
||||
|
Loading…
x
Reference in New Issue
Block a user