mirror of
https://github.com/systemd/systemd.git
synced 2025-03-29 06:50:16 +03:00
shared/loop-util: spin on open() returning ENOENT too
https://github.com/systemd/systemd/pull/14261#discussion_r355001559
This commit is contained in:
parent
35b9eb0a72
commit
0181314861
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user