udev runs blkid on device close, and other such nonsense that can
make unmap fail with EBUSY. Settle before we unmap to avoid this if
possible. See #4183.
Closes: #4186
Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Alex Elder <elder@inktank.com>
if (r < 0)
return r;
+ // let udevadm do its job *before* we try to unmap
+ if (udevadm_settle) {
+ r = system("/sbin/udevadm settle");
+ if (r) {
+ if (r < 0)
+ cerr << "rbd: error executing udevadm as shell command!" << std::endl;
+ else
+ cerr << "rbd: '/sbin/udevadm settle' failed! (" << r << ")" <<std::endl;
+ // ignore the error, though.
+ }
+ }
+
int fd = open("/sys/bus/rbd/remove", O_WRONLY);
if (fd < 0) {
return -errno;