fuse_lowlevel FUSE_INIT: Simplify the max_write/bufsize logic

max_write can be limited by se->op.init() and by the buffer size,
we use the minimum of these two.
Required se->bufsize is then set according to the determined
max_write. The current thread will have the old buffer size,
though, as it already had to the allocation to handle the
FUSE_INIT call (unless splice is used and ths variable
and related buffer is not used at all).

The given bufsize is just a hint for minimum size, allocation
could be actually larger (for example to get huge pages).
This commit is contained in:
Bernd Schubert 2024-09-27 20:37:51 +02:00 committed by Bernd Schubert
parent ba7d362d14
commit 2aeef499b8
2 changed files with 9 additions and 5 deletions

View File

@ -9,6 +9,13 @@
#include "fuse.h"
#include "fuse_lowlevel.h"
#define MIN(a, b) \
({ \
typeof(a) _a = (a); \
typeof(b) _b = (b); \
_a < _b ? _a : _b; \
})
struct mount_opts;
struct fuse_req {

View File

@ -2146,11 +2146,8 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
bufsize = FUSE_MIN_READ_BUFFER;
}
if (se->conn.max_write > bufsize - FUSE_BUFFER_HEADER_SIZE)
se->conn.max_write = bufsize - FUSE_BUFFER_HEADER_SIZE;
if (se->conn.max_write < bufsize - FUSE_BUFFER_HEADER_SIZE)
bufsize = se->conn.max_write + FUSE_BUFFER_HEADER_SIZE;
se->bufsize = bufsize;
se->conn.max_write = MIN(se->conn.max_write, bufsize - FUSE_BUFFER_HEADER_SIZE);
se->bufsize = se->conn.max_write + FUSE_BUFFER_HEADER_SIZE;
if (arg->flags & FUSE_MAX_PAGES) {
outarg.flags |= FUSE_MAX_PAGES;