mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-23 17:34:00 +03:00
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:
parent
3660da17b0
commit
cae1e8fb88
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user