summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-02-18 20:36:56 -0800
committerSage Weil <sage@inktank.com>2013-02-19 08:44:34 -0800
commit8ca2274cc09c6a9925cbe86ccaf68db7898956e8 (patch)
treed4b1beee7160808865037d3518f1a423bdd9634d
parentb45f67e0b555e46eef075b1b7f2d7ed015254ad0 (diff)
downloadceph-8ca2274cc09c6a9925cbe86ccaf68db7898956e8.tar.gz
rbd: udevadm settle before unmap
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>
-rw-r--r--src/rbd.cc12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/rbd.cc b/src/rbd.cc
index d4b2d8b9118..02a793bf64b 100644
--- a/src/rbd.cc
+++ b/src/rbd.cc
@@ -1664,6 +1664,18 @@ static int do_kernel_rm(const char *dev)
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;