From: Eric Blake <eblake@redhat.com>
To: Corey Bryant <coreyb@linux.vnet.ibm.com>
Cc: kwolf@redhat.com, aliguori@us.ibm.com,
stefanha@linux.vnet.ibm.com, libvir-list@redhat.com,
qemu-devel@nongnu.org, lcapitulino@redhat.com,
pbonzini@redhat.com
Subject: Re: [Qemu-devel] [PATCH v8 2/7] qapi: Introduce add-fd, remove-fd, query-fdsets
Date: Thu, 09 Aug 2012 23:57:27 -0600 [thread overview]
Message-ID: <5024A2C7.6020400@redhat.com> (raw)
In-Reply-To: <1344564649-6272-3-git-send-email-coreyb@linux.vnet.ibm.com>
[-- Attachment #1: Type: text/plain, Size: 5436 bytes --]
On 08/09/2012 08:10 PM, Corey Bryant wrote:
> This patch adds support that enables passing of file descriptors
> to the QEMU monitor where they will be stored in specified file
> descriptor sets.
>
> A file descriptor set can be used by a client like libvirt to
> store file descriptors for the same file. This allows the
> client to open a file with different access modes (O_RDWR,
> O_WRONLY, O_RDONLY) and add/remove the passed fds to/from an fd
> set as needed. This will allow QEMU to (in a later patch in this
> series) "open" and "reopen" the same file by dup()ing the fd in
> the fd set that corresponds to the file, where the fd has the
> matching access mode flag that QEMU requests.
>
> The new QMP commands are:
> add-fd: Add a file descriptor to an fd set
> remove-fd: Remove a file descriptor from an fd set
> query-fdsets: Return information describing all fd sets
>
> Note: These commands are not compatible with the existing getfd
> and closefd QMP commands.
>
> Signed-off-by: Corey Bryant <coreyb@linux.vnet.ibm.com>
> +void qmp_remove_fd(int64_t fdset_id, bool has_fd, int64_t fd, Error **errp)
> +{
> + MonFdset *mon_fdset;
> + MonFdsetFd *mon_fdset_fd;
> + char fd_str[20];
> +
> + QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
> + if (mon_fdset->id != fdset_id) {
> + continue;
> + }
> + QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
> + if (has_fd && mon_fdset_fd->fd != fd) {
> + continue;
> + }
> + mon_fdset_fd->removed = true;
> + if (has_fd) {
> + break;
> + }
> + }
> + monitor_fdset_cleanup(mon_fdset);
> + return;
> + }
> + snprintf(fd_str, sizeof(fd_str), "%" PRId64, fd);
> + error_set(errp, QERR_FD_NOT_FOUND, fd_str);
This error catches the case of fdset_id not found, but you never raise
an error when has_fd is true but fd is not found within fdset_id. You
also don't raise an error for back-to-back remove-fd(fdset-id=1,fd=3),
because you aren't checking whether mon_fdset_fd->removed was already true.
I'm not sure which semantic is better, but I _am_ worried that we have
both semantics in teh same function (are we arguing that this command
succeeds when the fd is gone, even if it already was gone? Or are we
arguing that this command diagnoses failure on an attempt to remove
something that doesn't exist). I guess I'm 60-40 towards always issuing
an error on an attempt to remove something that can't be found or is
already removed.
> +}
> +
> +FdsetInfoList *qmp_query_fdsets(Error **errp)
> +{
> + MonFdset *mon_fdset;
> + MonFdsetFd *mon_fdset_fd;
> + FdsetInfoList *fdset_list = NULL;
> +
> + QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
> + FdsetInfoList *fdset_info = g_malloc0(sizeof(*fdset_info));
> + FdsetFdInfoList *fdsetfd_list = NULL;
> +
> + fdset_info->value = g_malloc0(sizeof(*fdset_info->value));
> + fdset_info->value->fdset_id = mon_fdset->id;
> +
> + QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
> + FdsetFdInfoList *fdsetfd_info;
> +
> + if (mon_fdset_fd->removed) {
> + continue;
> + }
This means that an fdset with all fds removed will show up as empty in
the output; I guess that's okay, as libvirt could use that to infer that
the dup()d fds are still in use. The alternative is to keep track of
whether we have output any information about an fd within a set before
including the set itself in the overall output.
> +++ b/qapi-schema.json
> +##
> +# @add-fd:
> +#
> +# Add a file descriptor, that was passed via SCM rights, to an fd set.
> +#
> +# @fdset-id: #optional The ID of the fd set to add the file descriptor to.
> +#
> +# @opaque: #optional A free-form string that can be used to describe the fd.
> +#
> +# Returns: @AddfdInfo on success
> +# If file descriptor was not received, FdNotSupplied
> +# If @fdset_id does not exist, InvalidParameterValue
Missed one: s/_/-/
> +##
> +# @remove-fd:
> +#
> +# Remove a file descriptor from an fd set.
> +#
> +# @fdset-id: The ID of the fd set that the file descriptor belongs to.
> +#
> +# @fd: #optional The file descriptor that is to be removed.
> +#
> +# Returns: Nothing on success
> +# If @fdset_id or @fd is not found, FdNotFound
and another s/_/-/
> +SQMP
> +query-fdsets
> +-------------
> +
> +Return information describing all fd sets.
> +
> +Arguments: None
> +
> +Example:
> +
> +-> { "execute": "query-fdsets" }
> +<- { "return": [
> + {
> + "fdset-id": 1
missing a comma
> + "fds": [
> + {
> + "fd": 21,
JSON does not permit trailing commas.
> + },
> + {
> + "fd": 23,
and again
> + }
> + ],
> + },
> + {
> + "fdset-id": 2
missing a comma
> + "fds": [
> + {
> + "fd": 22,
trailing comma
Also, it might be nice to include something like:
"opaque":"rdonly:/path/to/file"
in one of the examples to give a hint to the reader how to use opaque.
--
Eric Blake eblake@redhat.com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 620 bytes --]
next prev parent reply other threads:[~2012-08-10 5:57 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-10 2:10 [Qemu-devel] [PATCH v8 0/7] file descriptor passing using fd sets Corey Bryant
2012-08-10 2:10 ` [Qemu-devel] [PATCH v8 1/7] qemu-char: Add MSG_CMSG_CLOEXEC flag to recvmsg Corey Bryant
2012-08-10 2:10 ` [Qemu-devel] [PATCH v8 2/7] qapi: Introduce add-fd, remove-fd, query-fdsets Corey Bryant
2012-08-10 5:57 ` Eric Blake [this message]
2012-08-10 13:01 ` Corey Bryant
2012-08-10 7:20 ` Stefan Hajnoczi
2012-08-10 14:21 ` Corey Bryant
2012-08-10 16:08 ` Kevin Wolf
2012-08-10 16:41 ` Corey Bryant
2012-08-10 2:10 ` [Qemu-devel] [PATCH v8 3/7] monitor: Clean up fd sets on monitor disconnect Corey Bryant
2012-08-10 2:10 ` [Qemu-devel] [PATCH v8 4/7] block: Prevent detection of /dev/fdset/ as floppy Corey Bryant
2012-08-10 2:10 ` [Qemu-devel] [PATCH v8 5/7] block: Convert open calls to qemu_open Corey Bryant
2012-08-10 2:10 ` [Qemu-devel] [PATCH v8 6/7] block: Convert close calls to qemu_close Corey Bryant
2012-08-10 2:10 ` [Qemu-devel] [PATCH v8 7/7] block: Enable qemu_open/close to work with fd sets Corey Bryant
2012-08-10 6:16 ` Eric Blake
2012-08-10 14:17 ` Corey Bryant
2012-08-10 15:25 ` Eric Blake
2012-08-10 15:44 ` Corey Bryant
2012-08-10 16:34 ` Kevin Wolf
2012-08-10 16:56 ` Corey Bryant
2012-08-10 17:03 ` Corey Bryant
2012-08-10 16:36 ` [Qemu-devel] [PATCH v8 0/7] file descriptor passing using " Kevin Wolf
2012-08-10 16:57 ` Corey Bryant
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=5024A2C7.6020400@redhat.com \
--to=eblake@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=coreyb@linux.vnet.ibm.com \
--cc=kwolf@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=libvir-list@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@linux.vnet.ibm.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).