1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "tools/rbd/ArgumentTypes.h"
5 #include "tools/rbd/Shell.h"
6 #include "tools/rbd/Utils.h"
7 #include "common/errno.h"
9 #include <boost/program_options.hpp>
13 namespace object_map
{
15 namespace at
= argument_types
;
16 namespace po
= boost::program_options
;
18 static int do_object_map_rebuild(librbd::Image
&image
, bool no_progress
)
20 utils::ProgressContext
pc("Object Map Rebuild", no_progress
);
21 int r
= image
.rebuild_object_map(pc
);
30 void get_rebuild_arguments(po::options_description
*positional
,
31 po::options_description
*options
) {
32 at::add_image_or_snap_spec_options(positional
, options
,
33 at::ARGUMENT_MODIFIER_NONE
);
34 at::add_no_progress_option(options
);
37 int execute_rebuild(const po::variables_map
&vm
) {
39 std::string pool_name
;
40 std::string image_name
;
41 std::string snap_name
;
42 int r
= utils::get_pool_image_snapshot_names(
43 vm
, at::ARGUMENT_MODIFIER_NONE
, &arg_index
, &pool_name
, &image_name
,
44 &snap_name
, utils::SNAPSHOT_PRESENCE_PERMITTED
,
45 utils::SPEC_VALIDATION_NONE
);
50 librados::Rados rados
;
51 librados::IoCtx io_ctx
;
53 r
= utils::init_and_open_image(pool_name
, image_name
, "", snap_name
, false,
54 &rados
, &io_ctx
, &image
);
59 r
= do_object_map_rebuild(image
, vm
[at::NO_PROGRESS
].as
<bool>());
61 std::cerr
<< "rbd: rebuilding object map failed: " << cpp_strerror(r
)
68 static int do_object_map_check(librbd::Image
&image
, bool no_progress
)
70 utils::ProgressContext
pc("Object Map Check", no_progress
);
71 int r
= image
.check_object_map(pc
);
80 void get_check_arguments(po::options_description
*positional
,
81 po::options_description
*options
) {
82 at::add_image_or_snap_spec_options(positional
, options
,
83 at::ARGUMENT_MODIFIER_NONE
);
84 at::add_no_progress_option(options
);
87 int execute_check(const po::variables_map
&vm
) {
89 std::string pool_name
;
90 std::string image_name
;
91 std::string snap_name
;
92 int r
= utils::get_pool_image_snapshot_names(
93 vm
, at::ARGUMENT_MODIFIER_NONE
, &arg_index
, &pool_name
, &image_name
,
94 &snap_name
, utils::SNAPSHOT_PRESENCE_PERMITTED
,
95 utils::SPEC_VALIDATION_NONE
);
100 librados::Rados rados
;
101 librados::IoCtx io_ctx
;
103 r
= utils::init_and_open_image(pool_name
, image_name
, "", snap_name
, false,
104 &rados
, &io_ctx
, &image
);
109 r
= do_object_map_check(image
, vm
[at::NO_PROGRESS
].as
<bool>());
111 std::cerr
<< "rbd: checking object map failed: " << cpp_strerror(r
)
118 Shell::Action
action_rebuild(
119 {"object-map", "rebuild"}, {}, "Rebuild an invalid object map.", "",
120 &get_rebuild_arguments
, &execute_rebuild
);
121 Shell::Action
action_check(
122 {"object-map", "check"}, {}, "Verify the object map is correct.", "",
123 &get_check_arguments
, &execute_check
);
125 } // namespace object_map
126 } // namespace action