diff options
author | Bernd Schubert <bschubert@ddn.com> | 2025-03-11 22:21:09 +0100 |
---|---|---|
committer | Bernd Schubert <bernd@bsbernd.com> | 2025-04-15 00:50:26 +0200 |
commit | 42a8b7614da0e0151b38e276b1cb6c6832126d50 (patch) | |
tree | 0c1632cce76ec00cf9b927af157c165f29cdec09 /lib/fuse_lowlevel.c | |
parent | e65395521bae162b72f038f02ccbe5686f7bf88c (diff) | |
download | libfuse-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.c | 23 |
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); } |