aboutsummaryrefslogtreecommitdiffstats
path: root/lib/fuse_lowlevel.c
diff options
context:
space:
mode:
authorBernd Schubert <bschubert@ddn.com>2025-03-11 22:21:09 +0100
committerBernd Schubert <bernd@bsbernd.com>2025-04-15 00:50:26 +0200
commit42a8b7614da0e0151b38e276b1cb6c6832126d50 (patch)
tree0c1632cce76ec00cf9b927af157c165f29cdec09 /lib/fuse_lowlevel.c
parente65395521bae162b72f038f02ccbe5686f7bf88c (diff)
downloadlibfuse-42a8b7614da0e0151b38e276b1cb6c6832126d50.tar.gz
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 <bschubert@ddn.com>
Diffstat (limited to 'lib/fuse_lowlevel.c')
-rw-r--r--lib/fuse_lowlevel.c23
1 files changed, 12 insertions, 11 deletions
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);
}