Hi

On Thu, May 5, 2022 at 3:43 PM Markus Armbruster <arm...@redhat.com> wrote:

> marcandre.lur...@redhat.com writes:
>
> > From: Marc-André Lureau <marcandre.lur...@redhat.com>
> >
> > qemu_open_old() uses qemu_open_internal() which handles special
> > "/dev/fdset/" path for monitor fd sets, set CLOEXEC, and uses Error
> > reporting (and some O_DIRECT special error casing).
> >
> > The monitor fdset handling is unnecessary for qga, use
> > qemu_open_cloexec() instead.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com>
> > ---
> >  qga/channel-posix.c  | 14 +++++++++-----
> >  qga/commands-posix.c | 24 ++++++++++++------------
> >  2 files changed, 21 insertions(+), 17 deletions(-)
> >
> > diff --git a/qga/channel-posix.c b/qga/channel-posix.c
> > index 0ce594bc36c2..a1262b130145 100644
> > --- a/qga/channel-posix.c
> > +++ b/qga/channel-posix.c
> > @@ -1,4 +1,5 @@
> >  #include "qemu/osdep.h"
> > +#include "qemu/cutils.h"
> >  #include <termios.h>
> >  #include "qapi/error.h"
> >  #include "qemu/sockets.h"
> > @@ -128,11 +129,15 @@ static gboolean ga_channel_open(GAChannel *c,
> const gchar *path,
> >      switch (c->method) {
> >      case GA_CHANNEL_VIRTIO_SERIAL: {
> >          assert(fd < 0);
> > -        fd = qemu_open_old(path, O_RDWR | O_NONBLOCK
> > +        fd = qemu_open_cloexec(
> > +            path,
> >  #ifndef CONFIG_SOLARIS
> > -                           | O_ASYNC
> > +            O_ASYNC |
> >  #endif
> > -                           );
> > +            O_RDWR | O_NONBLOCK,
> > +            0,
> > +            errp
> > +        );
> >          if (fd == -1) {
> >              error_setg_errno(errp, errno, "error opening channel");
> >              return false;
> > @@ -157,9 +162,8 @@ static gboolean ga_channel_open(GAChannel *c, const
> gchar *path,
> >          struct termios tio;
> >
> >          assert(fd < 0);
> > -        fd = qemu_open_old(path, O_RDWR | O_NOCTTY | O_NONBLOCK);
> > +        fd = qemu_open_cloexec(path, O_RDWR | O_NOCTTY | O_NONBLOCK, 0,
> errp);
> >          if (fd == -1) {
> > -            error_setg_errno(errp, errno, "error opening channel");
> >              return false;
> >          }
> >          tcgetattr(fd, &tio);
> > diff --git a/qga/commands-posix.c b/qga/commands-posix.c
> > index 8ebc327c5e02..f82205e25813 100644
> > --- a/qga/commands-posix.c
> > +++ b/qga/commands-posix.c
> > @@ -1392,6 +1392,7 @@ static GuestDiskInfoList *get_disk_partitions(
> >
> >  static void get_nvme_smart(GuestDiskInfo *disk)
> >  {
> > +    Error *err = NULL;
> >      int fd;
> >      GuestNVMeSmart *smart;
> >      NvmeSmartLog log = {0};
> > @@ -1404,9 +1405,10 @@ static void get_nvme_smart(GuestDiskInfo *disk)
> >                   | (((sizeof(log) >> 2) - 1) << 16)
> >      };
> >
> > -    fd = qemu_open_old(disk->name, O_RDONLY);
> > +    fd = qemu_open_cloexec(disk->name, O_RDONLY, 0, &err);
> >      if (fd == -1) {
> > -        g_debug("Failed to open device: %s: %s", disk->name,
> g_strerror(errno));
> > +        g_debug("Failed to open device: %s: %s", disk->name,
> error_get_pretty(err));
> > +        error_free(err);
> >          return;
> >      }
> >
> > @@ -1737,9 +1739,8 @@ int64_t qmp_guest_fsfreeze_freeze_list(bool
> has_mountpoints,
> >              }
> >          }
> >
> > -        fd = qemu_open_old(mount->dirname, O_RDONLY);
> > +        fd = qemu_open_cloexec(mount->dirname, O_RDONLY, 0, errp);
> >          if (fd == -1) {
> > -            error_setg_errno(errp, errno, "failed to open %s",
> mount->dirname);
> >              goto error;
> >          }
> >
> > @@ -1804,7 +1805,7 @@ int64_t qmp_guest_fsfreeze_thaw(Error **errp)
> >
> >      QTAILQ_FOREACH(mount, &mounts, next) {
> >          logged = false;
> > -        fd = qemu_open_old(mount->dirname, O_RDONLY);
> > +        fd = qemu_open_cloexec(mount->dirname, O_RDONLY, 0, NULL);
> >          if (fd == -1) {
> >              continue;
> >          }
> > @@ -1864,21 +1865,20 @@ static void guest_fsfreeze_cleanup(void)
> >  GuestFilesystemTrimResponse *
> >  qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **errp)
> >  {
> > +    ERRP_GUARD();
> >      GuestFilesystemTrimResponse *response;
> >      GuestFilesystemTrimResult *result;
> >      int ret = 0;
> >      FsMountList mounts;
> >      struct FsMount *mount;
> >      int fd;
> > -    Error *local_err = NULL;
> >      struct fstrim_range r;
> >
> >      slog("guest-fstrim called");
> >
> >      QTAILQ_INIT(&mounts);
> > -    build_fs_mount_list(&mounts, &local_err);
> > -    if (local_err) {
> > -        error_propagate(errp, local_err);
> > +    build_fs_mount_list(&mounts, errp);
> > +    if (*errp) {
>
> Suggest to change build_fs_mount_list() to return bool, in accordance
> with the guidance under = Rules = in include/qapi/error.h, then do
>
>        if (!build_fs_mount_list(&mounts, errp)) {
>
>
ack


> No need for ERRP_GUARD() then.
>
>
This is not a demand.
>
> >          return NULL;
> >      }
> >
> > @@ -1890,11 +1890,11 @@ qmp_guest_fstrim(bool has_minimum, int64_t
> minimum, Error **errp)
> >
> >          QAPI_LIST_PREPEND(response->paths, result);
> >
> > -        fd = qemu_open_old(mount->dirname, O_RDONLY);
> > +        fd = qemu_open_cloexec(mount->dirname, O_RDONLY, 0, errp);
> >          if (fd == -1) {
> > -            result->error = g_strdup_printf("failed to open: %s",
> > -                                            strerror(errno));
> > +            result->error = g_strdup(error_get_pretty(*errp));
> >              result->has_error = true;
> > +            g_clear_pointer(errp, error_free);
> >              continue;
> >          }
>
>
>

-- 
Marc-André Lureau

Reply via email to