From: John Spray Date: Tue, 15 Mar 2016 14:58:27 +0000 (+0000) Subject: tools/cephfs: fix tmap_upgrade X-Git-Tag: v10.1.0~62^2~2^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=c287d79f68e212c77d5a6a3dc21695546abeccc0;p=ceph.git tools/cephfs: fix tmap_upgrade Move it up to handle the command before we try and initialize DataScan::driver, because drivers require a target filesystem, and that doesn't apply to this command. Fixes: #15135 Signed-off-by: John Spray --- diff --git a/src/tools/cephfs/DataScan.cc b/src/tools/cephfs/DataScan.cc index bf123a905fb47..d2d22be36046e 100644 --- a/src/tools/cephfs/DataScan.cc +++ b/src/tools/cephfs/DataScan.cc @@ -177,6 +177,38 @@ int DataScan::main(const std::vector &args) return -EINVAL; } + if (command == "tmap_upgrade") { + // Special case tmap_upgrade away from other modes, as this is a + // specialized command that will only exist in the Jewel series, + // and doesn't require the initialization of the `driver` member + // that is done below. + rados.connect(); + + // Initialize metadata_io from pool on command line + if (metadata_pool_name.empty()) { + std::cerr << "Metadata pool not specified" << std::endl; + usage(); + return -EINVAL; + } + + long metadata_pool_id = rados.pool_lookup(metadata_pool_name.c_str()); + if (metadata_pool_id < 0) { + std::cerr << "Pool '" << metadata_pool_name << "' not found!" << std::endl; + return -ENOENT; + } else { + dout(4) << "pool '" << metadata_pool_name + << "' has ID " << metadata_pool_id << dendl; + } + + r = rados.ioctx_create(metadata_pool_name.c_str(), metadata_io); + if (r != 0) { + return r; + } + std::cerr << "Created ioctx for " << metadata_pool_name << std::endl; + + return tmap_upgrade(); + } + // If caller didn't specify a namespace, try to pick // one if only one exists if (fscid == FS_CLUSTER_ID_NONE) { @@ -263,30 +295,6 @@ int DataScan::main(const std::vector &args) } } - // Initialize metadata_io from pool on command line for tmap_upgrade - if (command == "tmap_upgrade") { - if (metadata_pool_name.empty()) { - std::cerr << "Metadata pool not specified" << std::endl; - usage(); - return -EINVAL; - } - - long metadata_pool_id = rados.pool_lookup(metadata_pool_name.c_str()); - if (metadata_pool_id < 0) { - std::cerr << "Pool '" << metadata_pool_name << "' not found!" << std::endl; - return -ENOENT; - } else { - dout(4) << "pool '" << metadata_pool_name - << "' has ID " << metadata_pool_id << dendl; - } - - r = rados.ioctx_create(metadata_pool_name.c_str(), metadata_io); - if (r != 0) { - return r; - } - std::cerr << "Created ioctx for " << metadata_pool_name << std::endl; - } - // Finally, dispatch command if (command == "scan_inodes") { return scan_inodes(); @@ -294,8 +302,6 @@ int DataScan::main(const std::vector &args) return scan_extents(); } else if (command == "scan_frags") { return scan_frags(); - } else if (command == "tmap_upgrade") { - return tmap_upgrade(); } else if (command == "init") { return driver->init_roots(fs->mds_map.get_first_data_pool()); } else {