]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | ||
4 | #include "librbd/object_map/Request.h" | |
5 | #include "common/dout.h" | |
6 | #include "common/errno.h" | |
7 | #include "common/RWLock.h" | |
8 | #include "librbd/ImageCtx.h" | |
9 | #include "librbd/object_map/InvalidateRequest.h" | |
10 | ||
11 | #define dout_subsys ceph_subsys_rbd | |
12 | #undef dout_prefix | |
13 | #define dout_prefix *_dout << "librbd::object_map::Request: " | |
14 | ||
15 | namespace librbd { | |
16 | namespace object_map { | |
17 | ||
18 | bool Request::should_complete(int r) { | |
19 | CephContext *cct = m_image_ctx.cct; | |
20 | ldout(cct, 20) << this << " should_complete: r=" << r << dendl; | |
21 | ||
22 | switch (m_state) | |
23 | { | |
24 | case STATE_REQUEST: | |
25 | if (r < 0) { | |
26 | lderr(cct) << "failed to update object map: " << cpp_strerror(r) | |
27 | << dendl; | |
28 | return invalidate(); | |
29 | } | |
30 | ||
31 | finish_request(); | |
32 | return true; | |
33 | ||
34 | case STATE_INVALIDATE: | |
35 | ldout(cct, 20) << "INVALIDATE" << dendl; | |
36 | if (r < 0) { | |
37 | lderr(cct) << "failed to invalidate object map: " << cpp_strerror(r) | |
38 | << dendl; | |
39 | } | |
40 | return true; | |
41 | ||
42 | default: | |
43 | lderr(cct) << "invalid state: " << m_state << dendl; | |
11fdf7f2 | 44 | ceph_abort(); |
7c673cae FG |
45 | break; |
46 | } | |
47 | return false; | |
48 | } | |
49 | ||
50 | bool Request::invalidate() { | |
31f18b77 | 51 | bool flags_set; |
91327a77 AA |
52 | int r = m_image_ctx.test_flags(m_snap_id, RBD_FLAG_OBJECT_MAP_INVALID, |
53 | &flags_set); | |
31f18b77 | 54 | if (r == 0 && flags_set) { |
7c673cae FG |
55 | return true; |
56 | } | |
57 | ||
58 | m_state = STATE_INVALIDATE; | |
59 | ||
9f95a23c TL |
60 | std::shared_lock owner_locker{m_image_ctx.owner_lock}; |
61 | std::unique_lock image_locker{m_image_ctx.image_lock}; | |
7c673cae FG |
62 | InvalidateRequest<> *req = new InvalidateRequest<>(m_image_ctx, m_snap_id, |
63 | true, | |
64 | create_callback_context()); | |
65 | req->send(); | |
66 | return false; | |
67 | } | |
68 | ||
69 | } // namespace object_map | |
70 | } // namespace librbd |