On Tue, Jun 08, 2021 at 03:16:28PM +0200, Paolo Bonzini wrote: > Even though it was only called for devices that have bs->sg set (which > must be character devices), sg_get_max_segments looked at /sys/dev/block > which only works for block devices. > > On Linux the sg driver has its own way to provide the maximum number of > iovecs in a scatter/gather list, so add support for it. The block device > path is kept because it will be reinstated in the next patches. > > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > block/file-posix.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/block/file-posix.c b/block/file-posix.c > index f37dfc10b3..536998a1d6 100644 > --- a/block/file-posix.c > +++ b/block/file-posix.c > @@ -1180,6 +1180,17 @@ static int sg_get_max_segments(int fd) > goto out; > } > > + if (S_ISCHR(st.st_mode)) { > + if (ioctl(fd, SG_GET_SG_TABLESIZE, &ret) == 0) {
Do we need to do any conditional compilation based on whether SG_GET_SG_TABLESIZE is a known ioctl, or is it old enough to be assumed present on all platforms we care about? > + return ret; > + } > + return -ENOTSUP; > + } > + > + if (!S_ISBLK(st.st_mode)) { > + return -ENOTSUP; > + } > + > sysfspath = g_strdup_printf("/sys/dev/block/%u:%u/queue/max_segments", > major(st.st_rdev), minor(st.st_rdev)); > sysfd = open(sysfspath, O_RDONLY); Otherwise looks good to me. -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org