qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] block/blkio: fix fd leak and add more comments for the fd passing
@ 2023-08-01 16:03 Stefano Garzarella
  2023-08-01 16:03 ` [PATCH 1/2] block/blkio: close the fd when blkio_connect() fails Stefano Garzarella
  2023-08-01 16:03 ` [PATCH 2/2] block/blkio: add more comments on the fd passing handling Stefano Garzarella
  0 siblings, 2 replies; 6+ messages in thread
From: Stefano Garzarella @ 2023-08-01 16:03 UTC (permalink / raw)
  To: qemu-devel
  Cc: qemu-block, Kevin Wolf, Stefan Hajnoczi, Hanna Reitz,
	Stefano Garzarella

Hanna discovered an fd leak in the error path, and a few comments to
improve in the code.

Stefano Garzarella (2):
  block/blkio: close the fd when blkio_connect() fails
  block/blkio: add more comments on the fd passing handling

 block/blkio.c | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

-- 
2.41.0



^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/2] block/blkio: close the fd when blkio_connect() fails
  2023-08-01 16:03 [PATCH 0/2] block/blkio: fix fd leak and add more comments for the fd passing Stefano Garzarella
@ 2023-08-01 16:03 ` Stefano Garzarella
  2023-08-02 11:15   ` Hanna Czenczek
  2023-08-01 16:03 ` [PATCH 2/2] block/blkio: add more comments on the fd passing handling Stefano Garzarella
  1 sibling, 1 reply; 6+ messages in thread
From: Stefano Garzarella @ 2023-08-01 16:03 UTC (permalink / raw)
  To: qemu-devel
  Cc: qemu-block, Kevin Wolf, Stefan Hajnoczi, Hanna Reitz,
	Stefano Garzarella

libblkio drivers take ownership of `fd` only after a successful
blkio_connect(), so if it fails, we are still the owners.

Fixes: cad2ccc395 ("block/blkio: use qemu_open() to support fd passing for virtio-blk")
Suggested-by: Hanna Czenczek <hreitz@redhat.com>
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
---
 block/blkio.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/block/blkio.c b/block/blkio.c
index 8e7ce42c79..2d53a865e7 100644
--- a/block/blkio.c
+++ b/block/blkio.c
@@ -739,6 +739,7 @@ static int blkio_virtio_blk_connect(BlockDriverState *bs, QDict *options,
      * directly setting `path`.
      */
     if (fd_supported && ret == -EINVAL) {
+        fd_supported = false;
         qemu_close(fd);
 
         /*
@@ -763,6 +764,14 @@ static int blkio_virtio_blk_connect(BlockDriverState *bs, QDict *options,
     }
 
     if (ret < 0) {
+        if (fd_supported) {
+            /*
+             * libblkio drivers take ownership of `fd` only after a successful
+             * blkio_connect(), so if it fails, we are still the owners.
+             */
+            qemu_close(fd);
+        }
+
         error_setg_errno(errp, -ret, "blkio_connect failed: %s",
                          blkio_get_error_msg());
         return ret;
-- 
2.41.0



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] block/blkio: add more comments on the fd passing handling
  2023-08-01 16:03 [PATCH 0/2] block/blkio: fix fd leak and add more comments for the fd passing Stefano Garzarella
  2023-08-01 16:03 ` [PATCH 1/2] block/blkio: close the fd when blkio_connect() fails Stefano Garzarella
@ 2023-08-01 16:03 ` Stefano Garzarella
  2023-08-02 12:02   ` Hanna Czenczek
  1 sibling, 1 reply; 6+ messages in thread
From: Stefano Garzarella @ 2023-08-01 16:03 UTC (permalink / raw)
  To: qemu-devel
  Cc: qemu-block, Kevin Wolf, Stefan Hajnoczi, Hanna Reitz,
	Stefano Garzarella

As Hanna pointed out, it is not clear in the code why qemu_open()
can fail, and why blkio_set_int("fd") is not enough to discover
the `fd` property support.

Let's fix them by adding more details in the code comments.

Suggested-by: Hanna Czenczek <hreitz@redhat.com>
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
---
 block/blkio.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/block/blkio.c b/block/blkio.c
