aboutsummaryrefslogtreecommitdiffstats
path: root/lib/fuse_lowlevel.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/fuse_lowlevel.c')
-rw-r--r--lib/fuse_lowlevel.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index c22b4a2..7df3c7a 100644
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -3026,11 +3026,14 @@ static int _fuse_session_receive_buf(struct fuse_session *se,
{
int err;
ssize_t res;
- size_t bufsize = se->bufsize;
+ size_t bufsize;
#ifdef HAVE_SPLICE
struct fuse_ll_pipe *llp;
struct fuse_buf tmpbuf;
+pipe_retry:
+ bufsize = se->bufsize;
+
if (se->conn.proto_minor < 14 ||
!(se->conn.want_ext & FUSE_CAP_SPLICE_READ))
goto fallback;
@@ -3075,6 +3078,13 @@ static int _fuse_session_receive_buf(struct fuse_session *se,
fuse_session_exit(se);
return 0;
}
+
+ /* FUSE_INIT might have increased the required bufsize */
+ if (err == EINVAL && bufsize < se->bufsize) {
+ fuse_ll_clear_pipe(se);
+ goto pipe_retry;
+ }
+
if (err != EINTR && err != EAGAIN)
perror("fuse: splice from device");
return -err;