On Wed, Jul 31, 2024 at 03:25:24PM +0200, Philipp Reisner wrote: > As with many syscalls, open() might be interrupted by a signal. > > The experienced logfile entry is: > > qemu-system-x86_64: -device > virtio-blk-pci,bus=pci.0,addr=0x7,drive=libvirt-2-format,id=virtio-disk0,bootindex=2,write-cache=on,serial=1b990c4d13b74a4e90ea: > Could not open '/dev/drbd1003': Interrupted system call > > Retry it until it is not interrupted by a signal.
As you say, many syscalls can be interruptted by signals, so special casing open() isn't really a solution - its just addressing one specific instance you happened to see. If there are certain signals that we don't want to have a fatal interruption for, it'd be better to set SA_RESTART with sigaction, which will auto-restart a large set of syscalls, while allowing other signals to be fatal. > FYI, dd has the same kind of loop aroud open(). > https://github.com/coreutils/coreutils/blob/1ae98dbda7322427e8226356fd110d2553f5fac9/src/dd.c#L1294-L1299 > > Signed-off-by: Philipp Reisner <philipp.reis...@linbit.com> > --- > util/osdep.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > diff --git a/util/osdep.c b/util/osdep.c > index 770369831b..a1269d9345 100644 > --- a/util/osdep.c > +++ b/util/osdep.c > @@ -294,14 +294,17 @@ bool qemu_has_direct_io(void) > static int qemu_open_cloexec(const char *name, int flags, mode_t mode) > { > int ret; > + do { > #ifdef O_CLOEXEC > - ret = open(name, flags | O_CLOEXEC, mode); > + ret = open(name, flags | O_CLOEXEC, mode); > #else > - ret = open(name, flags, mode); > - if (ret >= 0) { > - qemu_set_cloexec(ret); > - } > + ret = open(name, flags, mode); > + if (ret >= 0) { > + qemu_set_cloexec(ret); > + } > #endif > + } while (ret == -1 && errno == EINTR); > + > return ret; > } > > -- > 2.45.2 > > With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|