Hi,
I'd like to report a problem I ran into, where the kernel sends device
removal uevents immediately followed by spurious device addition
uevents. This happens after removing a loop device using the
LOOP_CTL_REMOVE ioctl on /dev/loop-control.
I can reproduce it with the following program on a vanilla 5.0-rc4
kernel, as well as Fedora's kernel-4.20.4-200.fc29.x86_64.
#include <err.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/loop.h>
#include <unistd.h>
#include <errno.h>
int main(void)
{
const int devnum = 0;
int ctl_fd;
int removed = 0;
ctl_fd = open("/dev/loop-control", O_RDWR);
if (ctl_fd == -1)
err(1, "ctl open");
if (ioctl(ctl_fd, LOOP_CTL_ADD, devnum) == -1)
err(1, "add ioctl");
while (!removed) {
if (ioctl(ctl_fd, LOOP_CTL_REMOVE, devnum) == -1) {
/* Sometimes we get EBUSY here.
* Is that expected? */
if (errno != EBUSY) {
err(1, "ioctl");
}
} else {
removed = 1;
}
}
if (close(ctl_fd) == -1) {
err(1, "close");
}
return 0;
}
If I run it like this:
$ while sudo ./reproducer && ! test -e /dev/loop0; do true; done
then after about a minute the loop terminates without any errors and
/dev/loop0 exists.
Monitoring the uevents sent by the kernel (udevadm monitor --kernel)
reveals that during most of the executions of the program, the following
uevents get sent:
KERNEL[99.624241] add /devices/virtual/bdi/7:0 (bdi)
KERNEL[99.624392] add /devices/virtual/block/loop0 (block)
KERNEL[99.624779] remove /devices/virtual/bdi/7:0 (bdi)
KERNEL[99.624845] remove /devices/virtual/block/loop0 (block)
However, sometimes the removal uevents are followed by spurious device
addition uevents:
KERNEL[153.723097] add /devices/virtual/bdi/7:0 (bdi)
KERNEL[153.723172] add /devices/virtual/block/loop0 (block)
KERNEL[153.723406] remove /devices/virtual/bdi/7:0 (bdi)
KERNEL[153.724265] remove /devices/virtual/block/loop0 (block)
KERNEL[153.746690] add /devices/virtual/bdi/7:0 (bdi)
KERNEL[153.746931] add /devices/virtual/block/loop0 (block)
This results in /dev/loop0 being readded by udev.
I can reproduce the problem more easily if I actually bind an image file
to the loop device, e.g. like this (the referenced file.img is just
filled with zeros):
https://paste.fedoraproject.org/paste/o6jqJV8pBiTEk8lXIMcX-g
Have you seen this?
Thanks!
Best regards
Ondřej Lysoněk