yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone

Blame SOURCES/kvm-file-posix-fix-max_iov-for-dev-sg-devices.patch

a83cc2
From 0111d01afe82c46656a40269bf21eb7702c02a09 Mon Sep 17 00:00:00 2001
a83cc2
From: Paolo Bonzini <pbonzini@redhat.com>
a83cc2
Date: Fri, 16 Jul 2021 16:51:29 -0400
a83cc2
Subject: [PATCH 13/43] file-posix: fix max_iov for /dev/sg devices
a83cc2
a83cc2
RH-Author: Miroslav Rezanina <mrezanin@redhat.com>
a83cc2
RH-Bugzilla: 1957194
a83cc2
a83cc2
Even though it was only called for devices that have bs->sg set (which
a83cc2
must be character devices), sg_get_max_segments looked at /sys/dev/block
a83cc2
which only works for block devices.
a83cc2
a83cc2
On Linux the sg driver has its own way to provide the maximum number of
a83cc2
iovecs in a scatter/gather list, so add support for it.  The block device
a83cc2
path is kept because it will be reinstated in the next patches.
a83cc2
a83cc2
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
a83cc2
Reviewed-by: Max Reitz <mreitz@redhat.com>
a83cc2
(cherry picked from commit 8ad5ab6148dca8aad297c134c09c84b0b92d45ed)
a83cc2
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
a83cc2
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
a83cc2
---
a83cc2
 block/file-posix.c | 11 +++++++++++
a83cc2
 1 file changed, 11 insertions(+)
a83cc2
a83cc2
diff --git a/block/file-posix.c b/block/file-posix.c
a83cc2
index 20e14f8e96..74d4903dc1 100644
a83cc2
--- a/block/file-posix.c
a83cc2
+++ b/block/file-posix.c
a83cc2
@@ -1204,6 +1204,17 @@ static int sg_get_max_segments(int fd)
a83cc2
         goto out;
a83cc2
     }
a83cc2
 
a83cc2
+    if (S_ISCHR(st.st_mode)) {
a83cc2
+        if (ioctl(fd, SG_GET_SG_TABLESIZE, &ret) == 0) {
a83cc2
+            return ret;
a83cc2
+        }
a83cc2
+        return -ENOTSUP;
a83cc2
+    }
a83cc2
+
a83cc2
+    if (!S_ISBLK(st.st_mode)) {
a83cc2
+        return -ENOTSUP;
a83cc2
+    }
a83cc2
+
a83cc2
     sysfspath = g_strdup_printf("/sys/dev/block/%u:%u/queue/max_segments",
a83cc2
                                 major(st.st_rdev), minor(st.st_rdev));
a83cc2
     sysfd = open(sysfspath, O_RDONLY);
a83cc2
-- 
a83cc2
2.27.0
a83cc2