qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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 :|

  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 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).