diff --git a/doc/man/8/rbd.rst b/doc/man/8/rbd.rst index 7c61d0a5dd7..b5d4e3d1ce6 100644 --- a/doc/man/8/rbd.rst +++ b/doc/man/8/rbd.rst @@ -255,7 +255,7 @@ Commands Show the rbd images that are mapped via the rbd kernel module (default) or other supported device. -:command:`device map` [-t | --device-type *device-type*] [--read-only] [--exclusive] [-o | --options *device-options*] *image-spec* | *snap-spec* +:command:`device map` [-t | --device-type *device-type*] [--show-cookie] [--read-only] [--exclusive] [-o | --options *device-options*] *image-spec* | *snap-spec* Map the specified image to a block device via the rbd kernel module (default) or other supported device (*nbd* on Linux or *ggate* on FreeBSD). @@ -270,7 +270,7 @@ Commands The --options argument is a comma separated list of device type specific options (opt1,opt2=val,...). -:command:`device attach` [-t | --device-type *device-type*] --device *device-path* [--read-only] [--exclusive] [--force] [-o | --options *device-options*] *image-spec* | *snap-spec* +:command:`device attach` [-t | --device-type *device-type*] --device *device-path* [--cookie *device-cookie*] [--read-only] [--exclusive] [--force] [-o | --options *device-options*] *image-spec* | *snap-spec* Attach the specified image to the specified block device (currently only `nbd` on Linux). This operation is unsafe and should not be normally used. In particular, specifying the wrong image or the wrong block device may diff --git a/src/test/cli/rbd/help.t b/src/test/cli/rbd/help.t index 22362eb806a..7f3622b4fa0 100644 --- a/src/test/cli/rbd/help.t +++ b/src/test/cli/rbd/help.t @@ -576,8 +576,8 @@ rbd help device attach usage: rbd device attach [--device-type ] [--pool ] [--namespace ] [--image ] - [--snap ] --device [--read-only] - [--force] [--exclusive] [--quiesce] + [--snap ] --device [--cookie ] + [--read-only] [--force] [--exclusive] [--quiesce] [--quiesce-hook ] [--options ] @@ -596,6 +596,7 @@ --image arg image name --snap arg snapshot name --device arg specify device path + --cookie arg specify device cookie --read-only attach read-only --force force attach --exclusive disable automatic exclusive lock transitions @@ -637,7 +638,8 @@ rbd help device map usage: rbd device map [--device-type ] [--pool ] [--namespace ] [--image ] - [--snap ] [--read-only] [--exclusive] [--quiesce] + [--snap ] [--show-cookie] [--read-only] + [--exclusive] [--quiesce] [--quiesce-hook ] [--options ] @@ -655,6 +657,7 @@ --namespace arg namespace name --image arg image name --snap arg snapshot name + --show-cookie show device cookie --read-only map read-only --exclusive disable automatic exclusive lock transitions --quiesce use quiesce hooks diff --git a/src/tools/rbd/action/Device.cc b/src/tools/rbd/action/Device.cc index a9903cfa78c..35021344955 100644 --- a/src/tools/rbd/action/Device.cc +++ b/src/tools/rbd/action/Device.cc @@ -175,6 +175,7 @@ void get_map_arguments(po::options_description *positional, at::add_image_or_snap_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE); options->add_options() + ("show-cookie", po::bool_switch(), "show device cookie") ("read-only", po::bool_switch(), "map read-only") ("exclusive", po::bool_switch(), "disable automatic exclusive lock transitions") ("quiesce", po::bool_switch(), "use quiesce hooks") @@ -212,6 +213,7 @@ void get_attach_arguments(po::options_description *positional, at::ARGUMENT_MODIFIER_NONE); options->add_options() ("device", po::value()->required(), "specify device path") + ("cookie", po::value(), "specify device cookie") ("read-only", po::bool_switch(), "attach read-only") ("force", po::bool_switch(), "force attach") ("exclusive", po::bool_switch(), "disable automatic exclusive lock transitions") diff --git a/src/tools/rbd/action/Nbd.cc b/src/tools/rbd/action/Nbd.cc index 117a2592dd1..fe9a737f960 100644 --- a/src/tools/rbd/action/Nbd.cc +++ b/src/tools/rbd/action/Nbd.cc @@ -163,10 +163,13 @@ int execute_attach(const po::variables_map &vm, return -EINVAL; } - if (!vm["force"].as()) { + if (vm.count("cookie")) { + args.push_back("--cookie"); + args.push_back(vm["cookie"].as()); + } else if (!vm["force"].as()) { std::cerr << "rbd: could not validate attach request\n"; std::cerr << "rbd: mismatching the image and the device may lead to data corruption\n"; - std::cerr << "rbd: must specify --force to proceed" << std::endl; + std::cerr << "rbd: must specify --cookie or --force to proceed" << std::endl; return -EINVAL; } @@ -259,6 +262,10 @@ int execute_map(const po::variables_map &vm, args.push_back("--quiesce"); } + if (vm["show-cookie"].as()) { + args.push_back("--show-cookie"); + } + if (vm["read-only"].as()) { args.push_back("--read-only"); }