Skip to content

Commit b2dac9e

Browse files
committed
Merge: netfs: Fix unbuffered write error handling
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-10/-/merge_requests/1371 - Fix unbuffered write error handling in netfslib JIRA: https://issues.redhat.com/browse/RHEL-104442 Signed-off-by: Paulo Alcantara <paalcant@redhat.com> Approved-by: Scott Mayhew <smayhew@redhat.com> Approved-by: David Howells <dhowells@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Approved-by: Jay Shin <jaeshin@redhat.com> Merged-by: Scott Weaver <scweaver@redhat.com>
2 parents 9504836 + ab4573f commit b2dac9e

File tree

5 files changed

+17
-5
lines changed

5 files changed

+17
-5
lines changed

fs/netfs/read_collect.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,8 +281,10 @@ static void netfs_collect_read_results(struct netfs_io_request *rreq)
281281
} else if (test_bit(NETFS_RREQ_SHORT_TRANSFER, &rreq->flags)) {
282282
notes |= MADE_PROGRESS;
283283
} else {
284-
if (!stream->failed)
284+
if (!stream->failed) {
285285
stream->transferred += transferred;
286+
stream->transferred_valid = true;
287+
}
286288
if (front->transferred < front->len)
287289
set_bit(NETFS_RREQ_SHORT_TRANSFER, &rreq->flags);
288290
notes |= MADE_PROGRESS;

fs/netfs/write_collect.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ static void netfs_collect_write_results(struct netfs_io_request *wreq)
254254
if (front->start + front->transferred > stream->collected_to) {
255255
stream->collected_to = front->start + front->transferred;
256256
stream->transferred = stream->collected_to - wreq->start;
257+
stream->transferred_valid = true;
257258
notes |= MADE_PROGRESS;
258259
}
259260
if (test_bit(NETFS_SREQ_FAILED, &front->flags)) {
@@ -356,6 +357,7 @@ bool netfs_write_collection(struct netfs_io_request *wreq)
356357
{
357358
struct netfs_inode *ictx = netfs_inode(wreq->inode);
358359
size_t transferred;
360+
bool transferred_valid = false;
359361
int s;
360362

361363
_enter("R=%x", wreq->debug_id);
@@ -376,12 +378,16 @@ bool netfs_write_collection(struct netfs_io_request *wreq)
376378
continue;
377379
if (!list_empty(&stream->subrequests))
378380
return false;
379-
if (stream->transferred < transferred)
381+
if (stream->transferred_valid &&
382+
stream->transferred < transferred) {
380383
transferred = stream->transferred;
384+
transferred_valid = true;
385+
}
381386
}
382387

383388
/* Okay, declare that all I/O is complete. */
384-
wreq->transferred = transferred;
389+
if (transferred_valid)
390+
wreq->transferred = transferred;
385391
trace_netfs_rreq(wreq, netfs_rreq_trace_write_done);
386392

387393
if (wreq->io_streams[1].active &&

fs/netfs/write_issue.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,12 @@ struct netfs_io_request *netfs_create_write_req(struct address_space *mapping,
118118
wreq->io_streams[0].prepare_write = ictx->ops->prepare_write;
119119
wreq->io_streams[0].issue_write = ictx->ops->issue_write;
120120
wreq->io_streams[0].collected_to = start;
121-
wreq->io_streams[0].transferred = LONG_MAX;
121+
wreq->io_streams[0].transferred = 0;
122122

123123
wreq->io_streams[1].stream_nr = 1;
124124
wreq->io_streams[1].source = NETFS_WRITE_TO_CACHE;
125125
wreq->io_streams[1].collected_to = start;
126-
wreq->io_streams[1].transferred = LONG_MAX;
126+
wreq->io_streams[1].transferred = 0;
127127
if (fscache_resources_valid(&wreq->cache_resources)) {
128128
wreq->io_streams[1].avail = true;
129129
wreq->io_streams[1].active = true;

fs/splice.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,9 @@ iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
744744
sd.pos = kiocb.ki_pos;
745745
if (ret <= 0)
746746
break;
747+
WARN_ONCE(ret > sd.total_len - left,
748+
"Splice Exceeded! ret=%zd tot=%zu left=%zu\n",
749+
ret, sd.total_len, left);
747750

748751
sd.num_spliced += ret;
749752
sd.total_len -= ret;

include/linux/netfs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ struct netfs_io_stream {
150150
bool active; /* T if stream is active */
151151
bool need_retry; /* T if this stream needs retrying */
152152
bool failed; /* T if this stream failed */
153+
bool transferred_valid; /* T is ->transferred is valid */
153154
};
154155

155156
/*

0 commit comments

Comments
 (0)