[libvirt RFCv4 04/20] runio: add arguments to extend use beyond just stdin and stdout

Claudio Fontana cfontana at suse.de
Thu Apr 28 16:40:16 UTC 2022


On 4/28/22 6:26 PM, Daniel P. Berrangé wrote:
> On Thu, Apr 28, 2022 at 06:24:11PM +0200, Claudio Fontana wrote:
>> On 4/28/22 2:54 PM, Daniel P. Berrangé wrote:
>>> On Wed, Apr 27, 2022 at 11:13:23PM +0200, Claudio Fontana wrote:
>>>> add arguments to runio to allow read/write from/to arbitrary
>>>> file descriptors, as opposed to just stdin and stdout.
>>>>
>>>> Signed-off-by: Claudio Fontana <cfontana at suse.de>
>>>> ---
>>>>  src/util/iohelper.c |  2 +-
>>>>  src/util/runio.c    | 10 +++++-----
>>>>  src/util/runio.h    | 17 ++++++++++++++++-
>>>>  3 files changed, 22 insertions(+), 7 deletions(-)
>>>>
>>>> diff --git a/src/util/iohelper.c b/src/util/iohelper.c
>>>> index 5a0098542e..93674c1e2f 100644
>>>> --- a/src/util/iohelper.c
>>>> +++ b/src/util/iohelper.c
>>>> @@ -96,7 +96,7 @@ main(int argc, char **argv)
>>>>          usage(EXIT_FAILURE);
>>>>      }
>>>>  
>>>> -    if (fd < 0 || runIO(path, fd, oflags) < 0)
>>>> +    if (fd < 0 || runIO(path, fd, oflags, STDIN_FILENO, STDOUT_FILENO) < 0)
>>>>          goto error;
>>>>  
>>>>      return 0;
>>>> diff --git a/src/util/runio.c b/src/util/runio.c
>>>> index a7b902af7e..f42acddae9 100644
>>>> --- a/src/util/runio.c
>>>> +++ b/src/util/runio.c
>>>> @@ -134,7 +134,7 @@ runIOCopy(const struct runIOParams p)
>>>>  
>>>>  
>>>>  off_t
>>>> -runIO(const char *path, int fd, int oflags)
>>>> +runIO(const char *path, int fd, int oflags, int in_fd, int out_fd)
>>>
>>> This is getting rather wierd as a signature.
>>>
>>> If O_RDONLY, then in_fd is ignored, 'fd' is input.
>>>
>>> If O_WRONLY, then out_fd is ignored, 'fd' is output
>>>
>>> What about instead simply :
>>>
>>>    runIO(const char *srcpath, int srcfd,
>>>          const char *dstpath, int dstfd)
>>>
>>> so there's no read vs write distinction at all.
>>
>> maybe I am a bit confused/tired, but I don't see how this would work,
>> which side one of those is the disk, where we want to check for S_ISBLK and O_DIRECT, and buffer accordingly?
> 
> We call fstat on the FD, we'll know which FD is a pipe/socket vs
> which FD is a file/blockdev.  If we call fcntl(GET_FL) we can also
> discover if O_DIRECT is turned on or not.
> 

Probably I am indeed tired :-)

I cannot figure out how to call runIO() following your idea in iohelper.c. Can you show me?

Because we'd need to first use fcntl(fd, F_GETFL) in iohelper to figure out if the disk is actually being read or written to,
to then then pass the parameters to runIO in the right order in terms of source vs destination,

and then inside runIO run fcntl(fd, F_GETFL) again to figure out which of the two sides is actually the disk, to check for S_ISBLK, O_DIRECT.

It seems quite convoluted to me.. but maybe I am not seeing something simple (and in that case time for me to get some rest indeed).

Ciao,

Claudio




More information about the libvir-list mailing list