diff options
author | Sage Weil <sage@inktank.com> | 2013-02-18 20:36:56 -0800 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-02-19 08:44:34 -0800 |
commit | 8ca2274cc09c6a9925cbe86ccaf68db7898956e8 (patch) | |
tree | d4b1beee7160808865037d3518f1a423bdd9634d | |
parent | b45f67e0b555e46eef075b1b7f2d7ed015254ad0 (diff) | |
download | ceph-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.cc | 12 |
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; |