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>
15 namespace at
= argument_types
;
16 namespace po
= boost::program_options
;
18 static int do_resize(librbd::Image
& image
, uint64_t size
, bool allow_shrink
, bool no_progress
)
20 utils::ProgressContext
pc("Resizing image", no_progress
);
21 int r
= image
.resize2(size
, allow_shrink
, pc
);
30 void get_arguments(po::options_description
*positional
,
31 po::options_description
*options
) {
32 at::add_image_spec_options(positional
, options
, at::ARGUMENT_MODIFIER_NONE
);
33 at::add_size_option(options
);
34 options
->add_options()
35 ("allow-shrink", po::bool_switch(), "permit shrinking");
36 at::add_no_progress_option(options
);
37 at::add_encryption_options(options
);
40 int execute(const po::variables_map
&vm
,
41 const std::vector
<std::string
> &ceph_global_init_args
) {
43 std::string pool_name
;
44 std::string namespace_name
;
45 std::string image_name
;
46 std::string snap_name
;
47 int r
= utils::get_pool_image_snapshot_names(
48 vm
, at::ARGUMENT_MODIFIER_NONE
, &arg_index
, &pool_name
, &namespace_name
,
49 &image_name
, &snap_name
, true, utils::SNAPSHOT_PRESENCE_NONE
,
50 utils::SPEC_VALIDATION_NONE
);
56 r
= utils::get_image_size(vm
, &size
);
61 utils::EncryptionOptions encryption_options
;
62 r
= utils::get_encryption_options(vm
, &encryption_options
);
67 librados::Rados rados
;
68 librados::IoCtx io_ctx
;
70 r
= utils::init_and_open_image(pool_name
, namespace_name
, image_name
, "",
71 snap_name
, false, &rados
, &io_ctx
, &image
);
76 if (!encryption_options
.specs
.empty()) {
77 r
= image
.encryption_load2(encryption_options
.specs
.data(),
78 encryption_options
.specs
.size());
80 std::cerr
<< "rbd: encryption load failed: " << cpp_strerror(r
)
86 librbd::image_info_t info
;
87 r
= image
.stat(info
, sizeof(info
));
89 std::cerr
<< "rbd: resize error: " << cpp_strerror(r
) << std::endl
;
93 if (info
.size
== size
) {
94 std::cerr
<< "rbd: new size is equal to original size " << std::endl
;
98 if (info
.size
> size
&& !vm
["allow-shrink"].as
<bool>()) {
101 r
= do_resize(image
, size
, vm
["allow-shrink"].as
<bool>(), vm
[at::NO_PROGRESS
].as
<bool>());
105 if (r
== -EINVAL
&& !vm
["allow-shrink"].as
<bool>()) {
106 std::cerr
<< "rbd: shrinking an image is only allowed with the "
107 << "--allow-shrink flag" << std::endl
;
110 std::cerr
<< "rbd: resize error: " << cpp_strerror(r
) << std::endl
;
116 Shell::SwitchArguments
switched_arguments({"allow-shrink"});
117 Shell::Action
action(
118 {"resize"}, {}, "Resize (expand or shrink) image.", "", &get_arguments
,
121 } // namespace resize
122 } // namespace action