From: Aleksandar Markovic <aleksandar.m.mail@gmail.com>
To: "Dr. David Alan Gilbert (git)" <dgilbert@redhat.com>
Cc: "qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
"stefanha@redhat.com" <stefanha@redhat.com>,
"vgoyal@redhat.com" <vgoyal@redhat.com>
Subject: Re: [PATCH 007/104] virtiofsd: Format imported files to qemu style
Date: Thu, 9 Jan 2020 13:21:04 +0100 [thread overview]
Message-ID: <CAL1e-=hfCRVFbppJwJiTCiv=k1BfbzuxRg9NbcRLtxgA33r-uQ@mail.gmail.com> (raw)
In-Reply-To: <20191212163904.159893-8-dgilbert@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 49146 bytes --]
On Thursday, December 12, 2019, Dr. David Alan Gilbert (git) <
dgilbert@redhat.com> wrote:
> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
>
> Mostly using a set like:
>
> indent -nut -i 4 -nlp -br -cs -ce --no-space-after-function-call-names
> file
> clang-format -style=file -i -- file
> clang-tidy -fix-errors -checks=readability-braces-around-statements file
> clang-format -style=file -i -- file
>
> With manual cleanups.
>
> The .clang-format used is below.
>
> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
>
> Language: Cpp
> AlignAfterOpenBracket: Align
> AlignConsecutiveAssignments: false # although we like it, it creates churn
> AlignConsecutiveDeclarations: false
> AlignEscapedNewlinesLeft: true
> AlignOperands: true
> AlignTrailingComments: false # churn
> AllowAllParametersOfDeclarationOnNextLine: true
> AllowShortBlocksOnASingleLine: false
> AllowShortCaseLabelsOnASingleLine: false
> AllowShortFunctionsOnASingleLine: None
> AllowShortIfStatementsOnASingleLine: false
> AllowShortLoopsOnASingleLine: false
> AlwaysBreakAfterReturnType: None # AlwaysBreakAfterDefinitionReturnType
> is taken into account
> AlwaysBreakBeforeMultilineStrings: false
> BinPackArguments: true
> BinPackParameters: true
> BraceWrapping:
> AfterControlStatement: false
> AfterEnum: false
> AfterFunction: true
> AfterStruct: false
> AfterUnion: false
> BeforeElse: false
> IndentBraces: false
> BreakBeforeBinaryOperators: None
> BreakBeforeBraces: Custom
> BreakBeforeTernaryOperators: false
> BreakStringLiterals: true
> ColumnLimit: 80
> ContinuationIndentWidth: 4
> Cpp11BracedListStyle: false
> DerivePointerAlignment: false
> DisableFormat: false
> ForEachMacros: [
> 'CPU_FOREACH',
> 'CPU_FOREACH_REVERSE',
> 'CPU_FOREACH_SAFE',
> 'IOMMU_NOTIFIER_FOREACH',
> 'QLIST_FOREACH',
> 'QLIST_FOREACH_ENTRY',
> 'QLIST_FOREACH_RCU',
> 'QLIST_FOREACH_SAFE',
> 'QLIST_FOREACH_SAFE_RCU',
> 'QSIMPLEQ_FOREACH',
> 'QSIMPLEQ_FOREACH_SAFE',
> 'QSLIST_FOREACH',
> 'QSLIST_FOREACH_SAFE',
> 'QTAILQ_FOREACH',
> 'QTAILQ_FOREACH_REVERSE',
> 'QTAILQ_FOREACH_SAFE',
> 'QTAILQ_RAW_FOREACH',
> 'RAMBLOCK_FOREACH'
> ]
> IncludeCategories:
> - Regex: '^"qemu/osdep.h'
> Priority: -3
> - Regex: '^"(block|chardev|crypto|disas|exec|fpu|hw|io|
> libdecnumber|migration|monitor|net|qapi|qemu|qom|
> standard-headers|sysemu|ui)/'
> Priority: -2
> - Regex: '^"(elf.h|qemu-common.h|glib-
> compat.h|qemu-io.h|trace-tcg.h)'
> Priority: -1
> - Regex: '.*'
> Priority: 1
> IncludeIsMainRegex: '$'
> IndentCaseLabels: false
> IndentWidth: 4
> IndentWrappedFunctionNames: false
> KeepEmptyLinesAtTheStartOfBlocks: false
> MacroBlockBegin: '.*_BEGIN$' # only PREC_BEGIN ?
> MacroBlockEnd: '.*_END$'
> MaxEmptyLinesToKeep: 2
> PointerAlignment: Right
> ReflowComments: true
> SortIncludes: true
> SpaceAfterCStyleCast: false
> SpaceBeforeAssignmentOperators: true
> SpaceBeforeParens: ControlStatements
> SpaceInEmptyParentheses: false
> SpacesBeforeTrailingComments: 1
> SpacesInContainerLiterals: true
> SpacesInParentheses: false
> SpacesInSquareBrackets: false
> Standard: Auto
> UseTab: Never
> ...
> ---
> tools/virtiofsd/buffer.c | 550 ++--
> tools/virtiofsd/fuse.h | 1572 +++++------
> tools/virtiofsd/fuse_common.h | 764 ++---
> tools/virtiofsd/fuse_i.h | 127 +-
> tools/virtiofsd/fuse_log.c | 38 +-
> tools/virtiofsd/fuse_log.h | 32 +-
> tools/virtiofsd/fuse_loop_mt.c | 66 +-
> tools/virtiofsd/fuse_lowlevel.c | 3678 +++++++++++++------------
> tools/virtiofsd/fuse_lowlevel.h | 2401 ++++++++--------
> tools/virtiofsd/fuse_misc.h | 30 +-
> tools/virtiofsd/fuse_opt.c | 659 ++---
> tools/virtiofsd/fuse_opt.h | 79 +-
> tools/virtiofsd/fuse_signals.c | 118 +-
> tools/virtiofsd/helper.c | 517 ++--
> tools/virtiofsd/passthrough_helpers.h | 33 +-
> tools/virtiofsd/passthrough_ll.c | 2063 +++++++-------
> 16 files changed, 6530 insertions(+), 6197 deletions(-)
>
>
Reviewed by: Aleksandar Markovic <amarkovic@wavecomp.com>
> diff --git a/tools/virtiofsd/buffer.c b/tools/virtiofsd/buffer.c
> index 5ab9b87455..38521f5889 100644
> --- a/tools/virtiofsd/buffer.c
> +++ b/tools/virtiofsd/buffer.c
> @@ -1,321 +1,343 @@
> /*
> - FUSE: Filesystem in Userspace
> - Copyright (C) 2010 Miklos Szeredi <miklos@szeredi.hu>
> -
> - Functions for dealing with `struct fuse_buf` and `struct
> - fuse_bufvec`.
> -
> - This program can be distributed under the terms of the GNU LGPLv2.
> - See the file COPYING.LIB
> -*/
> + * FUSE: Filesystem in Userspace
> + * Copyright (C) 2010 Miklos Szeredi <miklos@szeredi.hu>
> + *
> + * Functions for dealing with `struct fuse_buf` and `struct
> + * fuse_bufvec`.
> + *
> + * This program can be distributed under the terms of the GNU LGPLv2.
> + * See the file COPYING.LIB
> + */
>
> #define _GNU_SOURCE
>
> #include "config.h"
> #include "fuse_i.h"
> #include "fuse_lowlevel.h"
> +#include <assert.h>
> +#include <errno.h>
> #include <string.h>
> #include <unistd.h>
> -#include <errno.h>
> -#include <assert.h>
>
> size_t fuse_buf_size(const struct fuse_bufvec *bufv)
> {
> - size_t i;
> - size_t size = 0;
> -
> - for (i = 0; i < bufv->count; i++) {
> - if (bufv->buf[i].size == SIZE_MAX)
> - size = SIZE_MAX;
> - else
> - size += bufv->buf[i].size;
> - }
> -
> - return size;
> + size_t i;
> + size_t size = 0;
> +
> + for (i = 0; i < bufv->count; i++) {
> + if (bufv->buf[i].size == SIZE_MAX) {
> + size = SIZE_MAX;
> + } else {
> + size += bufv->buf[i].size;
> + }
> + }
> +
> + return size;
> }
>
> static size_t min_size(size_t s1, size_t s2)
> {
> - return s1 < s2 ? s1 : s2;
> + return s1 < s2 ? s1 : s2;
> }
>
> static ssize_t fuse_buf_write(const struct fuse_buf *dst, size_t dst_off,
> - const struct fuse_buf *src, size_t src_off,
> - size_t len)
> + const struct fuse_buf *src, size_t src_off,
> + size_t len)
> {
> - ssize_t res = 0;
> - size_t copied = 0;
> -
> - while (len) {
> - if (dst->flags & FUSE_BUF_FD_SEEK) {
> - res = pwrite(dst->fd, (char *)src->mem + src_off,
> len,
> - dst->pos + dst_off);
> - } else {
> - res = write(dst->fd, (char *)src->mem + src_off,
> len);
> - }
> - if (res == -1) {
> - if (!copied)
> - return -errno;
> - break;
> - }
> - if (res == 0)
> - break;
> -
> - copied += res;
> - if (!(dst->flags & FUSE_BUF_FD_RETRY))
> - break;
> -
> - src_off += res;
> - dst_off += res;
> - len -= res;
> - }
> -
> - return copied;
> + ssize_t res = 0;
> + size_t copied = 0;
> +
> + while (len) {
> + if (dst->flags & FUSE_BUF_FD_SEEK) {
> + res = pwrite(dst->fd, (char *)src->mem + src_off, len,
> + dst->pos + dst_off);
> + } else {
> + res = write(dst->fd, (char *)src->mem + src_off, len);
> + }
> + if (res == -1) {
> + if (!copied) {
> + return -errno;
> + }
> + break;
> + }
> + if (res == 0) {
> + break;
> + }
> +
> + copied += res;
> + if (!(dst->flags & FUSE_BUF_FD_RETRY)) {
> + break;
> + }
> +
> + src_off += res;
> + dst_off += res;
> + len -= res;
> + }
> +
> + return copied;
> }
>
> static ssize_t fuse_buf_read(const struct fuse_buf *dst, size_t dst_off,
> - const struct fuse_buf *src, size_t src_off,
> - size_t len)
> + const struct fuse_buf *src, size_t src_off,
> + size_t len)
> {
> - ssize_t res = 0;
> - size_t copied = 0;
> -
> - while (len) {
> - if (src->flags & FUSE_BUF_FD_SEEK) {
> - res = pread(src->fd, (char *)dst->mem + dst_off,
> len,
> - src->pos + src_off);
> - } else {
> - res = read(src->fd, (char *)dst->mem + dst_off,
> len);
> - }
> - if (res == -1) {
> - if (!copied)
> - return -errno;
> - break;
> - }
> - if (res == 0)
> - break;
> -
> - copied += res;
> - if (!(src->flags & FUSE_BUF_FD_RETRY))
> - break;
> -
> - dst_off += res;
> - src_off += res;
> - len -= res;
> - }
> -
> - return copied;
> + ssize_t res = 0;
> + size_t copied = 0;
> +
> + while (len) {
> + if (src->flags & FUSE_BUF_FD_SEEK) {
> + res = pread(src->fd, (char *)dst->mem + dst_off, len,
> + src->pos + src_off);
> + } else {
> + res = read(src->fd, (char *)dst->mem + dst_off, len);
> + }
> + if (res == -1) {
> + if (!copied) {
> + return -errno;
> + }
> + break;
> + }
> + if (res == 0) {
> + break;
> + }
> +
> + copied += res;
> + if (!(src->flags & FUSE_BUF_FD_RETRY)) {
> + break;
> + }
> +
> + dst_off += res;
> + src_off += res;
> + len -= res;
> + }
> +
> + return copied;
> }
>
> static ssize_t fuse_buf_fd_to_fd(const struct fuse_buf *dst, size_t
> dst_off,
> - const struct fuse_buf *src, size_t
> src_off,
> - size_t len)
> + const struct fuse_buf *src, size_t
> src_off,
> + size_t len)
> {
> - char buf[4096];
> - struct fuse_buf tmp = {
> - .size = sizeof(buf),
> - .flags = 0,
> - };
> - ssize_t res;
> - size_t copied = 0;
> -
> - tmp.mem = buf;
> -
> - while (len) {
> - size_t this_len = min_size(tmp.size, len);
> - size_t read_len;
> -
> - res = fuse_buf_read(&tmp, 0, src, src_off, this_len);
> - if (res < 0) {
> - if (!copied)
> - return res;
> - break;
> - }
> - if (res == 0)
> - break;
> -
> - read_len = res;
> - res = fuse_buf_write(dst, dst_off, &tmp, 0, read_len);
> - if (res < 0) {
> - if (!copied)
> - return res;
> - break;
> - }
> - if (res == 0)
> - break;
> -
> - copied += res;
> -
> - if (res < this_len)
> - break;
> -
> - dst_off += res;
> - src_off += res;
> - len -= res;
> - }
> -
> - return copied;
> + char buf[4096];
> + struct fuse_buf tmp = {
> + .size = sizeof(buf),
> + .flags = 0,
> + };
> + ssize_t res;
> + size_t copied = 0;
> +
> + tmp.mem = buf;
> +
> + while (len) {
> + size_t this_len = min_size(tmp.size, len);
> + size_t read_len;
> +
> + res = fuse_buf_read(&tmp, 0, src, src_off, this_len);
> + if (res < 0) {
> + if (!copied) {
> + return res;
> + }
> + break;
> + }
> + if (res == 0) {
> + break;
> + }
> +
> + read_len = res;
> + res = fuse_buf_write(dst, dst_off, &tmp, 0, read_len);
> + if (res < 0) {
> + if (!copied) {
> + return res;
> + }
> + break;
> + }
> + if (res == 0) {
> + break;
> + }
> +
> + copied += res;
> +
> + if (res < this_len) {
> + break;
> + }
> +
> + dst_off += res;
> + src_off += res;
> + len -= res;
> + }
> +
> + return copied;
> }
>
> #ifdef HAVE_SPLICE
> static ssize_t fuse_buf_splice(const struct fuse_buf *dst, size_t dst_off,
> - const struct fuse_buf *src, size_t src_off,
> - size_t len, enum fuse_buf_copy_flags flags)
> + const struct fuse_buf *src, size_t src_off,
> + size_t len, enum fuse_buf_copy_flags flags)
> {
> - int splice_flags = 0;
> - off_t *srcpos = NULL;
> - off_t *dstpos = NULL;
> - off_t srcpos_val;
> - off_t dstpos_val;
> - ssize_t res;
> - size_t copied = 0;
> -
> - if (flags & FUSE_BUF_SPLICE_MOVE)
> - splice_flags |= SPLICE_F_MOVE;
> - if (flags & FUSE_BUF_SPLICE_NONBLOCK)
> - splice_flags |= SPLICE_F_NONBLOCK;
> -
> - if (src->flags & FUSE_BUF_FD_SEEK) {
> - srcpos_val = src->pos + src_off;
> - srcpos = &srcpos_val;
> - }
> - if (dst->flags & FUSE_BUF_FD_SEEK) {
> - dstpos_val = dst->pos + dst_off;
> - dstpos = &dstpos_val;
> - }
> -
> - while (len) {
> - res = splice(src->fd, srcpos, dst->fd, dstpos, len,
> - splice_flags);
> - if (res == -1) {
> - if (copied)
> - break;
> -
> - if (errno != EINVAL || (flags &
> FUSE_BUF_FORCE_SPLICE))
> - return -errno;
> -
> - /* Maybe splice is not supported for this
> combination */
> - return fuse_buf_fd_to_fd(dst, dst_off, src,
> src_off,
> - len);
> - }
> - if (res == 0)
> - break;
> -
> - copied += res;
> - if (!(src->flags & FUSE_BUF_FD_RETRY) &&
> - !(dst->flags & FUSE_BUF_FD_RETRY)) {
> - break;
> - }
> -
> - len -= res;
> - }
> -
> - return copied;
> + int splice_flags = 0;
> + off_t *srcpos = NULL;
> + off_t *dstpos = NULL;
> + off_t srcpos_val;
> + off_t dstpos_val;
> + ssize_t res;
> + size_t copied = 0;
> +
> + if (flags & FUSE_BUF_SPLICE_MOVE) {
> + splice_flags |= SPLICE_F_MOVE;
> + }
> + if (flags & FUSE_BUF_SPLICE_NONBLOCK) {
> + splice_flags |= SPLICE_F_NONBLOCK;
> + }
> + if (src->flags & FUSE_BUF_FD_SEEK) {
> + srcpos_val = src->pos + src_off;
> + srcpos = &srcpos_val;
> + }
> + if (dst->flags & FUSE_BUF_FD_SEEK) {
> + dstpos_val = dst->pos + dst_off;
> + dstpos = &dstpos_val;
> + }
> +
> + while (len) {
> + res = splice(src->fd, srcpos, dst->fd, dstpos, len, splice_flags);
> + if (res == -1) {
> + if (copied) {
> + break;
> + }
> +
> + if (errno != EINVAL || (flags & FUSE_BUF_FORCE_SPLICE)) {
> + return -errno;
> + }
> +
> + /* Maybe splice is not supported for this combination */
> + return fuse_buf_fd_to_fd(dst, dst_off, src, src_off, len);
> + }
> + if (res == 0) {
> + break;
> + }
> +
> + copied += res;
> + if (!(src->flags & FUSE_BUF_FD_RETRY) &&
> + !(dst->flags & FUSE_BUF_FD_RETRY)) {
> + break;
> + }
> +
> + len -= res;
> + }
> +
> + return copied;
> }
> #else
> static ssize_t fuse_buf_splice(const struct fuse_buf *dst, size_t dst_off,
> - const struct fuse_buf *src, size_t src_off,
> - size_t len, enum fuse_buf_copy_flags flags)
> + const struct fuse_buf *src, size_t src_off,
> + size_t len, enum fuse_buf_copy_flags flags)
> {
> - (void) flags;
> + (void)flags;
>
> - return fuse_buf_fd_to_fd(dst, dst_off, src, src_off, len);
> + return fuse_buf_fd_to_fd(dst, dst_off, src, src_off, len);
> }
> #endif
>
>
> static ssize_t fuse_buf_copy_one(const struct fuse_buf *dst, size_t
> dst_off,
> - const struct fuse_buf *src, size_t
> src_off,
> - size_t len, enum fuse_buf_copy_flags
> flags)
> + const struct fuse_buf *src, size_t
> src_off,
> + size_t len, enum fuse_buf_copy_flags
> flags)
> {
> - int src_is_fd = src->flags & FUSE_BUF_IS_FD;
> - int dst_is_fd = dst->flags & FUSE_BUF_IS_FD;
> -
> - if (!src_is_fd && !dst_is_fd) {
> - char *dstmem = (char *)dst->mem + dst_off;
> - char *srcmem = (char *)src->mem + src_off;
> -
> - if (dstmem != srcmem) {
> - if (dstmem + len <= srcmem || srcmem + len <=
> dstmem)
> - memcpy(dstmem, srcmem, len);
> - else
> - memmove(dstmem, srcmem, len);
> - }
> -
> - return len;
> - } else if (!src_is_fd) {
> - return fuse_buf_write(dst, dst_off, src, src_off, len);
> - } else if (!dst_is_fd) {
> - return fuse_buf_read(dst, dst_off, src, src_off, len);
> - } else if (flags & FUSE_BUF_NO_SPLICE) {
> - return fuse_buf_fd_to_fd(dst, dst_off, src, src_off, len);
> - } else {
> - return fuse_buf_splice(dst, dst_off, src, src_off, len,
> flags);
> - }
> + int src_is_fd = src->flags & FUSE_BUF_IS_FD;
> + int dst_is_fd = dst->flags & FUSE_BUF_IS_FD;
> +
> + if (!src_is_fd && !dst_is_fd) {
> + char *dstmem = (char *)dst->mem + dst_off;
> + char *srcmem = (char *)src->mem + src_off;
> +
> + if (dstmem != srcmem) {
> + if (dstmem + len <= srcmem || srcmem + len <= dstmem) {
> + memcpy(dstmem, srcmem, len);
> + } else {
> + memmove(dstmem, srcmem, len);
> + }
> + }
> +
> + return len;
> + } else if (!src_is_fd) {
> + return fuse_buf_write(dst, dst_off, src, src_off, len);
> + } else if (!dst_is_fd) {
> + return fuse_buf_read(dst, dst_off, src, src_off, len);
> + } else if (flags & FUSE_BUF_NO_SPLICE) {
> + return fuse_buf_fd_to_fd(dst, dst_off, src, src_off, len);
> + } else {
> + return fuse_buf_splice(dst, dst_off, src, src_off, len, flags);
> + }
> }
>
> static const struct fuse_buf *fuse_bufvec_current(struct fuse_bufvec
> *bufv)
> {
> - if (bufv->idx < bufv->count)
> - return &bufv->buf[bufv->idx];
> - else
> - return NULL;
> + if (bufv->idx < bufv->count) {
> + return &bufv->buf[bufv->idx];
> + } else {
> + return NULL;
> + }
> }
>
> static int fuse_bufvec_advance(struct fuse_bufvec *bufv, size_t len)
> {
> - const struct fuse_buf *buf = fuse_bufvec_current(bufv);
> -
> - bufv->off += len;
> - assert(bufv->off <= buf->size);
> - if (bufv->off == buf->size) {
> - assert(bufv->idx < bufv->count);
> - bufv->idx++;
> - if (bufv->idx == bufv->count)
> - return 0;
> - bufv->off = 0;
> - }
> - return 1;
> + const struct fuse_buf *buf = fuse_bufvec_current(bufv);
> +
> + bufv->off += len;
> + assert(bufv->off <= buf->size);
> + if (bufv->off == buf->size) {
> + assert(bufv->idx < bufv->count);
> + bufv->idx++;
> + if (bufv->idx == bufv->count) {
> + return 0;
> + }
> + bufv->off = 0;
> + }
> + return 1;
> }
>
> ssize_t fuse_buf_copy(struct fuse_bufvec *dstv, struct fuse_bufvec *srcv,
> - enum fuse_buf_copy_flags flags)
> + enum fuse_buf_copy_flags flags)
> {
> - size_t copied = 0;
> -
> - if (dstv == srcv)
> - return fuse_buf_size(dstv);
> -
> - for (;;) {
> - const struct fuse_buf *src = fuse_bufvec_current(srcv);
> - const struct fuse_buf *dst = fuse_bufvec_current(dstv);
> - size_t src_len;
> - size_t dst_len;
> - size_t len;
> - ssize_t res;
> -
> - if (src == NULL || dst == NULL)
> - break;
> -
> - src_len = src->size - srcv->off;
> - dst_len = dst->size - dstv->off;
> - len = min_size(src_len, dst_len);
> -
> - res = fuse_buf_copy_one(dst, dstv->off, src, srcv->off,
> len, flags);
> - if (res < 0) {
> - if (!copied)
> - return res;
> - break;
> - }
> - copied += res;
> -
> - if (!fuse_bufvec_advance(srcv, res) ||
> - !fuse_bufvec_advance(dstv, res))
> - break;
> -
> - if (res < len)
> - break;
> - }
> -
> - return copied;
> + size_t copied = 0;
> +
> + if (dstv == srcv) {
> + return fuse_buf_size(dstv);
> + }
> +
> + for (;;) {
> + const struct fuse_buf *src = fuse_bufvec_current(srcv);
> + const struct fuse_buf *dst = fuse_bufvec_current(dstv);
> + size_t src_len;
> + size_t dst_len;
> + size_t len;
> + ssize_t res;
> +
> + if (src == NULL || dst == NULL) {
> + break;
> + }
> +
> + src_len = src->size - srcv->off;
> + dst_len = dst->size - dstv->off;
> + len = min_size(src_len, dst_len);
> +
> + res = fuse_buf_copy_one(dst, dstv->off, src, srcv->off, len,
> flags);
> + if (res < 0) {
> + if (!copied) {
> + return res;
> + }
> + break;
> + }
> + copied += res;
> +
> + if (!fuse_bufvec_advance(srcv, res) ||
> + !fuse_bufvec_advance(dstv, res)) {
> + break;
> + }
> +
> + if (res < len) {
> + break;
> + }
> + }
> +
> + return copied;
> }
> diff --git a/tools/virtiofsd/fuse.h b/tools/virtiofsd/fuse.h
> index 6c16a0041d..945ebc7a0d 100644
> --- a/tools/virtiofsd/fuse.h
> +++ b/tools/virtiofsd/fuse.h
> @@ -1,15 +1,15 @@
> /*
> - FUSE: Filesystem in Userspace
> - Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
> -
> - This program can be distributed under the terms of the GNU LGPLv2.
> - See the file COPYING.LIB.
> -*/
> + * FUSE: Filesystem in Userspace
> + * Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
> + *
> + * This program can be distributed under the terms of the GNU LGPLv2.
> + * See the file COPYING.LIB.
> + */
>
> #ifndef FUSE_H_
> #define FUSE_H_
>
> -/** @file
> +/*
> *
> * This file defines the library interface of FUSE
> *
> @@ -19,15 +19,15 @@
> #include "fuse_common.h"
>
> #include <fcntl.h>
> -#include <time.h>
> -#include <sys/types.h>
> #include <sys/stat.h>
> #include <sys/statvfs.h>
> +#include <sys/types.h>
> #include <sys/uio.h>
> +#include <time.h>
>
> -/* ----------------------------------------------------------- *
> - * Basic FUSE API *
> - * ----------------------------------------------------------- */
> +/*
> + * Basic FUSE API
> + */
>
> /** Handle for a FUSE filesystem */
> struct fuse;
> @@ -36,38 +36,39 @@ struct fuse;
> * Readdir flags, passed to ->readdir()
> */
> enum fuse_readdir_flags {
> - /**
> - * "Plus" mode.
> - *
> - * The kernel wants to prefill the inode cache during readdir. The
> - * filesystem may honour this by filling in the attributes and
> setting
> - * FUSE_FILL_DIR_FLAGS for the filler function. The filesystem
> may also
> - * just ignore this flag completely.
> - */
> - FUSE_READDIR_PLUS = (1 << 0),
> + /**
> + * "Plus" mode.
> + *
> + * The kernel wants to prefill the inode cache during readdir. The
> + * filesystem may honour this by filling in the attributes and setting
> + * FUSE_FILL_DIR_FLAGS for the filler function. The filesystem may
> also
> + * just ignore this flag completely.
> + */
> + FUSE_READDIR_PLUS = (1 << 0),
> };
>
> enum fuse_fill_dir_flags {
> - /**
> - * "Plus" mode: all file attributes are valid
> - *
> - * The attributes are used by the kernel to prefill the inode cache
> - * during a readdir.
> - *
> - * It is okay to set FUSE_FILL_DIR_PLUS if FUSE_READDIR_PLUS is
> not set
> - * and vice versa.
> - */
> - FUSE_FILL_DIR_PLUS = (1 << 1),
> + /**
> + * "Plus" mode: all file attributes are valid
> + *
> + * The attributes are used by the kernel to prefill the inode cache
> + * during a readdir.
> + *
> + * It is okay to set FUSE_FILL_DIR_PLUS if FUSE_READDIR_PLUS is not
> set
> + * and vice versa.
> + */
> + FUSE_FILL_DIR_PLUS = (1 << 1),
> };
>
> -/** Function to add an entry in a readdir() operation
> +/**
> + * Function to add an entry in a readdir() operation
> *
> * The *off* parameter can be any non-zero value that enables the
> * filesystem to identify the current point in the directory
> * stream. It does not need to be the actual physical position. A
> * value of zero is reserved to indicate that seeking in directories
> * is not supported.
> - *
> + *
> * @param buf the buffer passed to the readdir() operation
> * @param name the file name of the directory entry
> * @param stat file attributes, can be NULL
> @@ -75,9 +76,9 @@ enum fuse_fill_dir_flags {
> * @param flags fill flags
> * @return 1 if buffer is full, zero otherwise
> */
> -typedef int (*fuse_fill_dir_t) (void *buf, const char *name,
> - const struct stat *stbuf, off_t off,
> - enum fuse_fill_dir_flags flags);
> +typedef int (*fuse_fill_dir_t)(void *buf, const char *name,
> + const struct stat *stbuf, off_t off,
> + enum fuse_fill_dir_flags flags);
> /**
> * Configuration of the high-level API
> *
> @@ -87,186 +88,186 @@ typedef int (*fuse_fill_dir_t) (void *buf, const
> char *name,
> * file system implementation.
> */
> struct fuse_config {
> - /**
> - * If `set_gid` is non-zero, the st_gid attribute of each file
> - * is overwritten with the value of `gid`.
> - */
> - int set_gid;
> - unsigned int gid;
> -
> - /**
> - * If `set_uid` is non-zero, the st_uid attribute of each file
> - * is overwritten with the value of `uid`.
> - */
> - int set_uid;
> - unsigned int uid;
> -
> - /**
> - * If `set_mode` is non-zero, the any permissions bits set in
> - * `umask` are unset in the st_mode attribute of each file.
> - */
> - int set_mode;
> - unsigned int umask;
> -
> - /**
> - * The timeout in seconds for which name lookups will be
> - * cached.
> - */
> - double entry_timeout;
> -
> - /**
> - * The timeout in seconds for which a negative lookup will be
> - * cached. This means, that if file did not exist (lookup
> - * retuned ENOENT), the lookup will only be redone after the
> - * timeout, and the file/directory will be assumed to not
> - * exist until then. A value of zero means that negative
> - * lookups are not cached.
> - */
> - double negative_timeout;
> -
> - /**
> - * The timeout in seconds for which file/directory attributes
> - * (as returned by e.g. the `getattr` handler) are cached.
> - */
> - double attr_timeout;
> -
> - /**
> - * Allow requests to be interrupted
> - */
> - int intr;
> -
> - /**
> - * Specify which signal number to send to the filesystem when
> - * a request is interrupted. The default is hardcoded to
> - * USR1.
> - */
> - int intr_signal;
> -
> - /**
> - * Normally, FUSE assigns inodes to paths only for as long as
> - * the kernel is aware of them. With this option inodes are
> - * instead remembered for at least this many seconds. This
> - * will require more memory, but may be necessary when using
> - * applications that make use of inode numbers.
> - *
> - * A number of -1 means that inodes will be remembered for the
> - * entire life-time of the file-system process.
> - */
> - int remember;
> -
> - /**
> - * The default behavior is that if an open file is deleted,
> - * the file is renamed to a hidden file (.fuse_hiddenXXX), and
> - * only removed when the file is finally released. This
> - * relieves the filesystem implementation of having to deal
> - * with this problem. This option disables the hiding
> - * behavior, and files are removed immediately in an unlink
> - * operation (or in a rename operation which overwrites an
> - * existing file).
> - *
> - * It is recommended that you not use the hard_remove
> - * option. When hard_remove is set, the following libc
> - * functions fail on unlinked files (returning errno of
> - * ENOENT): read(2), write(2), fsync(2), close(2), f*xattr(2),
> - * ftruncate(2), fstat(2), fchmod(2), fchown(2)
> - */
> - int hard_remove;
> -
> - /**
> - * Honor the st_ino field in the functions getattr() and
> - * fill_dir(). This value is used to fill in the st_ino field
> - * in the stat(2), lstat(2), fstat(2) functions and the d_ino
> - * field in the readdir(2) function. The filesystem does not
> - * have to guarantee uniqueness, however some applications
> - * rely on this value being unique for the whole filesystem.
> - *
> - * Note that this does *not* affect the inode that libfuse
> - * and the kernel use internally (also called the "nodeid").
> - */
> - int use_ino;
> -
> - /**
> - * If use_ino option is not given, still try to fill in the
> - * d_ino field in readdir(2). If the name was previously
> - * looked up, and is still in the cache, the inode number
> - * found there will be used. Otherwise it will be set to -1.
> - * If use_ino option is given, this option is ignored.
> - */
> - int readdir_ino;
> -
> - /**
> - * This option disables the use of page cache (file content cache)
> - * in the kernel for this filesystem. This has several affects:
> - *
> - * 1. Each read(2) or write(2) system call will initiate one
> - * or more read or write operations, data will not be
> - * cached in the kernel.
> - *
> - * 2. The return value of the read() and write() system calls
> - * will correspond to the return values of the read and
> - * write operations. This is useful for example if the
> - * file size is not known in advance (before reading it).
> - *
> - * Internally, enabling this option causes fuse to set the
> - * `direct_io` field of `struct fuse_file_info` - overwriting
> - * any value that was put there by the file system.
> - */
> - int direct_io;
> -
> - /**
> - * This option disables flushing the cache of the file
> - * contents on every open(2). This should only be enabled on
> - * filesystems where the file data is never changed
> - * externally (not through the mounted FUSE filesystem). Thus
> - * it is not suitable for network filesystems and other
> - * intermediate filesystems.
> - *
> - * NOTE: if this option is not specified (and neither
> - * direct_io) data is still cached after the open(2), so a
> - * read(2) system call will not always initiate a read
> - * operation.
> - *
> - * Internally, enabling this option causes fuse to set the
> - * `keep_cache` field of `struct fuse_file_info` - overwriting
> - * any value that was put there by the file system.
> - */
> - int kernel_cache;
> -
> - /**
> - * This option is an alternative to `kernel_cache`. Instead of
> - * unconditionally keeping cached data, the cached data is
> - * invalidated on open(2) if if the modification time or the
> - * size of the file has changed since it was last opened.
> - */
> - int auto_cache;
> -
> - /**
> - * The timeout in seconds for which file attributes are cached
> - * for the purpose of checking if auto_cache should flush the
> - * file data on open.
> - */
> - int ac_attr_timeout_set;
> - double ac_attr_timeout;
> -
> - /**
> - * If this option is given the file-system handlers for the
> - * following operations will not receive path information:
> - * read, write, flush, release, fsync, readdir, releasedir,
> - * fsyncdir, lock, ioctl and poll.
> - *
> - * For the truncate, getattr, chmod, chown and utimens
> - * operations the path will be provided only if the struct
> - * fuse_file_info argument is NULL.
> - */
> - int nullpath_ok;
> -
> - /**
> - * The remaining options are used by libfuse internally and
> - * should not be touched.
> - */
> - int show_help;
> - char *modules;
> - int debug;
> + /**
> + * If `set_gid` is non-zero, the st_gid attribute of each file
> + * is overwritten with the value of `gid`.
> + */
> + int set_gid;
> + unsigned int gid;
> +
> + /**
> + * If `set_uid` is non-zero, the st_uid attribute of each file
> + * is overwritten with the value of `uid`.
> + */
> + int set_uid;
> + unsigned int uid;
> +
> + /**
> + * If `set_mode` is non-zero, the any permissions bits set in
> + * `umask` are unset in the st_mode attribute of each file.
> + */
> + int set_mode;
> + unsigned int umask;
> +
> + /**
> + * The timeout in seconds for which name lookups will be
> + * cached.
> + */
> + double entry_timeout;
> +
> + /**
> + * The timeout in seconds for which a negative lookup will be
> + * cached. This means, that if file did not exist (lookup
> + * retuned ENOENT), the lookup will only be redone after the
> + * timeout, and the file/directory will be assumed to not
> + * exist until then. A value of zero means that negative
> + * lookups are not cached.
> + */
> + double negative_timeout;
> +
> + /**
> + * The timeout in seconds for which file/directory attributes
> + * (as returned by e.g. the `getattr` handler) are cached.
> + */
> + double attr_timeout;
> +
> + /**
> + * Allow requests to be interrupted
> + */
> + int intr;
> +
> + /**
> + * Specify which signal number to send to the filesystem when
> + * a request is interrupted. The default is hardcoded to
> + * USR1.
> + */
> + int intr_signal;
> +
> + /**
> + * Normally, FUSE assigns inodes to paths only for as long as
> + * the kernel is aware of them. With this option inodes are
> + * instead remembered for at least this many seconds. This
> + * will require more memory, but may be necessary when using
> + * applications that make use of inode numbers.
> + *
> + * A number of -1 means that inodes will be remembered for the
> + * entire life-time of the file-system process.
> + */
> + int remember;
> +
> + /**
> + * The default behavior is that if an open file is deleted,
> + * the file is renamed to a hidden file (.fuse_hiddenXXX), and
> + * only removed when the file is finally released. This
> + * relieves the filesystem implementation of having to deal
> + * with this problem. This option disables the hiding
> + * behavior, and files are removed immediately in an unlink
> + * operation (or in a rename operation which overwrites an
> + * existing file).
> + *
> + * It is recommended that you not use the hard_remove
> + * option. When hard_remove is set, the following libc
> + * functions fail on unlinked files (returning errno of
> + * ENOENT): read(2), write(2), fsync(2), close(2), f*xattr(2),
> + * ftruncate(2), fstat(2), fchmod(2), fchown(2)
> + */
> + int hard_remove;
> +
> + /**
> + * Honor the st_ino field in the functions getattr() and
> + * fill_dir(). This value is used to fill in the st_ino field
> + * in the stat(2), lstat(2), fstat(2) functions and the d_ino
> + * field in the readdir(2) function. The filesystem does not
> + * have to guarantee uniqueness, however some applications
> + * rely on this value being unique for the whole filesystem.
> + *
> + * Note that this does *not* affect the inode that libfuse
> + * and the kernel use internally (also called the "nodeid").
> + */
> + int use_ino;
> +
> + /**
> + * If use_ino option is not given, still try to fill in the
> + * d_ino field in readdir(2). If the name was previously
> + * looked up, and is still in the cache, the inode number
> + * found there will be used. Otherwise it will be set to -1.
> + * If use_ino option is given, this option is ignored.
> + */
> + int readdir_ino;
> +
> + /**
> + * This option disables the use of page cache (file content cache)
> + * in the kernel for this filesystem. This has several affects:
> + *
> + * 1. Each read(2) or write(2) system call will initiate one
> + * or more read or write operations, data will not be
> + * cached in the kernel.
> + *
> + * 2. The return value of the read() and write() system calls
> + * will correspond to the return values of the read and
> + * write operations. This is useful for example if the
> + * file size is not known in advance (before reading it).
> + *
> + * Internally, enabling this option causes fuse to set the
> + * `direct_io` field of `struct fuse_file_info` - overwriting
> + * any value that was put there by the file system.
> + */
> + int direct_io;
> +
> + /**
> + * This option disables flushing the cache of the file
> + * contents on every open(2). This should only be enabled on
> + * filesystems where the file data is never changed
> + * externally (not through the mounted FUSE filesystem). Thus
> + * it is not suitable for network filesystems and other
> + * intermediate filesystems.
> + *
> + * NOTE: if this option is not specified (and neither
> + * direct_io) data is still cached after the open(2), so a
> + * read(2) system call will not always initiate a read
> + * operation.
> + *
> + * Internally, enabling this option causes fuse to set the
> + * `keep_cache` field of `struct fuse_file_info` - overwriting
> + * any value that was put there by the file system.
> + */
> + int kernel_cache;
> +
> + /**
> + * This option is an alternative to `kernel_cache`. Instead of
> + * unconditionally keeping cached data, the cached data is
> + * invalidated on open(2) if if the modification time or the
> + * size of the file has changed since it was last opened.
> + */
> + int auto_cache;
> +
> + /**
> + * The timeout in seconds for which file attributes are cached
> + * for the purpose of checking if auto_cache should flush the
> + * file data on open.
> + */
> + int ac_attr_timeout_set;
> + double ac_attr_timeout;
> +
> + /**
> + * If this option is given the file-system handlers for the
> + * following operations will not receive path information:
> + * read, write, flush, release, fsync, readdir, releasedir,
> + * fsyncdir, lock, ioctl and poll.
> + *
> + * For the truncate, getattr, chmod, chown and utimens
> + * operations the path will be provided only if the struct
> + * fuse_file_info argument is NULL.
> + */
> + int nullpath_ok;
> +
> + /**
> + * The remaining options are used by libfuse internally and
> + * should not be touched.
> + */
> + int show_help;
> + char *modules;
> + int debug;
> };
>
>
> @@ -293,515 +294,535 @@ struct fuse_config {
> * Almost all operations take a path which can be of any length.
> */
> struct fuse_operations {
> - /** Get file attributes.
> - *
> - * Similar to stat(). The 'st_dev' and 'st_blksize' fields are
> - * ignored. The 'st_ino' field is ignored except if the 'use_ino'
> - * mount option is given. In that case it is passed to userspace,
> - * but libfuse and the kernel will still assign a different
> - * inode for internal use (called the "nodeid").
> - *
> - * `fi` will always be NULL if the file is not currently open, but
> - * may also be NULL if the file is open.
> - */
> - int (*getattr) (const char *, struct stat *, struct fuse_file_info
> *fi);
> -
> - /** Read the target of a symbolic link
> - *
> - * The buffer should be filled with a null terminated string. The
> - * buffer size argument includes the space for the terminating
> - * null character. If the linkname is too long to fit in the
> - * buffer, it should be truncated. The return value should be
> 0
> - * for success.
> - */
> - int (*readlink) (const char *, char *, size_t);
> -
> - /** Create a file node
> - *
> - * This is called for creation of all non-directory, non-symlink
> - * nodes. If the filesystem defines a create() method, then for
> - * regular files that will be called instead.
> - */
> - int (*mknod) (const char *, mode_t, dev_t);
> -
> - /** Create a directory
> - *
> - * Note that the mode argument may not have the type specification
> - * bits set, i.e. S_ISDIR(mode) can be false. To obtain the
> - * correct directory type bits use mode|S_IFDIR
> - * */
> - int (*mkdir) (const char *, mode_t);
> -
> - /** Remove a file */
> - int (*unlink) (const char *);
> -
> - /** Remove a directory */
> - int (*rmdir) (const char *);
> -
> - /** Create a symbolic link */
> - int (*symlink) (const char *, const char *);
> -
> - /** Rename a file
> - *
> - * *flags* may be `RENAME_EXCHANGE` or `RENAME_NOREPLACE`. If
> - * RENAME_NOREPLACE is specified, the filesystem must not
> - * overwrite *newname* if it exists and return an error
> - * instead. If `RENAME_EXCHANGE` is specified, the filesystem
> - * must atomically exchange the two files, i.e. both must
> - * exist and neither may be deleted.
> - */
> - int (*rename) (const char *, const char *, unsigned int flags);
> -
> - /** Create a hard link to a file */
> - int (*link) (const char *, const char *);
> -
> - /** Change the permission bits of a file
> - *
> - * `fi` will always be NULL if the file is not currenlty open, but
> - * may also be NULL if the file is open.
> - */
> - int (*chmod) (const char *, mode_t, struct fuse_file_info *fi);
> -
> - /** Change the owner and group of a file
> - *
> - * `fi` will always be NULL if the file is not currenlty open, but
> - * may also be NULL if the file is open.
> - *
> - * Unless FUSE_CAP_HANDLE_KILLPRIV is disabled, this method is
> - * expected to reset the setuid and setgid bits.
> - */
> - int (*chown) (const char *, uid_t, gid_t, struct fuse_file_info
> *fi);
> -
> - /** Change the size of a file
> - *
> - * `fi` will always be NULL if the file is not currenlty open, but
> - * may also be NULL if the file is open.
> - *
> - * Unless FUSE_CAP_HANDLE_KILLPRIV is disabled, this method is
> - * expected to reset the setuid and setgid bits.
> - */
> - int (*truncate) (const char *, off_t, struct fuse_file_info *fi);
> -
> - /** Open a file
> - *
> - * Open flags are available in fi->flags. The following rules
> - * apply.
> - *
> - * - Creation (O_CREAT, O_EXCL, O_NOCTTY) flags will be
> - * filtered out / handled by the kernel.
> - *
> - * - Access modes (O_RDONLY, O_WRONLY, O_RDWR, O_EXEC, O_SEARCH)
> - * should be used by the filesystem to check if the operation is
> - * permitted. If the ``-o default_permissions`` mount option is
> - * given, this check is already done by the kernel before
> calling
> - * open() and may thus be omitted by the filesystem.
> - *
> - * - When writeback caching is enabled, the kernel may send
> - * read requests even for files opened with O_WRONLY. The
> - * filesystem should be prepared to handle this.
> - *
> - * - When writeback caching is disabled, the filesystem is
> - * expected to properly handle the O_APPEND flag and ensure
> - * that each write is appending to the end of the file.
> - *
> - * - When writeback caching is enabled, the kernel will
> - * handle O_APPEND. However, unless all changes to the file
> - * come through the kernel this will not work reliably. The
> - * filesystem should thus either ignore the O_APPEND flag
> - * (and let the kernel handle it), or return an error
> - * (indicating that reliably O_APPEND is not available).
> - *
> - * Filesystem may store an arbitrary file handle (pointer,
> - * index, etc) in fi->fh, and use this in other all other file
> - * operations (read, write, flush, release, fsync).
> - *
> - * Filesystem may also implement stateless file I/O and not store
> - * anything in fi->fh.
> - *
> - * There are also some flags (direct_io, keep_cache) which the
> - * filesystem may set in fi, to change the way the file is opened.
> - * See fuse_file_info structure in <fuse_common.h> for more
> details.
> - *
> - * If this request is answered with an error code of ENOSYS
> - * and FUSE_CAP_NO_OPEN_SUPPORT is set in
> - * `fuse_conn_info.capable`, this is treated as success and
> - * future calls to open will also succeed without being send
> - * to the filesystem process.
> - *
> - */
> - int (*open) (const char *, struct fuse_file_info *);
> -
> - /** Read data from an open file
> - *
> - * Read should return exactly the number of bytes requested except
> - * on EOF or error, otherwise the rest of the data will be
> - * substituted with zeroes. An exception to this is when the
> - * 'direct_io' mount option is specified, in which case the return
> - * value of the read system call will reflect the return value of
> - * this operation.
> - */
> - int (*read) (const char *, char *, size_t, off_t,
> - struct fuse_file_info *);
> -
> - /** Write data to an open file
> - *
> - * Write should return exactly the number of bytes requested
> - * except on error. An exception to this is when the
> 'direct_io'
> - * mount option is specified (see read operation).
> - *
> - * Unless FUSE_CAP_HANDLE_KILLPRIV is disabled, this meth
[-- Attachment #2: Type: text/html, Size: 60661 bytes --]
next prev parent reply other threads:[~2020-01-09 12:22 UTC|newest]
Thread overview: 307+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-12 16:37 [PATCH 000/104] virtiofs daemon [all] Dr. David Alan Gilbert (git)
2019-12-12 16:37 ` [PATCH 001/104] virtiofsd: Pull in upstream headers Dr. David Alan Gilbert (git)
2020-01-03 11:54 ` Daniel P. Berrangé
2020-01-15 17:38 ` Philippe Mathieu-Daudé
2019-12-12 16:37 ` [PATCH 002/104] virtiofsd: Pull in kernel's fuse.h Dr. David Alan Gilbert (git)
2020-01-03 11:56 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 003/104] virtiofsd: Add auxiliary .c's Dr. David Alan Gilbert (git)
2020-01-03 11:57 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 004/104] virtiofsd: Add fuse_lowlevel.c Dr. David Alan Gilbert (git)
2020-01-03 11:58 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 005/104] virtiofsd: Add passthrough_ll Dr. David Alan Gilbert (git)
2020-01-03 12:01 ` Daniel P. Berrangé
2020-01-03 12:15 ` Dr. David Alan Gilbert
2020-01-03 12:33 ` Daniel P. Berrangé
2020-01-03 14:37 ` Dr. David Alan Gilbert
2019-12-12 16:37 ` [PATCH 006/104] virtiofsd: Trim down imported files Dr. David Alan Gilbert (git)
2020-01-03 12:02 ` Daniel P. Berrangé
2020-01-21 9:58 ` Xiao Yang
2020-01-21 10:51 ` Dr. David Alan Gilbert
2020-01-22 0:57 ` Xiao Yang
2019-12-12 16:37 ` [PATCH 007/104] virtiofsd: Format imported files to qemu style Dr. David Alan Gilbert (git)
2020-01-03 12:04 ` Daniel P. Berrangé
2020-01-09 12:21 ` Aleksandar Markovic [this message]
2019-12-12 16:37 ` [PATCH 008/104] virtiofsd: remove mountpoint dummy argument Dr. David Alan Gilbert (git)
2020-01-03 12:12 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 009/104] virtiofsd: remove unused notify reply support Dr. David Alan Gilbert (git)
2020-01-03 12:14 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 010/104] virtiofsd: Fix fuse_daemonize ignored return values Dr. David Alan Gilbert (git)
2020-01-03 12:18 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 011/104] virtiofsd: Fix common header and define for QEMU builds Dr. David Alan Gilbert (git)
2020-01-03 12:22 ` Daniel P. Berrangé
2020-01-06 16:29 ` Dr. David Alan Gilbert
2019-12-12 16:37 ` [PATCH 012/104] virtiofsd: Trim out compatibility code Dr. David Alan Gilbert (git)
2020-01-03 12:26 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 013/104] virtiofsd: Make fsync work even if only inode is passed in Dr. David Alan Gilbert (git)
2020-01-03 15:13 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 014/104] virtiofsd: Add options for virtio Dr. David Alan Gilbert (git)
2020-01-03 15:18 ` Daniel P. Berrangé
2020-01-10 16:01 ` Dr. David Alan Gilbert
2019-12-12 16:37 ` [PATCH 015/104] virtiofsd: add -o source=PATH to help output Dr. David Alan Gilbert (git)
2020-01-03 15:18 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 016/104] virtiofsd: Open vhost connection instead of mounting Dr. David Alan Gilbert (git)
2020-01-03 15:21 ` Daniel P. Berrangé
2020-01-21 6:57 ` Misono Tomohiro
2020-01-21 11:38 ` Dr. David Alan Gilbert
2019-12-12 16:37 ` [PATCH 017/104] virtiofsd: Start wiring up vhost-user Dr. David Alan Gilbert (git)
2020-01-03 15:25 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 018/104] virtiofsd: Add main virtio loop Dr. David Alan Gilbert (git)
2020-01-03 15:26 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 019/104] virtiofsd: get/set features callbacks Dr. David Alan Gilbert (git)
2020-01-03 15:26 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 020/104] virtiofsd: Start queue threads Dr. David Alan Gilbert (git)
2020-01-03 15:27 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 021/104] virtiofsd: Poll kick_fd for queue Dr. David Alan Gilbert (git)
2020-01-03 15:33 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 022/104] virtiofsd: Start reading commands from queue Dr. David Alan Gilbert (git)
2020-01-03 15:34 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 023/104] virtiofsd: Send replies to messages Dr. David Alan Gilbert (git)
2020-01-03 15:36 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 024/104] virtiofsd: Keep track of replies Dr. David Alan Gilbert (git)
2020-01-03 15:41 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 025/104] virtiofsd: Add Makefile wiring for virtiofsd contrib Dr. David Alan Gilbert (git)
2019-12-13 16:02 ` Liam Merwick
2019-12-13 16:56 ` Dr. David Alan Gilbert
2020-01-03 15:41 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 026/104] virtiofsd: Fast path for virtio read Dr. David Alan Gilbert (git)
2020-01-17 18:54 ` Masayoshi Mizuma
2020-01-20 12:32 ` Dr. David Alan Gilbert
2019-12-12 16:37 ` [PATCH 027/104] virtiofsd: add --fd=FDNUM fd passing option Dr. David Alan Gilbert (git)
2020-01-06 14:12 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 028/104] virtiofsd: make -f (foreground) the default Dr. David Alan Gilbert (git)
2020-01-06 14:19 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 029/104] virtiofsd: add vhost-user.json file Dr. David Alan Gilbert (git)
2020-01-06 14:19 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 030/104] virtiofsd: add --print-capabilities option Dr. David Alan Gilbert (git)
2020-01-06 14:20 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 031/104] virtiofs: Add maintainers entry Dr. David Alan Gilbert (git)
2020-01-06 14:21 ` Daniel P. Berrangé
2020-01-15 17:19 ` Philippe Mathieu-Daudé
2019-12-12 16:37 ` [PATCH 032/104] virtiofsd: passthrough_ll: create new files in caller's context Dr. David Alan Gilbert (git)
2020-01-06 14:30 ` Daniel P. Berrangé
2020-01-06 19:00 ` Dr. David Alan Gilbert
2020-01-06 19:08 ` Dr. David Alan Gilbert
2020-01-07 9:22 ` Daniel P. Berrangé
2020-01-10 13:05 ` Dr. David Alan Gilbert
2019-12-12 16:37 ` [PATCH 033/104] virtiofsd: passthrough_ll: add lo_map for ino/fh indirection Dr. David Alan Gilbert (git)
2020-01-17 21:44 ` Masayoshi Mizuma
2019-12-12 16:37 ` [PATCH 034/104] virtiofsd: passthrough_ll: add ino_map to hide lo_inode pointers Dr. David Alan Gilbert (git)
2020-01-17 21:45 ` Masayoshi Mizuma
2019-12-12 16:37 ` [PATCH 035/104] virtiofsd: passthrough_ll: add dirp_map to hide lo_dirp pointers Dr. David Alan Gilbert (git)
2020-01-17 13:58 ` Philippe Mathieu-Daudé
2019-12-12 16:37 ` [PATCH 036/104] virtiofsd: passthrough_ll: add fd_map to hide file descriptors Dr. David Alan Gilbert (git)
2020-01-17 22:32 ` Masayoshi Mizuma
2019-12-12 16:37 ` [PATCH 037/104] virtiofsd: passthrough_ll: add fallback for racy ops Dr. David Alan Gilbert (git)
2020-01-18 16:22 ` Masayoshi Mizuma
2020-01-20 13:26 ` Dr. David Alan Gilbert
2019-12-12 16:37 ` [PATCH 038/104] virtiofsd: validate path components Dr. David Alan Gilbert (git)
2020-01-06 14:32 ` Daniel P. Berrangé
2019-12-12 16:37 ` [PATCH 039/104] virtiofsd: Plumb fuse_bufvec through to do_write_buf Dr. David Alan Gilbert (git)
2020-01-17 21:01 ` Masayoshi Mizuma
2019-12-12 16:38 ` [PATCH 040/104] virtiofsd: Pass write iov's all the way through Dr. David Alan Gilbert (git)
2020-01-19 8:08 ` Xiao Yang
2020-01-20 8:24 ` Philippe Mathieu-Daudé
2020-01-20 13:28 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 041/104] virtiofsd: add fuse_mbuf_iter API Dr. David Alan Gilbert (git)
2020-01-16 14:17 ` Sergio Lopez
2019-12-12 16:38 ` [PATCH 042/104] virtiofsd: validate input buffer sizes in do_write_buf() Dr. David Alan Gilbert (git)
2020-01-16 14:19 ` Sergio Lopez
2019-12-12 16:38 ` [PATCH 043/104] virtiofsd: check input buffer size in fuse_lowlevel.c ops Dr. David Alan Gilbert (git)
2020-01-16 14:25 ` Sergio Lopez
2019-12-12 16:38 ` [PATCH 044/104] virtiofsd: prevent ".." escape in lo_do_lookup() Dr. David Alan Gilbert (git)
2020-01-16 14:33 ` Sergio Lopez
2019-12-12 16:38 ` [PATCH 045/104] virtiofsd: prevent ".." escape in lo_do_readdir() Dr. David Alan Gilbert (git)
2020-01-16 14:35 ` Sergio Lopez
2019-12-12 16:38 ` [PATCH 046/104] virtiofsd: use /proc/self/fd/ O_PATH file descriptor Dr. David Alan Gilbert (git)
2020-01-15 18:09 ` Philippe Mathieu-Daudé
2020-01-17 9:42 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 047/104] virtiofsd: sandbox mount namespace Dr. David Alan Gilbert (git)
2020-01-06 14:36 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 048/104] virtiofsd: move to an empty network namespace Dr. David Alan Gilbert (git)
2020-01-06 14:37 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 049/104] virtiofsd: move to a new pid namespace Dr. David Alan Gilbert (git)
2020-01-06 14:40 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 050/104] virtiofsd: add seccomp whitelist Dr. David Alan Gilbert (git)
2020-01-06 14:56 ` Daniel P. Berrangé
2020-01-06 18:54 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 051/104] virtiofsd: Parse flag FUSE_WRITE_KILL_PRIV Dr. David Alan Gilbert (git)
2020-01-15 12:06 ` Misono Tomohiro
2020-01-15 14:34 ` Dr. David Alan Gilbert
2020-01-16 14:37 ` Sergio Lopez
2019-12-12 16:38 ` [PATCH 052/104] virtiofsd: cap-ng helpers Dr. David Alan Gilbert (git)
2020-01-06 14:58 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 053/104] virtiofsd: Drop CAP_FSETID if client asked for it Dr. David Alan Gilbert (git)
2020-01-16 4:41 ` Misono Tomohiro
2020-01-16 15:21 ` Sergio Lopez
2019-12-12 16:38 ` [PATCH 054/104] virtiofsd: set maximum RLIMIT_NOFILE limit Dr. David Alan Gilbert (git)
2020-01-06 15:00 ` Daniel P. Berrangé
2020-01-15 17:09 ` Philippe Mathieu-Daudé
2020-01-15 17:38 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 055/104] virtiofsd: fix libfuse information leaks Dr. David Alan Gilbert (git)
2020-01-06 15:01 ` Daniel P. Berrangé
2020-01-15 17:07 ` Philippe Mathieu-Daudé
2019-12-12 16:38 ` [PATCH 056/104] virtiofsd: add security guide document Dr. David Alan Gilbert (git)
2020-01-06 15:03 ` Daniel P. Berrangé
2020-01-06 17:53 ` Dr. David Alan Gilbert
2020-01-07 10:05 ` Daniel P. Berrangé
2020-01-09 17:02 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 057/104] virtiofsd: add --syslog command-line option Dr. David Alan Gilbert (git)
2020-01-06 15:05 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 058/104] virtiofsd: print log only when priority is high enough Dr. David Alan Gilbert (git)
2020-01-06 15:10 ` Daniel P. Berrangé
2020-01-06 17:05 ` Dr. David Alan Gilbert
2020-01-06 17:20 ` Daniel P. Berrangé
2020-01-06 17:27 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 059/104] virtiofsd: Add ID to the log with FUSE_LOG_DEBUG level Dr. David Alan Gilbert (git)
2020-01-06 15:18 ` Daniel P. Berrangé
2020-01-06 17:47 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 060/104] virtiofsd: Add timestamp " Dr. David Alan Gilbert (git)
2020-01-07 11:11 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 061/104] virtiofsd: Handle reinit Dr. David Alan Gilbert (git)
2020-01-07 11:12 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 062/104] virtiofsd: Handle hard reboot Dr. David Alan Gilbert (git)
2020-01-07 11:14 ` Daniel P. Berrangé
2020-01-10 15:43 ` Dr. David Alan Gilbert
2020-01-20 6:46 ` Misono Tomohiro
2020-01-22 18:28 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 063/104] virtiofsd: Kill threads when queues are stopped Dr. David Alan Gilbert (git)
2020-01-07 11:16 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 064/104] vhost-user: Print unexpected slave message types Dr. David Alan Gilbert (git)
2020-01-07 11:18 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 065/104] contrib/libvhost-user: Protect slave fd with mutex Dr. David Alan Gilbert (git)
2020-01-07 11:19 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 066/104] virtiofsd: passthrough_ll: add renameat2 support Dr. David Alan Gilbert (git)
2020-01-07 11:21 ` Daniel P. Berrangé
2020-01-10 9:52 ` Dr. David Alan Gilbert
2020-01-13 20:06 ` Dr. David Alan Gilbert
2020-01-14 8:29 ` Daniel P. Berrangé
2020-01-14 10:07 ` Dr. David Alan Gilbert
2020-01-14 10:12 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 067/104] virtiofsd: passthrough_ll: disable readdirplus on cache=never Dr. David Alan Gilbert (git)
2020-01-07 11:22 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 068/104] virtiofsd: passthrough_ll: control readdirplus Dr. David Alan Gilbert (git)
2020-01-07 11:23 ` Daniel P. Berrangé
2020-01-10 15:04 ` Dr. David Alan Gilbert
2020-01-10 15:13 ` Miklos Szeredi
2020-01-10 15:18 ` Daniel P. Berrangé
2020-01-10 15:30 ` Miklos Szeredi
2020-01-10 15:40 ` Vivek Goyal
2020-01-10 16:00 ` Miklos Szeredi
2019-12-12 16:38 ` [PATCH 069/104] virtiofsd: rename unref_inode() to unref_inode_lolocked() Dr. David Alan Gilbert (git)
2020-01-07 11:23 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 070/104] virtiofsd: fail when parent inode isn't known in lo_do_lookup() Dr. David Alan Gilbert (git)
2020-01-16 7:17 ` Misono Tomohiro
2020-01-20 10:08 ` Sergio Lopez
2019-12-12 16:38 ` [PATCH 071/104] virtiofsd: extract root inode init into setup_root() Dr. David Alan Gilbert (git)
2020-01-16 7:20 ` Misono Tomohiro
2020-01-16 15:51 ` Dr. David Alan Gilbert
2020-01-20 10:09 ` Sergio Lopez
2019-12-12 16:38 ` [PATCH 072/104] virtiofsd: passthrough_ll: fix refcounting on remove/rename Dr. David Alan Gilbert (git)
2020-01-16 11:56 ` Misono Tomohiro
2020-01-16 16:45 ` Dr. David Alan Gilbert
2020-01-17 10:19 ` Miklos Szeredi
2020-01-17 11:37 ` Dr. David Alan Gilbert
2020-01-17 18:43 ` Dr. David Alan Gilbert
2020-01-20 10:17 ` Sergio Lopez
2020-01-20 10:56 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 073/104] virtiofsd: passthrough_ll: clean up cache related options Dr. David Alan Gilbert (git)
2020-01-07 11:24 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 074/104] virtiofsd: passthrough_ll: use hashtable Dr. David Alan Gilbert (git)
2020-01-07 11:28 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 075/104] virtiofsd: Clean up inodes on destroy Dr. David Alan Gilbert (git)
2020-01-07 11:29 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 076/104] virtiofsd: support nanosecond resolution for file timestamp Dr. David Alan Gilbert (git)
2020-01-07 11:30 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 077/104] virtiofsd: fix error handling in main() Dr. David Alan Gilbert (git)
2020-01-07 11:30 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 078/104] virtiofsd: cleanup allocated resource in se Dr. David Alan Gilbert (git)
2020-01-07 11:34 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 079/104] virtiofsd: fix memory leak on lo.source Dr. David Alan Gilbert (git)
2020-01-07 11:37 ` Daniel P. Berrangé
2020-01-09 17:38 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 080/104] virtiofsd: add helper for lo_data cleanup Dr. David Alan Gilbert (git)
2020-01-07 11:40 ` Daniel P. Berrangé
2020-01-09 17:41 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 081/104] virtiofsd: Prevent multiply running with same vhost_user_socket Dr. David Alan Gilbert (git)
2020-01-07 11:43 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 082/104] virtiofsd: enable PARALLEL_DIROPS during INIT Dr. David Alan Gilbert (git)
2020-01-07 11:44 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 083/104] virtiofsd: fix incorrect error handling in lo_do_lookup Dr. David Alan Gilbert (git)
2020-01-07 11:45 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 084/104] Virtiofsd: fix memory leak on fuse queueinfo Dr. David Alan Gilbert (git)
2020-01-15 11:20 ` Misono Tomohiro
2020-01-15 16:57 ` Dr. David Alan Gilbert
2020-01-16 0:54 ` misono.tomohiro
2020-01-16 12:19 ` Dr. David Alan Gilbert
2020-01-20 10:24 ` Sergio Lopez
2020-01-20 10:54 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 085/104] virtiofsd: Support remote posix locks Dr. David Alan Gilbert (git)
2020-01-15 23:38 ` Masayoshi Mizuma
2020-01-16 13:26 ` Vivek Goyal
2020-01-17 9:27 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 086/104] virtiofsd: use fuse_lowlevel_is_virtio() in fuse_session_destroy() Dr. David Alan Gilbert (git)
2020-01-07 12:01 ` Daniel P. Berrangé
2020-01-07 13:24 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 087/104] virtiofsd: prevent fv_queue_thread() vs virtio_loop() races Dr. David Alan Gilbert (git)
2020-01-07 12:02 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 088/104] virtiofsd: make lo_release() atomic Dr. David Alan Gilbert (git)
2020-01-07 12:03 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 089/104] virtiofsd: prevent races with lo_dirp_put() Dr. David Alan Gilbert (git)
2020-01-17 13:52 ` Philippe Mathieu-Daudé
2019-12-12 16:38 ` [PATCH 090/104] virtiofsd: rename inode->refcount to inode->nlookup Dr. David Alan Gilbert (git)
2020-01-17 13:54 ` Philippe Mathieu-Daudé
2019-12-12 16:38 ` [PATCH 091/104] libvhost-user: Fix some memtable remap cases Dr. David Alan Gilbert (git)
2020-01-17 13:58 ` Marc-André Lureau
2020-01-20 15:50 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 092/104] virtiofsd: add man page Dr. David Alan Gilbert (git)
2019-12-13 14:33 ` Liam Merwick
2019-12-13 15:26 ` Dr. David Alan Gilbert
2020-01-07 12:13 ` Daniel P. Berrangé
2020-01-09 20:02 ` Dr. David Alan Gilbert
2020-01-10 9:30 ` Daniel P. Berrangé
2020-01-10 11:06 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 093/104] virtiofsd: introduce inode refcount to prevent use-after-free Dr. David Alan Gilbert (git)
2020-01-16 12:25 ` Misono Tomohiro
2020-01-16 17:21 ` Stefan Hajnoczi
2020-01-16 17:42 ` Dr. David Alan Gilbert
2020-01-17 0:47 ` misono.tomohiro
2020-01-20 10:28 ` Sergio Lopez
2019-12-12 16:38 ` [PATCH 094/104] virtiofsd: do not always set FUSE_FLOCK_LOCKS Dr. David Alan Gilbert (git)
2020-01-17 8:50 ` Misono Tomohiro
2020-01-20 10:31 ` Sergio Lopez
2019-12-12 16:38 ` [PATCH 095/104] virtiofsd: convert more fprintf and perror to use fuse log infra Dr. David Alan Gilbert (git)
2020-01-07 12:16 ` Daniel P. Berrangé
2020-01-16 12:29 ` Misono Tomohiro
2020-01-16 16:32 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 096/104] virtiofsd: Reset O_DIRECT flag during file open Dr. David Alan Gilbert (git)
2020-01-07 12:17 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 097/104] virtiofsd: Fix data corruption with O_APPEND wirte in writeback mode Dr. David Alan Gilbert (git)
2020-01-07 12:20 ` Daniel P. Berrangé
2020-01-07 13:27 ` Dr. David Alan Gilbert
2019-12-12 16:38 ` [PATCH 098/104] virtiofsd: add definition of fuse_buf_writev() Dr. David Alan Gilbert (git)
2020-01-07 12:21 ` Daniel P. Berrangé
2019-12-12 16:38 ` [PATCH 099/104] virtiofsd: use fuse_buf_writev to replace fuse_buf_write for better performance Dr. David Alan Gilbert (git)
2020-01-07 12:23 ` Daniel P. Berrangé
2020-01-10 13:15 ` Dr. David Alan Gilbert
2019-12-12 16:39 ` [PATCH 100/104] virtiofsd: process requests in a thread pool Dr. David Alan Gilbert (git)
2020-01-20 12:54 ` Misono Tomohiro
2019-12-12 16:39 ` [PATCH 101/104] virtiofsd: prevent FUSE_INIT/FUSE_DESTROY races Dr. David Alan Gilbert (git)
2020-01-15 23:05 ` Masayoshi Mizuma
2020-01-16 12:24 ` Dr. David Alan Gilbert
2020-01-17 13:40 ` Philippe Mathieu-Daudé
2020-01-17 15:28 ` Dr. David Alan Gilbert
2020-01-17 15:30 ` Philippe Mathieu-Daudé
2019-12-12 16:39 ` [PATCH 102/104] virtiofsd: fix lo_destroy() resource leaks Dr. David Alan Gilbert (git)
2020-01-17 13:43 ` Philippe Mathieu-Daudé
2019-12-12 16:39 ` [PATCH 103/104] virtiofsd: add --thread-pool-size=NUM option Dr. David Alan Gilbert (git)
2020-01-07 12:25 ` Daniel P. Berrangé
2020-01-17 13:35 ` Philippe Mathieu-Daudé
2019-12-12 16:39 ` [PATCH 104/104] virtiofsd: Convert lo_destroy to take the lo->mutex lock itself Dr. David Alan Gilbert (git)
2020-01-17 13:33 ` Philippe Mathieu-Daudé
2019-12-12 18:21 ` [PATCH 000/104] virtiofs daemon [all] no-reply
2020-01-17 11:32 ` Dr. David Alan Gilbert
2020-01-17 13:32 ` [PATCH 105/104] virtiofsd: Unref old/new inodes with the same mutex lock in lo_rename() Philippe Mathieu-Daudé
2020-01-19 8:35 ` Xiao Yang
2020-01-20 8:27 ` Philippe Mathieu-Daudé
2020-01-20 18:52 ` Dr. David Alan Gilbert
2020-01-20 18:55 ` Philippe Mathieu-Daudé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAL1e-=hfCRVFbppJwJiTCiv=k1BfbzuxRg9NbcRLtxgA33r-uQ@mail.gmail.com' \
--to=aleksandar.m.mail@gmail.com \
--cc=dgilbert@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=vgoyal@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).