From: "Daniel P. Berrangé" <berrange@redhat.com>
To: "Marc-André Lureau" <marcandre.lureau@gmail.com>
Cc: QEMU <qemu-devel@nongnu.org>,
Markus Armbruster <armbru@redhat.com>,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
Gerd Hoffmann <kraxel@redhat.com>,
philmd@redhat.com
Subject: Re: [Qemu-devel] [PATCH v6 05/11] hw/usb: switch MTP to use new inotify APIs
Date: Tue, 13 Nov 2018 17:07:09 +0000 [thread overview]
Message-ID: <20181113170709.GJ14591@redhat.com> (raw)
In-Reply-To: <CAJ+F1C+mSMjCKiZueUUoOWUCrgx5dML=zFZCQF__CW8hmwCn+A@mail.gmail.com>
On Wed, Nov 07, 2018 at 10:26:29PM +0400, Marc-André Lureau wrote:
> On Fri, Oct 19, 2018 at 5:42 PM Daniel P. Berrangé <berrange@redhat.com> wrote:
> >
> > The internal inotify APIs allow alot of conditional statements to be
>
> a lot
>
> > cleared out, and provide a simpler callback for handling events.
> >
> > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > ---
> > hw/usb/dev-mtp.c | 250 ++++++++++++++++----------------------------
> > hw/usb/trace-events | 2 +-
> > 2 files changed, 93 insertions(+), 159 deletions(-)
> >
> > diff --git a/hw/usb/dev-mtp.c b/hw/usb/dev-mtp.c
> > index ccbe25820b..1a8d0f088d 100644
> > --- a/hw/usb/dev-mtp.c
> > +++ b/hw/usb/dev-mtp.c
> > @@ -15,13 +15,11 @@
> > #include <dirent.h>
> >
> > #include <sys/statvfs.h>
> > -#ifdef CONFIG_INOTIFY1
> > -#include <sys/inotify.h>
> > -#include "qemu/main-loop.h"
> > -#endif
> > +
> >
> > #include "qemu-common.h"
> > #include "qemu/iov.h"
> > +#include "qemu/filemonitor.h"
> > #include "trace.h"
> > #include "hw/usb.h"
> > #include "desc.h"
> > @@ -124,7 +122,6 @@ enum {
> > EP_EVENT,
> > };
> >
> > -#ifdef CONFIG_INOTIFY1
> > typedef struct MTPMonEntry MTPMonEntry;
> >
> > struct MTPMonEntry {
> > @@ -133,7 +130,6 @@ struct MTPMonEntry {
> >
> > QTAILQ_ENTRY(MTPMonEntry) next;
> > };
> > -#endif
> >
> > struct MTPControl {
> > uint16_t code;
> > @@ -162,10 +158,8 @@ struct MTPObject {
> > char *name;
> > char *path;
> > struct stat stat;
> > -#ifdef CONFIG_INOTIFY1
> > - /* inotify watch cookie */
> > + /* file monitor watch cookie */
> > int watchfd;
>
> Why not rename it watchid to avoid confusion?
Yes, will do.
> > -static void inotify_watchfn(void *arg)
> > +static void file_monitor_event(int wd,
> > + QFileMonitorEvent ev,
> > + const char *name,
> > + void *opaque)
> > {
> > - MTPState *s = arg;
> > - ssize_t bytes;
> > - /* From the man page: atleast one event can be read */
> > - int pos;
> > - char buf[sizeof(struct inotify_event) + NAME_MAX + 1];
> > -
> > - for (;;) {
> > - bytes = read(s->inotifyfd, buf, sizeof(buf));
> > - pos = 0;
> > -
> > - if (bytes <= 0) {
> > - /* Better luck next time */
> > + MTPState *s = opaque;
> > + int watchfd = 0;
> > + MTPObject *parent = usb_mtp_object_lookup_wd(s, wd);
> > + MTPMonEntry *entry = NULL;
> > + MTPObject *o;
> > +
> > + if (!parent) {
> > + return;
> > + }
> > +
> > + switch (ev) {
> > + case QFILE_MONITOR_EVENT_CREATED:
> > + if (usb_mtp_object_lookup_name(parent, name, -1)) {
> > + /* Duplicate create event */
> > return;
> > }
> > + entry = g_new0(MTPMonEntry, 1);
> > + entry->handle = s->next_handle;
> > + entry->event = EVT_OBJ_ADDED;
> > + o = usb_mtp_add_child(s, parent, name);
> > + if (!o) {
> > + g_free(entry);
> > + return;
> > + }
> > + o->watchfd = watchfd;
>
> this effectively always set o->watchfd to 0, which is already
> initialized to 0 with g_new0(), you can drop it
Yeah, pre-existing pointless code, so I've dropped it.
> > static void usb_mtp_object_readdir(MTPState *s, MTPObject *o)
> > {
> > struct dirent *entry;
> > DIR *dir;
> > + Error *err = NULL;
> >
> > if (o->have_children) {
> > return;
> > @@ -662,16 +596,19 @@ static void usb_mtp_object_readdir(MTPState *s, MTPObject *o)
> > if (!dir) {
> > return;
> > }
> > -#ifdef CONFIG_INOTIFY1
> > - int watchfd = usb_mtp_add_watch(s->inotifyfd, o->path);
> > +
> > + int watchfd = qemu_file_monitor_add_watch(s->file_monitor, o->path, NULL,
> > + file_monitor_event, s, &err);
>
> There is an add_watch(), but I don't see the corresponding
> remove_watch(). This may probably cause crashes if MTPState is freed.
Yes, I've added code to remove the watch, and also
to use a private file_monitor instance so free'ing
that will release all watches as a safety net.
>
> > if (watchfd == -1) {
> > - fprintf(stderr, "usb-mtp: failed to add watch for %s\n", o->path);
> > + fprintf(stderr, "usb-mtp: failed to add watch for %s: %s\n", o->path,
> > + error_get_pretty(err));
>
> maybe it's a good time to turn into error_report() ?
Yep
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2018-11-13 17:07 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-19 13:38 [Qemu-devel] [PATCH v6 00/11] Add a standard authorization framework Daniel P. Berrangé
2018-10-19 13:38 ` [Qemu-devel] [PATCH v6 01/11] util: add helper APIs for dealing with inotify in portable manner Daniel P. Berrangé
2018-11-07 18:08 ` Marc-André Lureau
2018-11-12 16:49 ` Daniel P. Berrangé
2018-10-19 13:38 ` [Qemu-devel] [PATCH v6 02/11] qom: don't require user creatable objects to be registered Daniel P. Berrangé
2018-11-07 18:09 ` Marc-André Lureau
2018-10-19 13:38 ` [Qemu-devel] [PATCH v6 03/11] hw/usb: don't set IN_ISDIR for inotify watch in MTP driver Daniel P. Berrangé
2018-11-07 18:10 ` Marc-André Lureau
2018-10-19 13:38 ` [Qemu-devel] [PATCH v6 04/11] hw/usb: fix const-ness for string params " Daniel P. Berrangé
2018-11-07 18:11 ` Marc-André Lureau
2018-10-19 13:38 ` [Qemu-devel] [PATCH v6 05/11] hw/usb: switch MTP to use new inotify APIs Daniel P. Berrangé
2018-11-07 18:26 ` Marc-André Lureau
2018-11-13 17:07 ` Daniel P. Berrangé [this message]
2018-10-19 13:38 ` [Qemu-devel] [PATCH v6 06/11] authz: add QAuthZ object as an authorization base class Daniel P. Berrangé
2018-11-07 22:23 ` Marc-André Lureau
2018-10-19 13:38 ` [Qemu-devel] [PATCH v6 07/11] authz: add QAuthZSimple object type for easy whitelist auth checks Daniel P. Berrangé
2018-10-22 23:54 ` Philippe Mathieu-Daudé
2018-11-07 22:23 ` Marc-André Lureau
2018-11-13 17:11 ` Daniel P. Berrangé
2018-10-19 13:38 ` [Qemu-devel] [PATCH v6 08/11] authz: add QAuthZList object type for an access control list Daniel P. Berrangé
2018-10-23 10:18 ` Philippe Mathieu-Daudé
2018-11-07 22:23 ` Marc-André Lureau
2018-11-07 22:38 ` Eric Blake
2018-11-13 17:29 ` Daniel P. Berrangé
2018-11-08 8:18 ` Marc-André Lureau
2018-10-19 13:38 ` [Qemu-devel] [PATCH v6 09/11] authz: add QAuthZListFile object type for a file " Daniel P. Berrangé
2018-10-22 23:56 ` Philippe Mathieu-Daudé
2018-11-07 22:23 ` Marc-André Lureau
2018-11-15 10:33 ` Daniel P. Berrangé
2018-10-19 13:38 ` [Qemu-devel] [PATCH v6 10/11] authz: add QAuthZPAM object type for authorizing using PAM Daniel P. Berrangé
2018-11-07 22:23 ` Marc-André Lureau
2018-11-15 10:32 ` Daniel P. Berrangé
2018-10-19 13:38 ` [Qemu-devel] [PATCH v6 11/11] authz: delete existing ACL implementation Daniel P. Berrangé
2018-10-23 11:14 ` Philippe Mathieu-Daudé
2018-11-08 8:15 ` Marc-André Lureau
2018-11-14 16:45 ` Daniel P. Berrangé
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=20181113170709.GJ14591@redhat.com \
--to=berrange@redhat.com \
--cc=armbru@redhat.com \
--cc=dgilbert@redhat.com \
--cc=kraxel@redhat.com \
--cc=marcandre.lureau@gmail.com \
--cc=philmd@redhat.com \
--cc=qemu-devel@nongnu.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.