From e572050d3fc3a1d6a08bfd6cd512edfaff48c9d2 Mon Sep 17 00:00:00 2001 From: amosonn Date: Fri, 3 Mar 2017 21:44:59 +0100 Subject: [PATCH] Optimize fuse_fs_read. (#145) Redundant copy when only op.read is available removed. --- lib/fuse.c | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/lib/fuse.c b/lib/fuse.c index ab5a593..d08bc49 100644 --- a/lib/fuse.c +++ b/lib/fuse.c @@ -1734,19 +1734,43 @@ int fuse_fs_read_buf(struct fuse_fs *fs, const char *path, int fuse_fs_read(struct fuse_fs *fs, const char *path, char *mem, size_t size, off_t off, struct fuse_file_info *fi) { - int res; - struct fuse_bufvec *buf = NULL; + fuse_get_context()->private_data = fs->user_data; + if (fs->op.read || fs->op.read_buf) { + int res; - res = fuse_fs_read_buf(fs, path, &buf, size, off, fi); - if (res == 0) { - struct fuse_bufvec dst = FUSE_BUFVEC_INIT(size); + if (fs->debug) + fprintf(stderr, + "read[%llu] %zu bytes from %llu flags: 0x%x\n", + (unsigned long long) fi->fh, + size, (unsigned long long) off, fi->flags); - dst.buf[0].mem = mem; - res = fuse_buf_copy(&dst, buf, 0); - } - fuse_free_buf(buf); + if (fs->op.read_buf) { + struct fuse_bufvec *buf = NULL; - return res; + res = fs->op.read_buf(path, &buf, size, off, fi); + if (res == 0) { + struct fuse_bufvec dst = FUSE_BUFVEC_INIT(size); + + dst.buf[0].mem = mem; + res = fuse_buf_copy(&dst, buf, 0); + } + fuse_free_buf(buf); + } else { + res = fs->op.read(path, mem, size, off, fi); + } + + if (fs->debug && res >= 0) + fprintf(stderr, " read[%llu] %u bytes from %llu\n", + (unsigned long long) fi->fh, + res, + (unsigned long long) off); + if (res >= 0 && res > (int) size) + fprintf(stderr, "fuse: read too many bytes\n"); + + return res; + } else { + return -ENOSYS; + } } int fuse_fs_write_buf(struct fuse_fs *fs, const char *path, -- 2.30.2