From 42a8b7614da0e0151b38e276b1cb6c6832126d50 Mon Sep 17 00:00:00 2001 From: Bernd Schubert Date: Tue, 11 Mar 2025 22:21:09 +0100 Subject: fuse_lowlevel: Simplify se->buf_reallocable se->buf_reallocable is true when reading /dev/fuse is handled from internal functions - we can set the variable in fuse_session_receive_buf_internal(). With that we also don't need to have it an _Atomic variable anymore. In _fuse_session_receive_buf() we can use "bool internal" to check if the buffer can be re-allocated. Signed-off-by: Bernd Schubert --- lib/fuse_lowlevel.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'lib/fuse_lowlevel.c') diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c index 7df3c7a..17bc816 100644 --- a/lib/fuse_lowlevel.c +++ b/lib/fuse_lowlevel.c @@ -3120,8 +3120,6 @@ pipe_retry: return -ENOMEM; } buf->mem_size = se->bufsize; - if (internal) - se->buf_reallocable = true; } buf->size = se->bufsize; buf->flags = 0; @@ -3161,13 +3159,9 @@ fallback: return -ENOMEM; } buf->mem_size = se->bufsize; - if (internal) - se->buf_reallocable = true; } restart: - if (se->buf_reallocable) - bufsize = buf->mem_size; if (se->io != NULL) { /* se->io->read is never NULL if se->io is not NULL as specified by fuse_session_custom_io()*/ @@ -3181,9 +3175,10 @@ restart: if (fuse_session_exited(se)) return 0; if (res == -1) { - if (err == EINVAL && se->buf_reallocable && - se->bufsize > buf->mem_size) { - void *newbuf = buf_alloc(se->bufsize, internal); + if (err == EINVAL && internal && se->bufsize > buf->mem_size) { + /* FUSE_INIT might have increased the required bufsize */ + bufsize = se->bufsize; + void *newbuf = buf_alloc(bufsize, internal); if (!newbuf) { fuse_log( FUSE_LOG_ERR, @@ -3192,8 +3187,7 @@ restart: } fuse_buf_free(buf); buf->mem = newbuf; - buf->mem_size = se->bufsize; - se->buf_reallocable = true; + buf->mem_size = bufsize; goto restart; } @@ -3235,6 +3229,13 @@ int fuse_session_receive_buf_internal(struct fuse_session *se, struct fuse_buf *buf, struct fuse_chan *ch) { + /* + * if run internally thread buffers are from libfuse - we can + * reallocate them + */ + if (unlikely(!se->got_init) && !se->buf_reallocable) + se->buf_reallocable = true; + return _fuse_session_receive_buf(se, buf, ch, true); } -- cgit v1.2.3