aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/fuse_i.h4
-rw-r--r--lib/fuse_lowlevel.c23
-rw-r--r--lib/util.h3
3 files changed, 18 insertions, 12 deletions
diff --git a/lib/fuse_i.h b/lib/fuse_i.h
index ee0d298..23fcaa6 100644
--- a/lib/fuse_i.h
+++ b/lib/fuse_i.h
@@ -82,7 +82,9 @@ struct fuse_session {
* a later version, to 'fix' it at run time.
*/
struct libfuse_version version;
- _Atomic bool buf_reallocable;
+
+ /* true if reading requests from /dev/fuse are handled internally */
+ bool buf_reallocable;
};
struct fuse_chan {
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);
}
diff --git a/lib/util.h b/lib/util.h
index 0c4c258..508fafb 100644
--- a/lib/util.h
+++ b/lib/util.h
@@ -5,6 +5,9 @@
#define ROUND_UP(val, round_to) (((val) + (round_to - 1)) & ~(round_to - 1))
+#define likely(x) __builtin_expect(!!(x), 1)
+#define unlikely(x) __builtin_expect(!!(x), 0)
+
int libfuse_strtol(const char *str, long *res);
/**