loop-device: implicitly sync device on detach

Apparently, if IO is still in flight at the moment we invoke LOOP_CLR_FD
it is likely simply dropped (probably because yanking physical storage,
such as a USB stick would drop it too). Let's protect ourselves against
that and always sync explicitly before we invoke it.
This commit is contained in:
Lennart Poettering 2020-07-30 18:42:13 +02:00 committed by Zbigniew Jędrzejewski-Szmek
parent 3660da17b0
commit cae1e8fb88
1 changed files with 5 additions and 1 deletions

View File

@ -191,6 +191,10 @@ LoopDevice* loop_device_unref(LoopDevice *d) {
return NULL;
if (d->fd >= 0) {
/* Implicitly sync the device, since otherwise in-flight blocks might not get written */
if (fsync(d->fd) < 0)
log_debug_errno(errno, "Failed to sync loop block device, ignoring: %m");
if (d->nr >= 0 && !d->relinquished) {
if (ioctl(d->fd, LOOP_CLR_FD) < 0)
log_debug_errno(errno, "Failed to clear loop device: %m");
@ -216,7 +220,7 @@ LoopDevice* loop_device_unref(LoopDevice *d) {
log_warning_errno(errno, "Failed to remove device %s: %m", strna(d->node));
break;
}
usleep(50 * USEC_PER_MSEC);
(void) usleep(50 * USEC_PER_MSEC);
}
}