shared/loop-util: spin on open() returning ENOENT too

https://github.com/systemd/systemd/pull/14261#discussion_r355001559
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2019-12-15 20:58:59 +01:00
parent 35b9eb0a72
commit 0181314861
1 changed files with 13 additions and 7 deletions

View File

@ -112,14 +112,20 @@ int loop_device_make_full(
return -ENOMEM;
loop = open(loopdev, O_CLOEXEC|O_NONBLOCK|O_NOCTTY|open_flags);
if (loop < 0)
return -errno;
if (ioctl(loop, LOOP_SET_FD, fd) >= 0) {
loop_with_fd = TAKE_FD(loop);
break;
if (loop < 0) {
/* Somebody might've gotten the same number from the kernel, used the device,
* and called LOOP_CTL_REMOVE on it. Let's retry with a new number. */
if (errno != ENOENT)
return -errno;
} else {
if (ioctl(loop, LOOP_SET_FD, fd) >= 0) {
loop_with_fd = TAKE_FD(loop);
break;
}
if (errno != EBUSY)
return -errno;
}
if (errno != EBUSY)
return -errno;
if (++n_attempts >= 64) /* Give up eventually */
return -EBUSY;