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