index 2d53a865e7..848b8189d0 100644
--- a/block/blkio.c
+++ b/block/blkio.c
@@ -713,6 +713,12 @@ static int blkio_virtio_blk_connect(BlockDriverState *bs, QDict *options,
          */
         fd = qemu_open(path, O_RDWR, NULL);
         if (fd < 0) {
+            /*
+             * qemu_open() can fail if the user specifies a path that is not
+             * a file or device, for example in the case of Unix Domain Socket
+             * for the virtio-blk-vhost-user driver. In such cases let's have
+             * libblkio open the path directly.
+             */
             fd_supported = false;
         } else {
             ret = blkio_set_int(s->blkio, "fd", fd);
@@ -734,9 +740,12 @@ static int blkio_virtio_blk_connect(BlockDriverState *bs, QDict *options,
 
     ret = blkio_connect(s->blkio);
     /*
-     * If the libblkio driver doesn't support the `fd` property, blkio_connect()
-     * will fail with -EINVAL. So let's try calling blkio_connect() again by
-     * directly setting `path`.
+     * Before https://gitlab.com/libblkio/libblkio/-/merge_requests/208
+     * (libblkio <= v1.3.0), setting the `fd` property is not enough to check
+     * whether the driver supports the `fd` property or not. In that case,
+     * blkio_connect() will fail with -EINVAL.
+     * So let's try calling blkio_connect() again by directly setting `path`
+     * to cover this scenario.
      */
     if (fd_supported && ret == -EINVAL) {
         fd_supported = false;
-- 
2.41.0



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] block/blkio: close the fd when blkio_connect() fails
  2023-08-01 16:03 ` [PATCH 1/2] block/blkio: close the fd when blkio_connect() fails Stefano Garzarella
@ 2023-08-02 11:15   ` Hanna Czenczek
  2023-08-02 13:58     ` Stefano Garzarella
  0 siblings, 1 reply; 6+ messages in thread
From: Hanna Czenczek @ 2023-08-02 11:15 UTC (permalink / raw)
  To: Stefano Garzarella, qemu-devel; +Cc: qemu-block, Kevin Wolf, Stefan Hajnoczi

On 01.08.23 18:03, Stefano Garzarella wrote:
> libblkio drivers take ownership of `fd` only after a successful
> blkio_connect(), so if it fails, we are still the owners.
>
> Fixes: cad2ccc395 ("block/blkio: use qemu_open() to support fd passing for virtio-blk")
> Suggested-by: Hanna Czenczek <hreitz@redhat.com>
> Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
> ---
>   block/blkio.c | 9 +++++++++
>   1 file changed, 9 insertions(+)

Works, so:

Reviewed-by: Hanna Czenczek <hreitz@redhat.com>


But personally, instead of having `fd_supported` track whether we have a 
valid FD or not, I’d find it more intuitive to track ownership through 
the `fd` variable itself, i.e. initialize it to -1, and set it -1 when 
ownership is transferred, and then close it once we don’t need it 
anymore, but failed to transfer ownership to blkio.  The elaborate way 
would be something like

...
-int fd, ret;
+int fd = -1;
+int ret;
...
  ret = blkio_connect(s->blkio);
+if (!ret) {
+    /* If we had an FD, libblkio now has ownership of it */
+    fd = -1;
+}
+if (fd >= 0) {
+    /* We still have FD ownership, but no longer need it, so close it */
+    qemu_close(fd);
+    fd = -1;
+}
  /*
   * [...]
   */
  if (fd_supported && ret == -EINVAL) {
-    qemu_close(fd);
-
...


Or the shorter less-verbose version would be:

...
-int fd, ret;
+int fd = -1;
+int ret;
...
  ret = blkio_connect(s->blkio);
+if (fd >= 0 && ret < 0) {
+    /* Failed to give the FD to libblkio, close it */
+    qemu_close(fd);
+}
  /*
   * [...]
   */
  if (fd_supported && ret == -EINVAL) {
-    qemu_close(fd);
-
...



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] block/blkio: add more comments on the fd passing handling
  2023-08-01 16:03 ` [PATCH 2/2] block/blkio: add more comments on the fd passing handling Stefano Garzarella
@ 2023-08-02 12:02   ` Hanna Czenczek
  0 siblings, 0 replies; 6+ messages in thread
From: Hanna Czenczek @ 2023-08-02 12:02 UTC (permalink / raw)
  To: Stefano Garzarella, qemu-devel; +Cc: qemu-block, Kevin Wolf, Stefan Hajnoczi

On 01.08.23 18:03, Stefano Garzarella wrote:
> As Hanna pointed out, it is not clear in the code why qemu_open()
> can fail, and why blkio_set_int("fd") is not enough to discover
> the `fd` property support.
>
> Let's fix them by adding more details in the code comments.
>
> Suggested-by: Hanna Czenczek <hreitz@redhat.com>
> Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
> ---
>   block/blkio.c | 15 ++++++++++++---
>   1 file changed, 12 insertions(+), 3 deletions(-)

Thanks!

Reviewed-by: Hanna Czenczek <hreitz@redhat.com>



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] block/blkio: close the fd when blkio_connect() fails
  2023-08-02 11:15   ` Hanna Czenczek
@ 2023-08-02 13:58     ` Stefano Garzarella
  0 siblings, 0 replies; 6+ messages in thread
From: Stefano Garzarella @ 2023-08-02 13:58 UTC (permalink / raw)
  To: Hanna Czenczek; +Cc: qemu-devel, qemu-block, Kevin Wolf, Stefan Hajnoczi

On Wed, Aug 02, 2023 at 01:15:40PM +0200, Hanna Czenczek wrote:
>On 01.08.23 18:03, Stefano Garzarella wrote:
>>libblkio drivers take ownership of `fd` only after a successful
>>blkio_connect(), so if it fails, we are still the owners.
>>
>>Fixes: cad2ccc395 ("block/blkio: use qemu_open() to support fd passing for virtio-blk")
>>Suggested-by: Hanna Czenczek <hreitz@redhat.com>
>>Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
>>---
>>  block/blkio.c | 9 +++++++++
>>  1 file changed, 9 insertions(+)
>
>Works, so:
>
>Reviewed-by: Hanna Czenczek <hreitz@redhat.com>
>
>
>But personally, instead of having `fd_supported` track whether we have 
>a valid FD or not, I’d find it more intuitive to track ownership 
>through the `fd` variable itself, i.e. initialize it to -1, and set it 
>-1 when ownership is transferred, and then close it once we don’t need 
>it anymore, but failed to transfer ownership to blkio.  The elaborate 
>way would be something like
>
>...
>-int fd, ret;
>+int fd = -1;
>+int ret;
>...
> ret = blkio_connect(s->blkio);
>+if (!ret) {
>+    /* If we had an FD, libblkio now has ownership of it */
>+    fd = -1;
>+}
>+if (fd >= 0) {
>+    /* We still have FD ownership, but no longer need it, so close it */
>+    qemu_close(fd);
>+    fd = -1;
>+}
> /*
>  * [...]
>  */
> if (fd_supported && ret == -EINVAL) {
>-    qemu_close(fd);
>-
>...
>
>
>Or the shorter less-verbose version would be:
>
>...
>-int fd, ret;
>+int fd = -1;
>+int ret;
>...
> ret = blkio_connect(s->blkio);
>+if (fd >= 0 && ret < 0) {
>+    /* Failed to give the FD to libblkio, close it */
>+    qemu_close(fd);
>+}

I like this, I'll do it in v2!

Thanks,
Stefano



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-08-02 13:59 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-01 16:03 [PATCH 0/2] block/blkio: fix fd leak and add more comments for the fd passing Stefano Garzarella
2023-08-01 16:03 ` [PATCH 1/2] block/blkio: close the fd when blkio_connect() fails Stefano Garzarella
2023-08-02 11:15   ` Hanna Czenczek
2023-08-02 13:58     ` Stefano Garzarella
2023-08-01 16:03 ` [PATCH 2/2] block/blkio: add more comments on the fd passing handling Stefano Garzarella
2023-08-02 12:02   ` Hanna Czenczek

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